Chuyển mảng đa chiều về một chiều theo hình xoắn ốc bằng VBA (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

sakutara1505

Thành viên mới
Tham gia
15/4/12
Bài viết
11
Được thích
2
Chào các anh chị trên diễn đàn em có 1 vấn đề khó khăn mà loay hoay mãi ko giải được vì dữ liệu rất lớn mà làm thủ công thi không biết ngày tháng năm nào mới xong được, mong anh chị trên diễn đàn giúp đỡ, vấn đề là em có:
Ma trận : [TABLE="width: 330"]
[TR]
[TD="align: right"][TABLE="width: 165"]
[TR]
[TD="align: right"]13[/TD]
[TD="align: right"]28[/TD]
[TD="align: right"]43[/TD]
[TD="align: right"]58[/TD]
[TD="align: right"]73[/TD]
[/TR]
[TR]
[TD="align: right"]14[/TD]
[TD="align: right"]29[/TD]
[TD="align: right"]44[/TD]
[TD="align: right"]59[/TD]
[TD="align: right"]74[/TD]
[/TR]
[TR]
[TD="align: right"]15[/TD]
[TD="align: right"]30[/TD]
[TD="align: right"]45[/TD]
[TD="align: right"]60[/TD]
[TD="align: right"]75
[/TD]
[/TR]
[/TABLE]
[/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[/TR]
[/TABLE]
Em muốn đưa nó về mảng 1 chiều theo hình xoắn ốc như sau: (em muốn chuyển theo cột dọc nhưng sợ dài bài quá nên em viết kết quả theo hàng)
13 14 15 30 29 28 43 44 45 60 59 58 73 74 75

Mong được anh chị diễn đàn giúp đỡ!
 
Chào các anh chị trên diễn đàn em có 1 vấn đề khó khăn mà loay hoay mãi ko giải được vì dữ liệu rất lớn mà làm thủ công thi không biết ngày tháng năm nào mới xong được, mong anh chị trên diễn đàn giúp đỡ, vấn đề là em có:
Ma trận : [TABLE="width: 330"]
[TR]
[TD="align: right"][TABLE="width: 165"]
[TR]
[TD="align: right"]13[/TD]
[TD="align: right"]28[/TD]
[TD="align: right"]43[/TD]
[TD="align: right"]58[/TD]
[TD="align: right"]73[/TD]
[/TR]
[TR]
[TD="align: right"]14[/TD]
[TD="align: right"]29[/TD]
[TD="align: right"]44[/TD]
[TD="align: right"]59[/TD]
[TD="align: right"]74[/TD]
[/TR]
[TR]
[TD="align: right"]15[/TD]
[TD="align: right"]30[/TD]
[TD="align: right"]45[/TD]
[TD="align: right"]60[/TD]
[TD="align: right"]75[/TD]
[/TR]
[/TABLE]
[/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[/TR]
[/TABLE]
Em muốn đưa nó về mảng 1 chiều theo hình xoắn ốc như sau: (em muốn chuyển theo cột dọc nhưng sợ dài bài quá nên em viết kết quả theo hàng)
13 14 15 30 29 28 43 44 45 60 59 58 73 74 75

Mong được anh chị diễn đàn giúp đỡ!
Cái này là chuyển mảng 2 chiều sang mảng 1 chiều chứ? đâu phải là mảng đa chiều( mảng đa chiều là mảng nhiều hơn một chiều, có thể là 2 chiều, 3 chiều, 4 chiều và ... n chiều) đâu
Code cục bộ tham khảo chơi
Mã:
Sub ABC()
Dim Arr2()
Dim Arr1(1 To 15)
Dim i As Long, j As Long
Dim K As Long
Arr2 = Sheet1.Range("A1:E3")
For j = 1 To 5
  For i = 1 To 3
    K = K + 1
   If (j Mod 2 = 1) Then
      Arr1(K) = Arr2(i, j)
    Else
      Arr1(K) = Arr2(3 - i + 1, j)
    End If
Next
Next
End Sub
 
Lần chỉnh sửa cuối:
Dạ, em đang ví dụ vậy, anh giúp em chuyển như trên ví dụ được không ạ?
 
Chào các anh chị trên diễn đàn em có 1 vấn đề khó khăn mà loay hoay mãi ko giải được vì dữ liệu rất lớn mà làm thủ công thi không biết ngày tháng năm nào mới xong được, mong anh chị trên diễn đàn giúp đỡ, vấn đề là em có:
Ma trận : [TABLE="width: 330"]
[TR]
[TD="align: right"][TABLE="width: 165"]
[TR]
[TD="align: right"]13[/TD]
[TD="align: right"]28[/TD]
[TD="align: right"]43[/TD]
[TD="align: right"]58[/TD]
[TD="align: right"]73[/TD]
[/TR]
[TR]
[TD="align: right"]14[/TD]
[TD="align: right"]29[/TD]
[TD="align: right"]44[/TD]
[TD="align: right"]59[/TD]
[TD="align: right"]74[/TD]
[/TR]
[TR]
[TD="align: right"]15[/TD]
[TD="align: right"]30[/TD]
[TD="align: right"]45[/TD]
[TD="align: right"]60[/TD]
[TD="align: right"]75[/TD]
[/TR]
[/TABLE]
[/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[TD="align: right"][/TD]
[/TR]
[/TABLE]
Em muốn đưa nó về mảng 1 chiều theo hình xoắn ốc như sau: (em muốn chuyển theo cột dọc nhưng sợ dài bài quá nên em viết kết quả theo hàng)
13 14 15 30 29 28 43 44 45 60 59 58 73 74 75

Mong được anh chị diễn đàn giúp đỡ!

Với mảng dữ liệu bắt đầu tại sheet1[A1]
Kết quả điền vào sheet2
Mã:
Public Sub sakutara()
Dim DArr, Res, r, c, i

DArr = Sheet1.Range("A1").CurrentRegion
ReDim Res(1 To UBound(DArr) * UBound(DArr, 2), 1 To 1)

For c = 1 To UBound(DArr, 2)
If c Mod 2 = 1 Then
For r = 1 To UBound(DArr)
i = i + 1
Res(i, 1) = DArr(r, c)
Next r
Else
For r = UBound(DArr) To 1 Step -1
i = i + 1
Res(i, 1) = DArr(r, c)
Next r
End If
Next c
Sheet2.UsedRange.ClearContents
Sheet2.Range("A1").Resize(UBound(Res), 1) = Res
End Sub
 
Với mảng dữ liệu bắt đầu tại sheet1[A1]
Kết quả điền vào sheet2
Mã:
Public Sub sakutara()
Dim DArr, Res, r, c, i

DArr = Sheet1.Range("A1").CurrentRegion
ReDim Res(1 To UBound(DArr) * UBound(DArr, 2), 1 To 1)

For c = 1 To UBound(DArr, 2)
If c Mod 2 = 1 Then
For r = 1 To UBound(DArr)
i = i + 1
Res(i, 1) = DArr(r, c)
Next r
Else
For r = UBound(DArr) To 1 Step -1
i = i + 1
Res(i, 1) = DArr(r, c)
Next r
End If
Next c
Sheet2.UsedRange.ClearContents
Sheet2.Range("A1").Resize(UBound(Res), 1) = Res
End Sub
Tuyệt vời! Đúng ý em rồi, cảm ơn anh nhiều! Chúc anh năm mới gặp nhiều may mắn trong cuộc sống
 
Đúng rồi đấy anh phihndhsp ạ! Em cảm ơn anh nhiều, chúc anh năm mới gặp nhiều may mắn
 
Cái này là chuyển mảng 2 chiều sang mảng 1 chiều chứ? đâu phải là mảng đa chiều( mảng đa chiều là mảng nhiều hơn một chiều, có thể là 2 chiều, 3 chiều, 4 chiều và ... n chiều) đâu
Code cục bộ tham khảo chơi
Mã:
Sub ABC()
Dim Arr2()
Dim Arr1(1 To 15)
Dim i As Long, j As Long
Dim K As Long
Arr2 = Sheet1.Range("A1:E3")
For j = 1 To 5
  For i = 1 To 3
    K = K + 1
   If (j Mod 2 = 1) Then
      Arr1(K) = Arr2(i, j)
    Else
      Arr1(K) = Arr2(3 - i + 1, j)
    End If
Next
Next
End Sub

Chủ thớt nói "xoắn ốc" nhưng thực ra là hình "rắn bò"
Bài này đáng ra bạn có thể tìm một công thức chuyển đổi để chiếu (map) giữa hai tập hợp. Khi đó bạn chỉ phải mất 1 vòng lặp

Redim MangKQ(1 to Ubound(MangNguon)*Ubound(MangNguon,2))
For i = 1 to UBound(MangKQ)
MangKQ(i) = MangNguon(CongThucDong(i), CongThucCot(i))
Next i

Đối với dân dạy lập trình như bạn, đây là con toán xứng đáng nghiên cứu
 
Chủ thớt nói "xoắn ốc" nhưng thực ra là hình "rắn bò"
Bài này đáng ra bạn có thể tìm một công thức chuyển đổi để chiếu (map) giữa hai tập hợp. Khi đó bạn chỉ phải mất 1 vòng lặp

Redim MangKQ(1 to Ubound(MangNguon)*Ubound(MangNguon,2))
For i = 1 to UBound(MangKQ)
MangKQ(i) = MangNguon(CongThucDong(i), CongThucCot(i))
Next i

Đối với dân dạy lập trình như bạn, đây là con toán xứng đáng nghiên cứu
Có phải anh muốn em tính toán số dòng và số cột trực tiếp trên mảng 2 chiều rồi gán lại vào mảng một chiều ?
Mã:
Sub ABC()
Dim Arr2()
Dim Arr1(1 To 15)
Dim dong As Long, j As Long, cot As Long
Arr2 = Sheet1.Range("A1:E3")
For j = 1 To 15
    cot = Int((j - 1) / 3) + 1
    dong = (j - 1) Mod 3 + 1
    If cot Mod 2 = 0 Then
      dong = 3 - dong + 1
    End If
       Arr1(j) = Arr2(dong, cot)
  Next
Sheet1.Range("G1").Resize(15, 1) = Application.Transpose(Arr1)
End Sub
 
Lần chỉnh sửa cuối:
Đại khái là vậy. Nhưng đó là trường hợp chung.

Đây là loại con toán thực hiện theo vòng lặp tuần tự, cho nên có những giá trị tính theo dạng tuần tự sẽ dễ hơn.

row = 1: col = 1: mov = 1 ' mov là chiều chạy của row
for i = 1 to mxrow*mxcol
kq(i) = dv(row, col)
row = row + mov ' dòng kế tiếp
if row < 1 or row > mxrow then ' hết 1 cột
col = col + 1 ' sang cột kế tiếp
mov = -mov ' đổi chiều
row = row + mov ' khởi đầu cột kế tiếp
end if
next i
' mánh khoé bài này nằm ở chỗ dùng hẳn hòi 1 biến để theo chỉ định chiều chạy của dòng
 
Web KT

Bài viết mới nhất

Back
Top Bottom