- Tham gia
- 23/3/16
- Bài viết
- 705
- Được thích
- 52
Chào cả nhà GPE ! Em cần 1 đoạn code để đảo ngược từ dưới lên trên như hình bên dưới. Xin chân thành cảm ơn
View attachment 206224
bạn lắp code này vào xem thế nào nhéChào cả nhà GPE ! Em cần 1 đoạn code để đảo ngược từ dưới lên trên như hình bên dưới. Xin chân thành cảm ơn
View attachment 206224
Sub daonguoc()
Dim i, j, a As Long
Dim arr, arr1
arr = Sheets(1).Range("c5:e11").Value
ReDim arr1(1 To UBound(arr, 1), 1 To UBound(arr, 2))
For i = UBound(arr, 1) To 1 Step -1
a = a + 1
For j = 1 To UBound(arr, 2)
arr1(a, j) = arr(i, j)
Next j
Next i
Sheets(1).Range("l5").Resize(a, UBound(arr, 2)).Value = arr1
End Sub
Cách dùng 1 mảng thôi:bạn lắp code này vào xem thế nào nhé
Mã:Sub daonguoc() Dim i, j, a As Long Dim arr, arr1 arr = Sheets(1).Range("c5:e11").Value ReDim arr1(1 To UBound(arr, 1), 1 To UBound(arr, 2)) For i = UBound(arr, 1) To 1 Step -1 a = a + 1 For j = 1 To UBound(arr, 2) arr1(a, j) = arr(i, j) Next j Next i Sheets(1).Range("l5").Resize(a, UBound(arr, 2)).Value = arr1 End Sub
Cách dùng 1 mảng thôi:
i1 = 1
i2 = UBound(arr)
jj = UBound(arr,2)
Do While i2 > i1
For j = 1 to jj
tmp = arr(i1, j)
arr(i1,j) = arr(i2,j)
arr(i2,j) = tmp
i1 = i1 + 1
i2 = i2 - 1
Next j1
Loop
Sub daonguoc2()
Dim i1, i2, jj, tmp, arr
arr = Sheets(1).Range("C5:E11").Value
i1 = 1
i2 = UBound(arr)
jj = UBound(arr, 2)
Do While i2 > i1
For j = 1 To jj
tmp = arr(i1, j)
arr(i1, j) = arr(i2, j)
arr(i2, j) = tmp
i1 = i1 + 1
i2 = i2 - 1
Next j 'j1
Loop
Sheets(1).Range("L5").Resize(i1, UBound(arr, 2)).Value = arr
End Sub
Tham gia ngoài lềXin chào bác VetMini, cháu thử viết theo gợi ý của Bác.
Code báo lỗi ở dòng: Next j1 ,cháu sửa lại Next j
Nhưng kết quả không giống với kết quả minh họa tại bài 1:
Nhờ bác chỉ giúp cháu chỗ sai ạ.Mã:Sub daonguoc2() Dim i1, i2, jj, tmp, arr arr = Sheets(1).Range("C5:E11").Value i1 = 1 i2 = UBound(arr) jj = UBound(arr, 2) Do While i2 > i1 For j = 1 To jj tmp = arr(i1, j) arr(i1, j) = arr(i2, j) arr(i2, j) = tmp i1 = i1 + 1 i2 = i2 - 1 Next j 'j1 Loop Sheets(1).Range("L5").Resize(i1, UBound(arr, 2)).Value = arr End Sub
i1 = i1 + 1
i2 = i2 - 1
Sheets(1).Range("L5").Resize(i1, UBound(arr, 2)).Value = arr
Sub LatDuLieu()
Dim Rng As Range
Dim Col As Byte, Dg As Long
Set Rng = [c5].CurrentRegion
' MsgBox Rng.Columns.Count, , Rng.Rows.Count '
ReDim Arr(1 To Rng.Rows.Count, 1 To Rng.Columns.Count)
For Col = 1 To Rng.Columns.Count
For Dg = 1 To Rng.Rows.Count
Arr(Rng.Rows.Count - Dg + 1, Col) = Rng.Cells(Dg, Col)
Next Dg
Next Col
[l5].Resize(Rng.Rows.Count, Rng.Columns.Count).Value = Arr()
End Sub
Tham gia ngoài lề
Có lẽ phải chuyển
ra ngoài vòng lặp for ... nextMã:i1 = i1 + 1 i2 = i2 - 1
Thay i1 thành Ubound(arr) trong câu lệnh dưới
Mã:Sheets(1).Range("L5").Resize(i1, UBound(arr, 2)).Value = arr
Xin lỗi, tối buồn ngủ quá, viết tùm lum hếtXin chào bác VetMini, cháu thử viết theo gợi ý của Bác.
Code báo lỗi ở dòng: Next j1 ,cháu sửa lại Next j
Nhưng kết quả không giống với kết quả minh họa tại bài 1:
Mã:Sub daonguoc2() Dim i1, i2, jj, tmp, arr arr = Sheets(1).Range("C5:E11").Value i1 = 1 i2 = UBound(arr) jj = UBound(arr, 2) Do While i2 > i1 For j = 1 To jj tmp = arr(i1, j) arr(i1, j) = arr(i2, j) arr(i2, j) = tmp i1 = i1 + 1 i2 = i2 - 1 Next j 'j1 Loop Sheets(1).Range("L5").Resize(i1, UBound(arr, 2)).Value = arr End Sub
Nhờ bác chỉ giúp cháu chỗ sai ạ.
Xin lỗi, tối buồn ngủ quá, viết tùm lum hết
Do While i2 > i1
For j = 1 To jj
tmp = arr(i1, j)
arr(i1, j) = arr(i2, j)
arr(i2, j) = tmp
Next j
i1 = i1 + 1
i2 = i2 - 1
Loop
Xin chào bác SA_DQ,Với dữ liệu như của bạn chủ bài đăng, ta có thể xài:
PHP:Sub LatDuLieu() Dim Rng As Range Dim Col As Byte, Dg As Long Set Rng = [c5].CurrentRegion ' MsgBox Rng.Columns.Count, , Rng.Rows.Count ' ReDim Arr(1 To Rng.Rows.Count, 1 To Rng.Columns.Count) For Col = 1 To Rng.Columns.Count For Dg = 1 To Rng.Rows.Count Arr(Rng.Rows.Count - Dg + 1, Col) = Rng.Cells(Dg, Col) Next Dg Next Col [l5].Resize(Rng.Rows.Count, Rng.Columns.Count).Value = Arr() End Sub
Kết quả trả về 3, và 7Set Rng = [c5].CurrentRegion
MsgBox Rng.Columns.Count, , Rng.Rows.Count
Dim i1 As Integer, i2 As Integer, arr ()
i1 = Rng.Rows.Count
i2 = Rng.Columns.Count
arr(1 To i1, 1 To i2)
thì kết quả vẫn OK. Vậy 2 cách khai báo này có gì giống và khác nhau ? Nhờ bác giải thích giúp cháu về ReDim với ạ.ReDim arr(1 To Rng.Rows.Count, 1 To Rng.Columns.Count)
hoặc:
Dim arr(1 To 7, 1 To 3)
Sub reverse()
Dim r As Long, c As Long, k As Long
Dim Arr, tmp
Arr = ThisWorkbook.Worksheets("Sheet1").Range("C5:E11").Value
k = UBound(Arr) + 1
For r = 1 To UBound(Arr) \ 2
For c = 1 To UBound(Arr, 2)
tmp = Arr(r, c)
Arr(r, c) = Arr(k - r, c)
Arr(k - r, c) = tmp
Next c
Next r
ThisWorkbook.Worksheets("Sheet1").Range("H5").Resize(UBound(Arr), UBound(Arr, 2)).Value = Arr
End Sub
thì mình xin giải thích tỉ mĩ cho bạn:Nhờ bác giải thích giúp cháu hiểu thêm 2 vấn đề này với ạ:
Set Rng = [c5].CurrentRegion
MsgBox Rng.Columns.Count, , Rng.Rows.Count
Kết quả trả về 3, và 7
Set Rng = [c5].CurrentRegion
MsgBox Rng.Address
Dim i1 As Integer, i2 As Integer, arr ()
i1 = Rng.Rows.Count
i2 = Rng.Columns.Count
arr(1 To i1, 1 To i2)
Sub test_revs2D()
Dim arr: arr = revs2D(Range("C5:E11"), True, True)
Znew.Range("E13").Resize(UBound(arr), UBound(arr, 2)).ClearContents
Znew.Range("E13").Resize(UBound(arr), UBound(arr, 2)).Value = arr
End Sub
Function revs2D(ByVal rng As Range, Optional ByVal TOtoBO As Boolean, Optional ByVal BeToAf As Boolean) As Variant
If Not IsArray(rng) Then revs2D = rng: Exit Function
Dim i As Long, j As Long, V As Long, H As Long, revsH, revsV, arr, dArr
arr = rng.Value
revsV = UBound(arr) + 1
revsH = UBound(arr, 2) + 1
ReDim dArr(1 To UBound(arr), 1 To UBound(arr, 2))
For i = 1 To UBound(arr)
V = i: If TOtoBO Then V = revsV - i
For j = 1 To UBound(arr, 2)
H = j: If BeToAf Then H = revsH - j
dArr(V, H) = arr(i, j)
Next j
Next i
revs2D = dArr
End Function
Chủ thớt này thật là vô tâm. mỗi lần nhờ mọi người viết code đều như vậy....! có code ôm đi là chạy mất dép. không có một lời cảm ơn người khác. Không biết mọi người có ý kiến gì không?Chào cả nhà GPE ! Em cần 1 đoạn code để đảo ngược từ dưới lên trên như hình bên dưới. Xin chân thành cảm ơn
View attachment 206224
Chủ thớt này thật là vô tâm. mỗi lần nhờ mọi người viết code đều như vậy....! có code ôm đi là chạy mất dép. không có một lời cảm ơn người khác. Không biết mọi người có ý kiến gì không?
- Đánh số thứ tự cho cột B từ nhỏ đến lớnChào cả nhà GPE ! Em cần 1 đoạn code để đảo ngược từ dưới lên trên như hình bên dưới. Xin chân thành cảm ơn
View attachment 206224
Chuẩn bị có 1 phần mềm mới xuất xưởng tung ra thị trường với phiên bản "Vơ Sình Niu"Có thể chủ thớt chưa biết "like'. Mình vô GPE từ 2008 mà mỗi lần nhờ xong cũng chỉ biết trả lời cám ơn chứ không biết vụ like, sau này mới biết thôi. hihi
Như bác VetMini nói, nguyên tắc hoán vị 2 phần tử là người ta nhớ "phần tử 1" ra "chỗ tạm thời" -> cho phần tử 1 bằng phần tử 2 -> cho phần tử 2 = "chỗ tạm thời".
..
Phần tử 1 nằm ở nửa trên, phần tử 2 nằm ở nửa dưới. Chỉ cần duyệt FOR ở nửa trên (hoặc dưới). Tổng chỉ số dòng của 2 phần tử luôn không đổi và bằng Ubound(Arr) + 1
Mã:Sub reverse() Dim r As Long, c As Long, k As Long Dim Arr, tmp Arr = ThisWorkbook.Worksheets("Sheet1").Range("C5:E11").Value k = UBound(Arr) + 1 For r = 1 To UBound(Arr) \ 2 For c = 1 To UBound(Arr, 2) tmp = Arr(r, c) Arr(r, c) = Arr(k - r, c) Arr(k - r, c) = tmp Next c Next r ThisWorkbook.Worksheets("Sheet1").Range("H5").Resize(UBound(Arr), UBound(Arr, 2)).Value = Arr End Sub
Làm gì có khái niệm mảng dọc, mảng ngang?Qua đó cũng hiểu thêm chút xíu thế nào là mảng chiều dọc và chiều ngang của mảng và hình dung dữ liệu nó hoạt động lật qua lật lại như 1 tấm rèm.
Làm gì có khái niệm mảng dọc, mảng ngang?
Bạn liên tưởng đến sheet nên bạn tự bịa ra khái niệm như thế? Vd. bạn nhập một đoạn hàng (một đoạn cột) nhiều ô vào mảng thì bạn cho đó là mảng ngang (dọc)? Thực ra chúng đều là mảng 2 chiều: 1 dòng nhiều cột (1 cột nhiều dòng).
Chỉ có khái niệm mảng n chiều, với n >= 1. Ngay cả mảng 1 chiều thì là một chiều chứ đâu là ngang hay dọc? Mà nếu chỉ có mảng dọc, ngang thì mảng 3 chiều là dọc hay ngang?
Không hẳn vậy. Thớt này thường tét cốt kỹ lắm. Có khi cả tuần lễ mới có kết quả.Chủ thớt này thật là vô tâm. mỗi lần nhờ mọi người viết code đều như vậy....! có code ôm đi là chạy mất dép. không có một lời cảm ơn người khác. Không biết mọi người có ý kiến gì không?
Ý Bác batman là mảng chỉ có mảng 1 chiều và 2 chiều đó chị Oanh Thơ, mảng 2 chiều duyệt ngang duyệt dọc, nên ý của chị cũng khá đúng đấy.Làm gì có khái niệm mảng dọc, mảng ngang?
Trên diễn đàn này đã có thành viên sử dụng mảng 4 chiều rồi bạn.Ý Bác batman là mảng chỉ có mảng 1 chiều và 2 chiều đó chị Oanh Thơ, mảng 2 chiều duyệt ngang duyệt dọc, nên ý của chị cũng khá đúng đấy.
Còn cái mảng 3D (chiều x , y , z) của Bác batman trong excel chưa thấy bao giờ, nên chưa dám chạm. Bác batman có thể giải thích về mảng 3D giúp em. Có phải 3 vòng lặp lòng nhau không Bác
CHAOQUAY có link bài viết không, tò mò quá.Trên diễn đàn này đã có thành viên sử dụng mảng 4 chiều rồi bạn.
Chiều của mảng với vòng lặp có liên quan gì ở đây đâu bạn
Bài này đọc được trước khi tham gia diễn đàn nên không lưu đường link bạn.CHAOQUAY có link bài viết không, tò mò quá.
Excel làm sao có giao diện 3D được ta.
https://vi.wikipedia.org/wiki/Không_gian_ba_chiều
OK đúng là có mảng 3 chiều thật nhưng 3 vòng lặp lồng nhau cũng không saiTrên diễn đàn này đã có thành viên sử dụng mảng 4 chiều rồi bạn.
Chiều của mảng với vòng lặp có liên quan gì ở đây đâu bạn
OK đúng là có mảng 3 chiều thật nhưng 3 vòng lặp lồng nhau cũng không sai
https://docs.microsoft.com/en-us/do...ide/language-features/arrays/array-dimensions
Có nói bạn sai gì đâu.Ý Bác batman là mảng chỉ có mảng 1 chiều và 2 chiều đó chị Oanh Thơ, mảng 2 chiều duyệt ngang duyệt dọc, nên ý của chị cũng khá đúng đấy.
Còn cái mảng 3D (chiều x , y , z) của Bác batman trong excel chưa thấy bao giờ, nên chưa dám chạm. Bác batman có thể giải thích về mảng 3D giúp em. Có phải 3 vòng lặp lòng nhau không Bác
Tiếng dùng thông dụng cho mảng trong lập trình:
chiều thứ nhất: dòng (row)
chiều thứ hai: cột (column)
chiều thứ ba: trang, hoặc lớp (page)
Khái niệm mảng ở hầu hết các bài trong thớt này là khái niệm mảng của lập trình. VBA là một ngôn ngữ lập trình. Dùng trong môi trường Excel thì nó được mặc định để sử dụng các đối tượng của Excel (Workbook, Worksheet, Range,... là điển hình của các đối tượng này). Nhưng khái niệm mảng của VBA cũng vẫn là khái niệm mảng của lập trình.
Excel là hiện thân của bảng tính trải rộng cho nên chủ yếu nó chỉ dùng 2 chiều. Nhưng "chủ yếu" không có nghĩa là luôn luôn. Sheets là thể hiện của chiều thứ ba. (lưu ý là nghĩa của page tương đối gần với sheet)
Người hởi ở bài #25 và #27 hiển nhiên là chưa phân biệt được VBA và Excel.
Kêu bác ấy giữ sức khỏe làm gì nhỉ?Bác giữ gìn sức khỏe!
Đã hiểu bài của Bác VetMini. 1 Sheet chỉ là mảng 2 chiều. Duyệt thêm sheet khác thành 3 chiều. Các object dùng để tham chiếu như : worksheets(""), sheets("") , ...có phải vậy không BácTiếng dùng thông dụng cho mảng trong lập trình:
chiều thứ nhất: dòng (row)
chiều thứ hai: cột (column)
chiều thứ ba: trang, hoặc lớp (page)
Khái niệm mảng ở hầu hết các bài trong thớt này là khái niệm mảng của lập trình. VBA là một ngôn ngữ lập trình. Dùng trong môi trường Excel thì nó được mặc định để sử dụng các đối tượng của Excel (Workbook, Worksheet, Range,... là điển hình của các đối tượng này). Nhưng khái niệm mảng của VBA cũng vẫn là khái niệm mảng của lập trình.
Excel là hiện thân của bảng tính trải rộng cho nên chủ yếu nó chỉ dùng 2 chiều. Nhưng "chủ yếu" không có nghĩa là luôn luôn. Sheets là thể hiện của chiều thứ ba. (lưu ý là nghĩa của page tương đối gần với sheet). Đối tượng loại Range của Excel có một số hàm để ngầm chuyển đổi giữa Range và mảng 2 chiều. Đối tượng loại WorksheetFunction cũng có khả năng tự chuyển đổi giữa mảng và Range. Tùy theo hàm mà nó chuyển 1 dòng/cột qua mảng 1 chiều, hay nhiều dòng và cột qua mảng 2 chiều. Hiện tại thì tôi chưa biết cách chuyển nhiều sheets thành mảng 3 chiều.
Người hởi ở bài #25 và #27 hiển nhiên là chưa phân biệt được VBA và Excel.
Kêu bác ấy giữ sức khỏe làm gì nhỉ?
Giữ thì có dùng hay không dùng nữa?
Giữ hoài (cất kỹ) mà không dùng thì nó (sức khỏe) cũng tự yếu đi mờ. Bác ấy bảo, "Ờ, giữ gìn sức khỏe nên nghỉ vào đây viết bài." Vậy tính sao?
Sao không kêu bác ấy dùng 'xả láng' mà vẫn khỏe.![]()
@befaintXin chào, befaint
Có sức khỏe là có tất cả mà bạn
Vì hôm trước bác VetMini có nói là bác ấy buồn ngủ quá. Hơn nữa Oanh Thơ(OT) được biết trong chủ đề này cũng có ít nhất ba người đáng tuổi ông nên khi nhận đc sự giúp đỡ OT gửi cảm ơn không mà vẫn cảm thấy thiếu thiếu gì đó nên cũng gửi thêm lời chúc sức khỏe đến người đó, ba người nhiều tuổi mà OT nhớ không nhầm là (>70) cụ thể bác:Siwtom, VetMini,DQ_SA. Vì ba bác vẫn có thể viết bài thường xuyên nên OT gọi là bác.
Rất khâm phục các bác, lên diễn đàn học hỏi mà được những người có kinh nghiệm như các bác chỉ giáo chẳng còn gì bằng.
Có bác tính lại hay nói thẳng nói thật mới đầu cảm giác hơi khó gần nhưng thực sự lại rất quan tâm vì đã nhiều lần giúp đỡ OT, OT ngẫm lại tính giống người ông của mình, khi ông còn sống khỏe OT cũng hay bị ông mắng chửi lắm giờ ông không còn OT lại cảm thấy nhớ ông nhiều nhất.. huhu
...
Xin lỗi.. lại bắt đầu lan man rồi..
Bạn cũng hay thức khuya lắm đó befaint.
Hi nhân đây cũng cảm ơn bạn nhé befaint cảm ơn bạn cũng đã nhiều lần giúp mình.
Chúc bạn tương lai thành công rực rỡ!
@befaint
Anh befaint đã được quan rồi nhé, sau này tiếp tục giúp đỡ chị OT nhé anh. Lúc 2 giờ sáng...![]()
Bạn đếm thêm cho tôi "1 bàn tay" rồiba người nhiều tuổi mà OT nhớ không nhầm là (>70) cụ thể bác:Siwtom, VetMini,DQ_SA.
1. VBA không phải là ngôn ngữ lập trình tổng quát (như Java, C/C++), không phải lập trình giáo khoa (Pascal), không phải lập trình HĐT (Java, Delphi, C#, C++), không phải lập trình web (PHP, Java, C#)lan mam 1 chút ... cũng đâu đó trên GPE này có ai đó nói VBA không phải là ngôn ngữ lập trình ....
Nhưng ai đó lại nói nó VBA là ngôn ngữ lập trình .... vậy ko biết ai nói đúng ai nói sai ta ??!!!
Hóng xem mở rộng kiến thức 1 chút![]()
Vậy Mình tạm keo vầy không biết chính xác không nữa .... sai ta sửa lại1. VBA không phải là ngôn ngữ lập trình tổng quát (như Java, C/C++), không phải lập trình giáo khoa (Pascal), không phải lập trình HĐT (Java, Delphi, C#, C++), không phải lập trình web (PHP, Java, C#)
2. VBA là ngôn ngữ lập trình ứng dụng hổ trợ cho các phần mềm lớn của Microsoft. Điển hình là Office. Lưu ý là ngay cả từ "ứng dụng" ở trên cũng trong phạm vi hạn hẹp, tức là nó chỉ giới hạn trong các ứng dụng của Microsoft. Có thể các hệ thống khác cũng dùng được, nhưng không có nghĩa là họ chịu trách nhiệm bảo trì.
3. Trên thực tế còn vài ngôn ngữ lập trình ứng dụng được giới lập trình ủng hộ rất mạnh. Điển hình là Python (rộng), R (thống kê), PHP (web).
4. Khi lạm dụng VBA để làm những công việc điều khiển hệ thống, quý vị đã cố tình quên rằng Windows có Powershell làm việc hiệu quả hơn. Trên thực tế, nếu không cần sử dụng các đối tượng của Excel hay Access thì làm việc với VBScript dễ dàng hơn VBA. (theo đúng tên của nó, script là loại ngôn ngữ "thảo", không phải là lập trình tổng quát)
Từ "hoàn chỉnh" có thể mang tính chất chủ quan, và dễ gây hiểu lầm.Vậy Mình tạm keo vầy không biết chính xác không nữa .... sai ta sửa lại
1/ VBA là 1 ngôn ngữ lập trình ... Nhưng chưa hoàn chỉnh như những ngôn ngữ khác VD: Delphi, VB6 , C#, ...
2/ Nếu vậy thì tái khẳng định ai đó nói VBA không phải là ngôn ngữ lập trình là sai cơ Bản 70% ... hên lại trúng dòng này
Có người cho là markup language như XML là ngôn ngữ lập trình nhưng đa số không coi là ngôn ngữ lập trình. Ai cũng có lý, tùy theo xét "tiêu chuẩn" nào thôi.Vậy Mình tạm keo vầy không biết chính xác không nữa .... sai ta sửa lại
1/ VBA là 1 ngôn ngữ lập trình ... Nhưng chưa hoàn chỉnh như những ngôn ngữ khác VD: Delphi, VB6 , C#, ...
2/ Nếu vậy thì tái khẳng định ai đó nói VBA không phải là ngôn ngữ lập trình là sai cơ Bản 70% ... hên lại trúng dòng này
Chỗ này bác không chính xác, vì bác viết tắt. Nếu cân đo đong đếm bằng dụng cụ tiểu ly thì: Delphi là môi trường lập trình mà ngôn ngữ là Object PascalDelphi, Pascal và Angol đều được tiêu chuẩn hóa và đều là ngôn ngữ lập trình tổng quát.
Không phải tôi viết tắt mà là tôi lầm thật....
Chỗ này bác không chính xác, vì bác viết tắt. Nếu cân đo đong đếm bằng dụng cụ tiểu ly thì: Delphi là môi trường lập trình mà ngôn ngữ là Object Pascal![]()
Trên mạng luôn có những cuộc tranh cãi nảy lửa và những người như bác tự thấy là thuộc đẳng cấp "bề trên" đấy.Không phải tôi viết tắt mà là tôi lầm thật.
Hồi nào giờ tôi cứ ngỡ Delphi là tên chữ của Object Pascal. Vì không có duyên lắm với cái này nên tôi lười tìm hiểu thêm. Không phải tôi chê, nhưng hoàn cảnh lúc đó tôi chỉ được chọn lựa giữa C++ và Java.
Nghe bác nói, bây giờ ngẫm lại cái từ Delphi (tiếng Hy lạp) thì là môi trường cũng phải.
mà sao em thấy Delphi chỉ phát triển ở nhật, Đức, Nga và Mỹ, tàu .... còn lại thấy ít lắm ... ở Việt nam càng ítTrên mạng luôn có những cuộc tranh cãi nảy lửa và những người như bác tự thấy là thuộc đẳng cấp "bề trên" đấy.Mọi người chỉ cho Dephi (Object Pascal) ngồi chiếu dưới thôi.
Tôi thì 2 món của bác chào thua.
Public Sub TestMe()
Dim varArray As Variant
Dim lCounter As Long
Dim lCounter2 As Long
Dim rngCell As Range
''varArray = Array(Array(1, 2, 3, 4), Array(11, 12, 13, 14))
varArray = Array(Array(1, 2, 3, 4), Array(11, 12, 13, 14), Array(16, 17, 18, 19))
Set rngCell = Cells(1, 1)
For lCounter = LBound(varArray) To UBound(varArray)
For lCounter2 = LBound(varArray(lCounter)) To UBound(varArray(lCounter))
Debug.Print varArray(lCounter)(lCounter2)
rngCell = varArray(lCounter)(lCounter2)
Set rngCell = rngCell.Offset(0, 1)
Next lCounter2
Debug.Print "-----------"
Set rngCell = Cells(rngCell.Row + 1, 1)
Next lCounter
End Sub
Cách đây khoảng 1 tháng, có bạn hỏi về cách dùng Redim Preserve để thay đổi số dòng trong mảng 2 chiều (Redim Preserve chỉ thay đổi được số cột)lang thang tìm tài liệu trên Internet thấy Tây nó xài đa mảng .... mà chưa thấy trên GPE xài .... hay xài rồi mà mình ko biết nữa ?!
Vậy Bài 49 keo là Dùng mảng trong mảng .... hay Tây nó keo là đa mảng cũng chính là NóCách đây khoảng 1 tháng, có bạn hỏi về cách dùng Redim Preserve để thay đổi số dòng trong mảng 2 chiều (Redim Preserve chỉ thay đổi được số cột)
Trong bài trả lời, tôi có đề cập 2 phương pháp:
1. Đảo cột thành dòng
2. Dùng mảng trong mảng.
Cái này kêu thế em thấy hơi phức tạp, kiểu nâng cao quan điểm ấy.Vậy Bài 49 keo là Dùng mảng trong mảng .... hay Tây nó keo là đa mảng cũng chính là Nó
Nếu mảng variant thì như vậy. Bởi vì variant có thể là bất cứ kiểu gì. Trước đây có một bạn viết bài nói về mảng variant.Cái này kêu thế em thấy hơi phức tạp, kiểu nâng cao quan điểm ấy.
Em cũng hay dùng cái này, chỉ hiểu đơn giản các phần tử của mảng có thể là bất kỳ kiểu dữ liệu nào (hình như object cũng được), có thể là một giá trị đơn hay một mảng. Hồi em tìm hiểu về mấy bài Hastable, Dictionary... phát hiện item có thể là giá trị đơn hay mảng nên thử với Array luôn..
thì lâu nay Mình đang tìm tài liệu học Delphi ... cái mong muốn tìm thì nó ko ra mà cứ ra cái liên quan ...đang suy nghĩ 1 chút nhiều khả năng là mình ko biết tiếng anh và tây nó keo một đường Mình lại keo 1 nẻo và Google nó ko hiểu ý mình nên nó cứ tìm ra chéo cánh vậy ...Tây nào vậy. Cho biết nguồn chính và nguồn dịch.
' QuickSort for 2D array in form Array(cols,rows)
' Enter in 1, 2, or 3 columns to sort by, each can be either asc or desc
Public Sub QuickSortStart(ThisArray As Variant, sortColumn1 As Integer, asc1 As Boolean, Optional sortColumn2 As Integer = -1, Optional asc2 As Boolean = True, Optional sortColumn3 As Integer = -1, Optional asc3 As Boolean = True)
Dim LowerBound As Integer
Dim UpperBound As Integer
LowerBound = LBound(ThisArray, 2)
UpperBound = UBound(ThisArray, 2)
Call QuickSort(ThisArray, LowerBound, UpperBound, sortColumn1, asc1, sortColumn2, asc2, sortColumn3, asc3)
End Sub
Private Sub QuickSort(ThisArray As Variant, FirstRow As Integer, LastRow As Integer, sortColumn1 As Integer, asc1 As Boolean, sortColumn2 As Integer, asc2 As Boolean, sortColumn3 As Integer, asc3 As Boolean)
Dim pivot1 As Variant
Dim pivot2 As Variant
Dim pivot3 As Variant
Dim tmpSwap As Variant
Dim tmpFirstRow As Integer
Dim tmpLastRow As Integer
Dim FirstCol As Integer
Dim LastCol As Integer
Dim i As Integer
tmpFirstRow = FirstRow
tmpLastRow = LastRow
FirstCol = LBound(ThisArray, 1)
LastCol = UBound(ThisArray, 1)
pivot1 = ThisArray(sortColumn1, (FirstRow + LastRow) \ 2)
If sortColumn2 <> -1 Then
pivot2 = ThisArray(sortColumn2, (FirstRow + LastRow) \ 2)
End If
If sortColumn3 <> -1 Then
pivot3 = ThisArray(sortColumn3, (FirstRow + LastRow) \ 2)
End If
While (tmpFirstRow <= tmpLastRow)
While (compareFirstLoop(ThisArray, pivot1, pivot2, pivot3, tmpFirstRow, sortColumn1, asc1, sortColumn2, asc2, sortColumn3, asc3) And tmpFirstRow < LastRow)
tmpFirstRow = tmpFirstRow + 1
Wend
While (compareSecondLoop(ThisArray, pivot1, pivot2, pivot3, tmpLastRow, sortColumn1, asc1, sortColumn2, asc2, sortColumn3, asc3) And tmpLastRow > FirstRow)
tmpLastRow = tmpLastRow - 1
Wend
If (tmpFirstRow <= tmpLastRow) Then
For i = FirstCol To LastCol
tmpSwap = ThisArray(i, tmpFirstRow)
ThisArray(i, tmpFirstRow) = ThisArray(i, tmpLastRow)
ThisArray(i, tmpLastRow) = tmpSwap
Next i
tmpFirstRow = tmpFirstRow + 1
tmpLastRow = tmpLastRow - 1
End If
Wend
If (FirstRow < tmpLastRow) Then
Call QuickSort(ThisArray, FirstRow, tmpLastRow, sortColumn1, asc1, sortColumn2, asc2, sortColumn3, asc3)
End If
If (tmpFirstRow < LastRow) Then
Call QuickSort(ThisArray, tmpFirstRow, LastRow, sortColumn1, asc1, sortColumn2, asc2, sortColumn3, asc3)
End If
End Sub
Private Function compareFirstLoop(ThisArray As Variant, pivot1 As Variant, pivot2 As Variant, pivot3 As Variant, checkRow As Integer, sortColumn1 As Integer, asc1 As Boolean, sortColumn2 As Integer, asc2 As Boolean, sortColumn3 As Integer, asc3 As Boolean)
If asc1 = True And ThisArray(sortColumn1, checkRow) < pivot1 Then
compareFirstLoop = True
ElseIf asc1 = False And ThisArray(sortColumn1, checkRow) > pivot1 Then
compareFirstLoop = True
'Move to Second Column
ElseIf sortColumn2 <> -1 And ThisArray(sortColumn1, checkRow) = pivot1 Then
If asc2 = True And ThisArray(sortColumn2, checkRow) < pivot2 Then
compareFirstLoop = True
ElseIf asc2 = False And ThisArray(sortColumn2, checkRow) > pivot2 Then
compareFirstLoop = True
'Move to Third Column
ElseIf sortColumn3 <> -1 And ThisArray(sortColumn2, checkRow) = pivot2 Then
If asc3 = True And ThisArray(sortColumn3, checkRow) < pivot3 Then
compareFirstLoop = True
ElseIf asc3 = False And ThisArray(sortColumn3, checkRow) > pivot3 Then
compareFirstLoop = True
Else
compareFirstLoop = False
End If
Else
compareFirstLoop = False
End If
Else
compareFirstLoop = False
End If
End Function
Private Function compareSecondLoop(ThisArray As Variant, pivot1 As Variant, pivot2 As Variant, pivot3 As Variant, checkRow As Integer, sortColumn1 As Integer, asc1 As Boolean, sortColumn2 As Integer, asc2 As Boolean, sortColumn3 As Integer, asc3 As Boolean)
If asc1 = True And pivot1 < ThisArray(sortColumn1, checkRow) Then
compareSecondLoop = True
ElseIf asc1 = False And pivot1 > ThisArray(sortColumn1, checkRow) Then
compareSecondLoop = True
'Move to Second Column
ElseIf sortColumn2 <> -1 And ThisArray(sortColumn1, checkRow) = pivot1 Then
If asc2 = True And pivot2 < ThisArray(sortColumn2, checkRow) Then
compareSecondLoop = True
ElseIf asc2 = False And pivot2 > ThisArray(sortColumn2, checkRow) Then
compareSecondLoop = True
'Move to Third Column
ElseIf sortColumn3 <> -1 And ThisArray(sortColumn2, checkRow) = pivot2 Then
If asc3 = True And pivot3 < ThisArray(sortColumn3, checkRow) Then
compareSecondLoop = True
ElseIf asc3 = False And pivot3 > ThisArray(sortColumn3, checkRow) Then
compareSecondLoop = True
Else
compareSecondLoop = False
End If
Else
compareSecondLoop = False
End If
Else
compareSecondLoop = False
End If
End Function