Các câu hỏi về mảng trong VBA (Array)

Liên hệ QC

viehoai

Thành viên gắn bó
Tham gia
22/5/09
Bài viết
2,599
Được thích
2,908
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ị
 
dạ cho em hỏi thêm một chút
Mã:
.Selection.Find.Execute [c13], , , , , , , , , Ten([COLOR=#ff0000]1, 3[/COLOR]), 2
Số 1 và 3 màu đỏ ý nghĩ gì vậy ? Em tìm câu trả lời của nó mà tìm mãi không có. Em xin cám ơn
Ten có thể là một Array 2 chiều, cũng có thể là một Range

Ten(1, 3) có thể hiểu là phần tử của Array hoặc một ô của một Range, nó ở vị trí hàng thứ 1 và cột thứ 3.

Một thí nghiệm về Range:

Mã:
Sub TestRange()
    Dim Ten As Range
    Set Ten = Range("A1:D5")
    Ten(1, 3).Select
    ''cell C3 se duoc chon
End Sub

Và một thí nghiệm cho Array:

Mã:
Sub TestArray()
    Dim Ten(1 To 5, 1 To 7)
    Dim c As Byte, r As Byte
    For r = 1 To 5
        For c = 1 To 7
            Ten(r, c) = r & "/" & c
        Next
    Next
    MsgBox Ten(1, 3)
End Sub
 
Upvote 0
dạ cho em hỏi thêm một chút
Mã:
.Selection.Find.Execute [c13], , , , , , , , , Ten([COLOR=#ff0000]1, 3[/COLOR]), 2
Số 1 và 3 màu đỏ ý nghĩ gì vậy ? Em tìm câu trả lời của nó mà tìm mãi không có. Em xin cám ơn
Với 1 Range thì nó có thể là như vầy:

Mã:
Sub TestRange2()
    Dim Ten As Range
    Set Ten = Range("A1")
    Ten(1, 3).Select
    ''cell C3 se duoc chon
End Sub

Mặc dù Range chỉ là 1 ô duy nhất, nhưng khi tham chiếu nó vẫn có thể "di chuyển" đúng hàng và cột bắt đầu từ điểm xuất phát là cell gốc (A1) đó.

Nhưng với Array thì không được như thế, sẽ báo lỗi tràn dòng nếu phần tử có số hàng hoặc số cột lớn hơn mảng gốc.

Tuy nhiên, căn cứ vào code của bạn thì nó chính là một RANGE chứ không phải là một Array:

Mã:
For Each [COLOR=#ff0000][B]Ten [/B][/COLOR][COLOR=#0000ff][B]In Range([c16], [c65536].End(3))[/B][/COLOR]        If Ten > 0 And Ten.Font.ColorIndex <> 3 Then  '
                Doc = .Documents.Open(ThisWorkbook.Path & "\" & [d1] & ".doc")
                .Selection.Find.Execute [c12], , , , , , , , , Ten, 2
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Sub Excel_Word()
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    On Error Resume Next
    With CreateObject("Word.Application")
        .Visible = True
        For Each Ten In Range([b8], [b65536].End)
            If Ten > 0 And Ten.Font.ColorIndex <> 3 Then  '
                Doc = .Documents.Open(ThisWorkbook.Path & "\BBNghienthu.doc")
                .Selection.Find.Execute [b6], , , , , , , , , Ten, 2
                .Selection.Find.Execute [b7], , , , , , , , , Ten(1, 3), 2
                For Each cls In [c3:c11]
                    If cls > 0 Then .Selection.Find.Execute cls, , , , , , , , , cls(1, 2), 2
                Next
                End If
        Next
        .Quit
    End With
End Sub
Anh cho em hỏi, đoạn câu này chỉ xuất ra 1 trang, với 1 dãy dữ liêu ở 1 hàng tương ứng. Nếu em muốn xuất tất cả các giá trị ở ô B8 trở về dưới và tất cả phải nằm trong 1 file word gồm nhiều trang với các giá trị của các ô từ ô B8 trở về dưới.
Em mới học vba để áp dụng cho công việc nên mong anh chị và các thầy cô giúp đỡ!
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Sub Excel_Word()
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    On Error Resume Next
    With CreateObject("Word.Application")
        .Visible = True
        For Each Ten In [COLOR=#ff0000][B]Range([b8], [b65536].End)[/B][/COLOR]
            If Ten > 0 And Ten.Font.ColorIndex <> 3 Then  '
                Doc = .Documents.Open(ThisWorkbook.Path & "\BBNghienthu.doc")
                .Selection.Find.Execute [b6], , , , , , , , , Ten, 2
                .Selection.Find.Execute [b7], , , , , , , , , Ten(1, 3), 2
                For Each cls In [c3:c11]
                    If cls > 0 Then .Selection.Find.Execute cls, , , , , , , , , cls(1, 2), 2
                Next
                End If
        Next
        .Quit
    End With
End Sub
Anh cho em hỏi, đoạn câu này chỉ xuất ra 1 trang, với 1 dãy dữ liêu ở 1 hàng tương ứng. Nếu em muốn xuất tất cả các giá trị ở ô B8 trở về dưới và tất cả phải nằm trong 1 file word gồm nhiều trang với các giá trị của các ô từ ô B8 trở về dưới.
Em mới học vba để áp dụng cho công việc nên mong anh chị và các thầy cô giúp đỡ!


Bạn thử cái mà tôi tô đỏ thành cái dưới đây xem sao:

Range([b8], [b65536].End(xlUp))
 
Upvote 0
Dạ đây là file của em. Mong anh giúp đỡ em
 

File đính kèm

  • thu in.rar
    19.5 KB · Đọc: 15
Upvote 0
Thay đổi cách xác định mảng

- Em có code sử dụng mảng đang chạy rất ngon lành như sau:
PHP:
Public Sub Cach1()
Dim sArr(), Arr1(), Arr2(), I As Long, J As Long, Num As Long
sArr = Range("D11:AL501").Value
ReDim Arr1(1 To UBound(sArr, 1), 1 To 1)
ReDim Arr2(1 To UBound(sArr, 1), 1 To 1)
For I = 1 To UBound(sArr, 1)
    Num = 0
    For J = 8 To UBound(sArr, 2)
        If sArr(I, J) > 0 Then
            Num = Num + sArr(I, J)
   Next J
    If Num > 0 Then       Arr2(I, 1) = sArr(I, 1) - (sArr(I, 35) + Num)
   If sArr(I, 2) <> "" Or sArr(I, 1) - Num = 0 Then     Arr1(I, 1) = "x"
Next I
[AM11:AM501].Value = Arr2
[E11:E501].Value = Arr1
End Sub
- Nay em vọc code về mảng muốn thay thế bằng một cách viết khác khi sử dụng mảng. Em có sửa lại code trên thành:
PHP:
Public Sub Cach2()
Dim sArr(), Arr1(), Arr2(), I As Long, J As Long, Num As Long, K As Long
    sArr = .Range(.[D11], .[D65000].End(xlUp)).Value
    K = UBound(sArr, 1)
    'sArr = Range("D11:AL501").Value'
ReDim Arr1(1 To K, 1 To 1)
ReDim Arr2(1 To K, 1 To 1)
For I = 1 To UBound(sArr, 1)
    Num = 0    
   For J = 8 To UBound(sArr, 2)
        If sArr(I, J) > 0 Then Num = Num + sArr(I, J)
    Next J
    If Num > 0 Then Arr2(I, 1) = sArr(I, 1) - Num
    If sArr(I, 2) <> "" Or sArr(I, 1) - Num = 0 Then Arr1(I, 1) = "x"
Next I
.[AM11].Resize(K, 1).Value = Arr2
.[E11].Resize(K, 1).Value = Arr1
End Sub
Thì code này báo lỗi như hình:
Loi.jpg
- Như vậy em chỉ biết là mình viết chưa đúng. Các Bác giúp em sửa lại với. Em xin cảm ơn!.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Bạn Copy Code lên diễn đàn bị lỗi nên rất khó nhìn. Tôi đoán lỗi của bạn như sau
Code của bạn có đoạn lỗi

Mã:
sArr = .Range(.[D11], .[D65000].End(xlUp)).Value
Bạn để ý cái dấu chấm, dấu chấm đó có có nghĩa là chỉ ra cells sau dấu chấm sẽ thuộc đối tượng lớp cao hơn, ở đấy là worksheet. Do đó bạn xem sheet cần tham chiếu là gì để sửa. Bạn sửa theo dạng như sau

Mã:
With sheet1
sArr = .Range(.[D11], .[D65000].End(xlUp)).Value  
End with
 
Upvote 0
Bạn Copy Code lên diễn đàn bị lỗi nên rất khó nhìn. Tôi đoán lỗi của bạn như sau
Code của bạn có đoạn lỗi

Mã:
sArr = .Range(.[D11], .[D65000].End(xlUp)).Value
Bạn để ý cái dấu chấm, dấu chấm đó có có nghĩa là chỉ ra cells sau dấu chấm sẽ thuộc đối tượng lớp cao hơn, ở đấy là worksheet. Do đó bạn xem sheet cần tham chiếu là gì để sửa. Bạn sửa theo dạng như sau

Mã:
With sheet1
sArr = .Range(.[D11], .[D65000].End(xlUp)).Value  
End with
- Cảm ơn bạn nhé!. Mọi người post code lên coi rất đẹp mà sao mình post để có màu mè như trên thì khung nó lại nhỏ xíu!.
- Theo gơi ý của bạn mình đã sửa lại như sau:
PHP:
Public Sub Cach2()
Dim sArr(), Arr1(), Arr2(), I As Long, J As Long, Num As Long, K As Long
With Sheets("Sheet1")
    sArr = .Range(.[D11], .[D65000].End(xlUp)).Value
    K = UBound(sArr, 1)
End With
'sArr = Range("D11:AL501").Value
ReDim Arr1(1 To K, 1 To 1)
ReDim Arr2(1 To K, 1 To 1)
For I = 1 To UBound(sArr, 1)
    Num = 0
    For J = 8 To UBound(sArr, 2)
        If sArr(I, J) > 0 Then Num = Num + sArr(I, J)
    Next J
    If Num > 0 Then Arr2(I, 1) = sArr(I, 1) - Num
    If sArr(I, 2) <> "" Or sArr(I, 1) - Num = 0 Then Arr1(I, 1) = "x"
Next I
With Sheets("Sheet1")
.[AM11].Resize(K, 1).Value = Arr2
.[E11].Resize(K, 1).Value = Arr1
End With
End Sub
- Bị lỗi dòng này:
If sArr(I, 2) <> "" Or sArr(I, 1) - Num = 0 Then Arr1(I, 1) = "x"
. Các bạn xem giúp mình với!.
 

File đính kèm

  • Gio_TKB.rar
    14.2 KB · Đọc: 26
Lần chỉnh sửa cuối:
Upvote 0
- Cảm ơn bạn nhé!. Mọi người post code lên coi rất đẹp mà sao mình post để có màu mè như trên thì khung nó lại nhỏ xíu!.
- Theo gơi ý của bạn mình đã sửa lại như sau:
PHP:
Public Sub Cach2()
Dim sArr(), Arr1(), Arr2(), I As Long, J As Long, Num As Long, K As Long
With Sheets("Sheet1")
    sArr = .Range(.[D11], .[D65000].End(xlUp)).Value
    K = UBound(sArr, 1)
End With
'sArr = Range("D11:AL501").Value
ReDim Arr1(1 To K, 1 To 1)
ReDim Arr2(1 To K, 1 To 1)
For I = 1 To UBound(sArr, 1)
    Num = 0
    For J = 8 To UBound(sArr, 2)
        If sArr(I, J) > 0 Then Num = Num + sArr(I, J)
    Next J
    If Num > 0 Then Arr2(I, 1) = sArr(I, 1) - Num
    If sArr(I, 2) <> "" Or sArr(I, 1) - Num = 0 Then Arr1(I, 1) = "x"
Next I
With Sheets("Sheet1")
.[AM11].Resize(K, 1).Value = Arr2
.[E11].Resize(K, 1).Value = Arr1
End With
End Sub
- Bị lỗi dòng này: . Các bạn xem giúp mình với!.

Sai đoạn này bạn ơi,

Mã:
sArr = .Range(.[D11], .[D65000].End(xlUp)).Value

thay bằng:

Mã:
sArr = .Range(.[D11], .[D65000].End(xlUp))[COLOR=#ff0000].Resize(, 35)[/COLOR].Value
 
Upvote 0
- Cảm ơn bạn nhé!. Mọi người post code lên coi rất đẹp mà sao mình post để có màu mè như trên thì khung nó lại nhỏ xíu!.
- Theo gơi ý của bạn mình đã sửa lại như sau:
PHP:
Public Sub Cach2()
Dim sArr(), Arr1(), Arr2(), I As Long, J As Long, Num As Long, K As Long
With Sheets("Sheet1")
    sArr = .Range(.[D11], .[D65000].End(xlUp)).Value
    K = UBound(sArr, 1)
End With
'sArr = Range("D11:AL501").Value
ReDim Arr1(1 To K, 1 To 1)
ReDim Arr2(1 To K, 1 To 1)
For I = 1 To UBound(sArr, 1)
    Num = 0
    For J = 8 To UBound(sArr, 2)
        If sArr(I, J) > 0 Then Num = Num + sArr(I, J)
    Next J
    If Num > 0 Then Arr2(I, 1) = sArr(I, 1) - Num
    If sArr(I, 2) <> "" Or sArr(I, 1) - Num = 0 Then Arr1(I, 1) = "x"
Next I
With Sheets("Sheet1")
.[AM11].Resize(K, 1).Value = Arr2
.[E11].Resize(K, 1).Value = Arr1
End With
End Sub
- Bị lỗi dòng này: . Các bạn xem giúp mình với!.
Mảng có 1 cột D thì lấy đâu ra số 2 chứ
If sArr(I, 1) <> "" Or sArr(I, 1) - Num = 0 Then Arr1(I, 1) = "x"
 
Upvote 0
tôi đang có 1 thắc mắc cũng không có khó lắm nhưng không biết cấu trúc như thế nào mong được học hỏi thêm
ví dụ nếu là mảng một chiều thì tôi nhập giá trị trực tiếp như sau
Dim Arr()
Arr = Array(1, 2, 3, 4, 4, 5, 6)

còn mảng 2 chiều thì nhập như thế nào? xin cảm ơn
 
Upvote 0
tôi đang có 1 thắc mắc cũng không có khó lắm nhưng không biết cấu trúc như thế nào mong được học hỏi thêm
ví dụ nếu là mảng một chiều thì tôi nhập giá trị trực tiếp như sau
Dim Arr()
Arr = Array(1, 2, 3, 4, 4, 5, 6)

còn mảng 2 chiều thì nhập như thế nào? xin cảm ơn

Trùi ui, phải vậy không đó?

Dim Arr2D(1 to 2, 1 to 2)

Arr2D(1, 1) = "Hoàng"
Arr2D(1, 2) = "Trọng"
Arr2D(2, 1) = "Nghĩa"
Arr2D(2, 2) = "Đẹp trai"
 
Upvote 0
Trùi ui, phải vậy không đó?

Dim Arr2D(1 to 2, 1 to 2)

Arr2D(1, 1) = "Hoàng"
Arr2D(1, 2) = "Trọng"
Arr2D(2, 1) = "Nghĩa"
Arr2D(2, 2) = "Đẹp trai"
ý em muốn sử dụng cái này nè
Array(1, 2, 3, 4, 4, 5, 6)
vì em thấy mảng một chiều nhập trực tiếp như vậy, mà mảng 2 hay nhiều chiều có như vậy được không?


 
Upvote 0
ý em muốn sử dụng cái này nè
Array(1, 2, 3, 4, 4, 5, 6)
vì em thấy mảng một chiều nhập trực tiếp như vậy, mà mảng 2 hay nhiều chiều có như vậy được không?



Hiện tại thì chưa thấy có thể gán mảng 2 chiều trở lên bằng hàm Array!
 
Upvote 0
tôi đang có 1 thắc mắc cũng không có khó lắm nhưng không biết cấu trúc như thế nào mong được học hỏi thêm
ví dụ nếu là mảng một chiều thì tôi nhập giá trị trực tiếp như sau
Dim Arr()
Arr = Array(1, 2, 3, 4, 4, 5, 6)

còn mảng 2 chiều thì nhập như thế nào? xin cảm ơn

Cách chính thống là người ta nạp từng phần tử vào mảng 2 chiều (dùng vòng lập)
Cách khác nạp 1 lần luôn không cần vòng lập cũng có, chẳng hạn:
Mã:
Sub Test()
  Dim arr
  arr = [{1,2,3;4,5,6}]
  MsgBox arr(1, 1)
  MsgBox arr(1, 2)
  MsgBox arr(1, 3)
  MsgBox arr(2, 1)
  MsgBox arr(2, 2)
  MsgBox arr(2, 3)
End Sub
arr là mảng 2 chiều
 
Lần chỉnh sửa cuối:
Upvote 0
Cách chính thống là người ta nạp từng phần tử vào mảng 2 chiều (dùng vòng lập)
Cách khác nạp 1 lần luôn không cần vòng lập cũng có, chẳng hạn:
Mã:
Sub Test()
  Dim arr
  arr = [{1,2,3;4,5,6}]
  MsgBox arr(1, 1)
  MsgBox arr(1, 2)
  MsgBox arr(1, 3)
  MsgBox arr(2, 1)
  MsgBox arr(2, 2)
  MsgBox arr(2, 3)
End Sub
arr là mảng 2 chiều

Hay quá Thầy ơi, giờ mới biết cách này:

arr = [{1,2,3;4,5,6}]
 
Upvote 0
Hay quá Thầy ơi, giờ mới biết cách này:

arr = [{1,2,3;4,5,6}]
Thật ra là mình không cần biết cũng được anh nghĩa vì có nhiều cách gán mà, nhưng mà mình đi dạy nên phải phòng các trường hợp người ta có thể hỏi mình bất cứ thứ gì, nên phải phòng trước tới đâu hay tối đó hi hi
còn 3 chiều mình phải thêm dấu gì nữa thầy ndu
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom