Xin các anh chị giúp đỡ Code Gán các giá trị của một Range là các phần tử của Mãng
Ví dụ: Tôi có các giá trị của Range("A1:A10"). Tôi muốn viết code để gán giá trị của các cells từ A1:A10 là các phần tử của Mãng Arr chẳn hạn.
Xin cảm ơn các anh chị
Nếu mảng đọc từ range, thì số nó chỉ có mấy dạng là: double, boolean, date. Dùng hàm vartype kiểm tra lần lượt. Còn là string chứa các con số thì cũng dùng vartype kiểm tra xem nó là string không, rồi dùng hàm isnumber nữa.
cái này cũng khó nói lắm, có thể có 2 vấn đề
thứ nhất là bạn đang chạy chương trình khác, máy chiếm dụng bộ nhớ tạm nhiều quá , nên có khả năng nó thông báo là tràn bộ nhớ
thứ 2 là có thể ở cột 98 trong sheet có chứa giá trị lỗi. Lỗi này tôi thường xuyên bị
cái này cũng khó nói lắm, có thể có 2 vấn đề
thứ nhất là bạn đang chạy chương trình khác, máy chiếm dụng bộ nhớ tạm nhiều quá , nên có khả năng nó thông báo là tràn bộ nhớ
thứ 2 là có thể ở cột 98 trong sheet có chứa giá trị lỗi. Lỗi này tôi thường xuyên bị
Hôm Mình có đọc đâu đó trên GPE nói giới hạn của hàm Application.Transpose tối đa của nó là bao nhiêu ký tự trong 1 Cells ...gì gì đó mà mình không nhớ !!?? và tối đa của nó là bao nhiêu dòng ....
vì mình có sử dụng biến Arr() trong Excel để lấy duy nhất mã hàng trong table Access hiên tại dữ liệu ít thấy xài tốt VD: dữ liệu dòng (Record trong Access) lớn hơn 1048576 thì nó có lỗi hay không ...??!!!!
Mong các Bạn ai biết xin giải thích dùm ....
Xin cảm ơn
Hôm Mình có đọc đâu đó trên GPE nói giới hạn của hàm Application.Transpose tối đa của nó là bao nhiêu ký tự trong 1 Cells ...gì gì đó mà mình không nhớ !!?? và tối đa của nó là bao nhiêu dòng ....
vì mình có sử dụng biến Arr() trong Excel để lấy duy nhất mã hàng trong table Access hiên tại dữ liệu ít thấy xài tốt VD: dữ liệu dòng (Record trong Access) lớn hơn 1048576 thì nó có lỗi hay không ...??!!!!
Mong các Bạn ai biết xin giải thích dùm ....
Xin cảm ơn
có đó anh kiều mạnh, nó sẽ xuất hiện lỗi tràn bộ nhớ, vì tôi hay làm việc với số liệu lớn, máy khách hàng thì không sao? chứ đem về máy tôi, nếu mảng quá lớn thì sẽ báo lỗi.
chưa tính đến là nó chạy cà dựt, lúc báo lỗi lúc không? nếu chạy nhiều cái khác cùng một lúc, nó sẽ báo là tràn bộ nhớ nếu máy cấu hình không mạnh
có đó anh kiều mạnh, nó sẽ xuất hiện lỗi tràn bộ nhớ, vì tôi hay làm việc với số liệu lớn, máy khách hàng thì không sao?(vì khách hàng máy rất cừ) chứ đem về máy tôi, nếu mảng quá lớn thì sẽ báo lỗi.
Hôm Mình có đọc đâu đó trên GPE nói giới hạn của hàm Application.Transpose tối đa của nó là bao nhiêu ký tự trong 1 Cells ...gì gì đó mà mình không nhớ !!?? và tối đa của nó là bao nhiêu dòng ....
vì mình có sử dụng biến Arr() trong Excel để lấy duy nhất mã hàng trong table Access hiên tại dữ liệu ít thấy xài tốt VD: dữ liệu dòng (Record trong Access) lớn hơn 1048576 thì nó có lỗi hay không ...??!!!!
Mong các Bạn ai biết xin giải thích dùm ....
Xin cảm ơn
Sub vidu1()
'Lân 1: Nhâp vao [A1]=REPT("1",255) rôi F5
'Lân 2: Nhâp vao [A1]=REPT("1",256) rôi F5
Dim a, t
a = Sheet1.Range("A1:A2").Value
t = Application.Transpose(a)
End Sub
'-------'
Sub Vidu2()
Dim maxLong As Long
maxLong = (2) ^ 31 'Lân 1
'maxLong = (2) ^ 31 - 1 'Lân 2 : Đây là giá trị max nhưng chạy được hay không thì còn phụ thuộc bộ nhớ RAM của hệ thống (xem link)
ReDim a(1 To maxLong, 0)
End Sub
Sub vidu1()
'Lân 1: Nhâp vao [A1]=REPT("1",255) rôi F5
'Lân 2: Nhâp vao [A1]=REPT("1",256) rôi F5
Dim a, t
a = Sheet1.Range("A1:A2").Value
t = Application.Transpose(a)
End Sub
'-------'
Sub Vidu2()
Dim maxLong As Long
maxLong = (2) ^ 31 'Lân 1
'maxLong = (2) ^ 31 - 1 'Lân 2 : Đây là giá trị max nhưng chạy được hay không thì còn phụ thuộc bộ nhớ RAM của hệ thống (xem link)
ReDim a(1 To maxLong, 0)
End Sub
Mới thử maxLong = (2) ^ 23 - 1 => OK .......... vậy là nó phụ thuộc vào RAM
cách tính (2) ^ 23 chi tiết nó ra như thế nào chưa hiểu lắm ....???!!! Bạn biết giải thích dùm
Mới thử maxLong = (2) ^ 23 - 1 => OK .......... vậy là nó phụ thuộc vào RAM
cách tính (2) ^ 23 chi tiết nó ra như thế nào chưa hiểu lắm ....???!!! Bạn biết giải thích dùm
Mới thử maxLong = (2) ^ 23 - 1 => OK .......... vậy là nó phụ thuộc vào RAM
cách tính (2) ^ 23 chi tiết nó ra như thế nào chưa hiểu lắm ....???!!! Bạn biết giải thích dùm
Mới thử maxLong = (2) ^ 23 - 1 => OK .......... vậy là nó phụ thuộc vào RAM
cách tính (2) ^ 23 chi tiết nó ra như thế nào chưa hiểu lắm ....???!!! Bạn biết giải thích dùm
Ví dụ #850 dùng mảng Variant cho nên khó xác định kích cỡ. Nếu chưa chứa gì thì có lẽ mỗi phần tử của mảng Variant dài 4 bytes
vậy là mảng này cần 1 khoảng 4*2^23 bytes LIÊN TỤC trong bộ nhớ (lên 2^24 có nghĩa là gấp đôi lên). Vì windows quản lý bộ nhớ dở nên bị giới hạn. OS xịn có thể dùng bộ nhớ ảo ngay cả cho mảng.
Ở đây có ngừoi rành cái này hơn tôi. Nếu ngừoi ấy rảnh sẽ trả lời rõ hơn.
Ví dụ #850 dùng mảng Variant cho nên khó xác định kích cỡ. Nếu chưa chứa gì thì có lẽ mỗi phần tử của mảng Variant dài 4 bytes
vậy là mảng này cần 1 khoảng 4*2^23 bytes LIÊN TỤC trong bộ nhớ (lên 2^24 có nghĩa là gấp đôi lên). Vì windows quản lý bộ nhớ dở nên bị giới hạn. OS xịn có thể dùng bộ nhớ ảo ngay cả cho mảng.
Ở đây có ngừoi rành cái này hơn tôi. Nếu ngừoi ấy rảnh sẽ trả lời rõ hơn.
Nếu nói về bộ nhớ thì vd. ta có 6 GB RAM. Nhưng sau khi nạp system và các ct khác thì còn bao nhiêu? Vd. còn A GB. Nhưng đâu phải là còn A GB thì có thể dùng mảng có độ lớn A GB? Thế không gian làm việc thì lấy ở đâu?
thì ở đâu đó memory manager sẽ "phân" 16 bai để dùng cho biến a. Chỉ khai báo thôi memory manager sẽ "phân" 16 bai dùng cho a.
Trong 8 bai đầu (thực ra là 2 bai đầu. Nếu tôi không lầm thì 6 bai kia là Reserved) được ghi VarType. Trong 8 bai sau được ghi data. Tức nếu biến là numeric (<= 8 bai) thì giá trị trong 8 bai thứ 2 chính là giá trị numeric. Tất nhiên compilator biết là cần lấy mấy bai từ 8 bai kia). Nếu hiện thời biến chứa Object thì trong 8 bai sau ta có Pointer (4 bai) tới Object nằm ở nơi khác trong bộ nhớ. Nếu hiện thời biến chứa String thì trong 8 bai sau ta có Pointer (4 bai) tới String được ghi ở chỗ khác trong bộ nhớ (thì trong 8 bai làm sao ghi được String với độ dài bất kỳ)
Vân vân và vân vân. Mỗi người tự nghiên cứu.
Để hiểu thêm thì chạy code
Mã:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)
Sub test()
Dim a, vartypefrommemory As Integer, b As Long, c As Double, m() As Byte, s As String
a = 1000
CopyMemory vartypefrommemory, ByVal VarPtr(a), 2
Debug.Print "a = " & a & ", VarTypeFromMemory: " & vartypefrommemory & ", VarType: " & VarType(a)
CopyMemory b, ByVal VarPtr(a) + 8, 4
Debug.Print "Gia tri tu memory a = " & b
a = 1234567890
CopyMemory vartypefrommemory, ByVal VarPtr(a), 2
Debug.Print "a = " & a & ", VarTypeFromMemory: " & vartypefrommemory & ", VarType: " & VarType(a)
CopyMemory b, ByVal VarPtr(a) + 8, 4
Debug.Print "Gia tri tu memory a = " & b
a = 2234567890#
CopyMemory vartypefrommemory, ByVal VarPtr(a), 2
Debug.Print "a = " & a & ", VarTypeFromMemory: " & vartypefrommemory & ", VarType: " & VarType(a)
CopyMemory c, ByVal VarPtr(a) + 8, 8
Debug.Print "Gia tri tu memory a = " & c
a = "hic hic he he"
CopyMemory vartypefrommemory, ByVal VarPtr(a), 2
Debug.Print "a = " & a & ", VarTypeFromMemory: " & vartypefrommemory & ", VarType: " & VarType(a)
CopyMemory b, ByVal VarPtr(a) + 8, 4
Debug.Print "Dia chi chuoi lay tu memory: " & b & ", dia chi chuoi tu StrPtr: " & StrPtr(a)
ReDim m(1 To 2 * Len(a))
CopyMemory m(1), ByVal b, UBound(m)
s = m
Debug.Print "Chuoi lay tu memory a = " & s
End Sub
Nếu nói về bộ nhớ thì vd. ta có 6 GB RAM. Nhưng sau khi nạp system và các ct khác thì còn bao nhiêu? Vd. còn A GB. Nhưng đâu phải là còn A GB thì có thể dùng mảng có độ lớn A GB? Thế không gian làm việc thì lấy ở đâu?
thì ở đâu đó memory manager sẽ "phân" 16 bai để dùng cho biến a. Chỉ khai báo thôi memory manager sẽ "phân" 16 bai dùng cho a.
Trong 8 bai đầu (thực ra là 2 bai đầu. Nếu tôi không lầm thì 6 bai kia là Reserved) được ghi VarType. Trong 8 bai sau được ghi data. Tức nếu biến là numeric (<= 8 bai) thì giá trị trong 8 bai thứ 2 chính là giá trị numeric. Tất nhiên compilator biết là cần lấy mấy bai từ 8 bai kia). Nếu hiện thời biến chứa Object thì trong 8 bai sau ta có Pointer (4 bai) tới Object nằm ở nơi khác trong bộ nhớ. Nếu hiện thời biến chứa String thì trong 8 bai sau ta có Pointer (4 bai) tới String được ghi ở chỗ khác trong bộ nhớ (thì trong 8 bai làm sao ghi được String với độ dài bất kỳ)
Vân vân và vân vân. Mỗi người tự nghiên cứu.
Để hiểu thêm thì chạy code
Mã:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)
Sub test()
Dim a, vartypefrommemory As Integer, b As Long, c As Double, m() As Byte, s As String
a = 1000
CopyMemory vartypefrommemory, ByVal VarPtr(a), 2
Debug.Print "a = " & a & ", VarTypeFromMemory: " & vartypefrommemory & ", VarType: " & VarType(a)
CopyMemory b, ByVal VarPtr(a) + 8, 4
Debug.Print "Gia tri tu memory a = " & b
a = 1234567890
CopyMemory vartypefrommemory, ByVal VarPtr(a), 2
Debug.Print "a = " & a & ", VarTypeFromMemory: " & vartypefrommemory & ", VarType: " & VarType(a)
CopyMemory b, ByVal VarPtr(a) + 8, 4
Debug.Print "Gia tri tu memory a = " & b
a = 2234567890#
CopyMemory vartypefrommemory, ByVal VarPtr(a), 2
Debug.Print "a = " & a & ", VarTypeFromMemory: " & vartypefrommemory & ", VarType: " & VarType(a)
CopyMemory c, ByVal VarPtr(a) + 8, 8
Debug.Print "Gia tri tu memory a = " & c
a = "hic hic he he"
CopyMemory vartypefrommemory, ByVal VarPtr(a), 2
Debug.Print "a = " & a & ", VarTypeFromMemory: " & vartypefrommemory & ", VarType: " & VarType(a)
CopyMemory b, ByVal VarPtr(a) + 8, 4
Debug.Print "Dia chi chuoi lay tu memory: " & b & ", dia chi chuoi tu StrPtr: " & StrPtr(a)
ReDim m(1 To 2 * Len(a))
CopyMemory m(1), ByVal b, UBound(m)
s = m
Debug.Print "Chuoi lay tu memory a = " & s
End Sub
Em cảm ơn Anh ... Cái Em hỏi thì Anh đã trả lời ... Em đọc tới lui bài này và link Anh cho U cả đầu ...Từ từ Em nghiền ngẫm có gì chưa biết Mong Anh chỉ thêm
Em Cảm ơn Anh rất nhiều