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

  • Thread starter Thread starter viehoai
  • Ngày gửi Ngày gửi
Liên hệ QC

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

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ị
 
Vẫn mơ hồ.
- 2 sheet xét theo từng dòng từ cột A đến E?
- Nếu từng Cell có giá trị của 2 sheet khác nhau thì "tô màu", vậy nội dung trong cell kết quả ghi nội dung của sheet 1 hay sheet2?
- Cũng giải thích rõ kết quả trong sheet Result: E2, G2, I2 làm sao mà có? Quy luật là sao?
À đúng rồi, con hiểu rồi.
Nghĩa là thế này Thầy ạ, đúng là con mô tả sai không đúng mục đích. Con gửi lại file và xin phép xóa file kèm bài 1317 ạ
Lọc duy nhất A,B,C,D,E so sánh 2 sheet nếu khác nhau trả về kết quả ạ..( cột F ở 2 sheet là cột phụ minh họa), mong muốn code khác không phải sử dụng cột phụ F.
Và cuối cùng là lọc duy nhất kết quả khác nhau để trả về những giá trị duy nhất trong 1 cột E sheets("Results")
không sử dụng RemoveDuplicates mà cũng ra như kết quả như file kèm ạ.
Cảm ơn Thầy nhiều ạ

Sửa bổ sung: không sử dụng RemoveDuplicates (mất định dạng)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
À đúng rồi, con hiểu rồi.
Nghĩa là thế này Thầy ạ, đúng là con mô tả sai không đúng mục đích. Con gửi lại file và xin phép xóa file kèm bài 1317 ạ
Lọc duy nhất A,B,C,D,E so sánh 2 sheet nếu khác nhau trả về kết quả ạ..( cột F ở 2 sheet là cột phụ minh họa), mong muốn code khác không phải sử dụng cột phụ F.
Và cuối cùng là lọc duy nhất kết quả khác nhau để trả về những giá trị duy nhất trong 1 cột E sheets("Results")
không sử dụng RemoveDuplicates mà cũng ra như kết quả như file kèm ạ.
Cảm ơn Thầy nhiều ạ

Sửa bổ sung: không sử dụng RemoveDuplicates (mất định dạng)
Biết xài "Dic" thì cứ "Dic" mà "quất".
PHP:
Public Sub Gpe()
Dim Dic As Object, sArr(), dArr(), I As Long, J As Long, K As Long, R As Long, Txt As String
Set Dic = CreateObject("Scripting.Dictionary")
    '===================================='
    sArr = Sheets("OLD").Range("A2", Sheets("OLD").Range("A2").End(xlDown)).Resize(, 5).Value
    R = UBound(sArr)
    For I = 1 To R
        Txt = Space(0)
        For J = 1 To 5
            Txt = Txt & sArr(I, J)
        Next J
        Dic.Item(Txt) = ""
    Next I
    '===================================='
    sArr = Sheets("NEW").Range("A2", Sheets("NEW").Range("A2").End(xlDown)).Resize(, 5).Value
    R = UBound(sArr)
    ReDim dArr(1 To R, 1 To 1)
    For I = 1 To R
        Txt = Space(0)
        For J = 1 To 5
            Txt = Txt & sArr(I, J)
        Next J
        If Not Dic.Exists(Txt) Then
            Dic.Item(Txt) = ""
            K = K + 1
            dArr(K, 1) = Txt
        End If
    Next I
    '===================================='
Sheets("Results").Range("E2").Resize(1000).ClearContents
Sheets("Results").Range("E2").Resize(K) = dArr
Set Dic = Nothing
End Sub
 
Upvote 0
Biết xài "Dic" thì cứ "Dic" mà "quất".
PHP:
Public Sub Gpe()
Dim Dic As Object, sArr(), dArr(), I As Long, J As Long, K As Long, R As Long, Txt As String
Set Dic = CreateObject("Scripting.Dictionary")
    '===================================='
    sArr = Sheets("OLD").Range("A2", Sheets("OLD").Range("A2").End(xlDown)).Resize(, 5).Value
    R = UBound(sArr)
    For I = 1 To R
        Txt = Space(0)
        For J = 1 To 5
            Txt = Txt & sArr(I, J)
        Next J
        Dic.Item(Txt) = ""
    Next I
    '===================================='
    sArr = Sheets("NEW").Range("A2", Sheets("NEW").Range("A2").End(xlDown)).Resize(, 5).Value
    R = UBound(sArr)
    ReDim dArr(1 To R, 1 To 1)
    For I = 1 To R
        Txt = Space(0)
        For J = 1 To 5
            Txt = Txt & sArr(I, J)
        Next J
        If Not Dic.Exists(Txt) Then
            Dic.Item(Txt) = ""
            K = K + 1
            dArr(K, 1) = Txt
        End If
    Next I
    '===================================='
Sheets("Results").Range("E2").Resize(1000).ClearContents
Sheets("Results").Range("E2").Resize(K) = dArr
Set Dic = Nothing
End Sub
Con chào Thầy ạ,
Code trên chạy đúng ý con rồi,cảm ơn Thầy đã giúp đỡ.
 
Upvote 0
Mình có một file chấm công như file đính kém ở dưới. Mình muốn lập code về màng để điền công theo bảng đó (Đã lập được code dùng Range nhưng code chạy tương đối chậm). Nếu như hàng (E13:AH13) = "CN" thì các giá trị theo cột "CN" sẽ được điền là "S" còn lại từ thứ 2-7 thì sẽ được điền giá trị là "1".
 

File đính kèm

Upvote 0
Mọi người cho hỏi: Có một mảng gồm r hàng và c cột, làm thế nào để duyệt qua tất cả các tổ hợp, mỗi tổ hợp gồm r phần tử; trong mỗi tổ hợp: mỗi hàng có duy nhất một phần tử trong cột bất kỳ (tổng cộng có c^r tổ hợp). Duyệt qua được tất cả các tổ hợp mình sẽ chọn các tổ hợp thỏa mãn điều kiện sẽ lấy.
 
Lần chỉnh sửa cuối:
Upvote 0
Mọi người cho hỏi: Có một mảng gồm r hàng và c cột, làm thế nào để duyệt qua tất cả các tổ hợp, mỗi tổ hợp gồm r phần tử; trong mỗi tổ hợp: mỗi hàng có duy nhất một phần tử trong cột bất kỳ (tổng cộng có c^r tổ hợp). Duyệt qua được tất cả các tổ hợp mình sẽ chọn các tổ hợp thỏa mãn điều kiện sẽ lấy.
Dùng vòng lặp thì có lẽ là cho kết hợp tuần tự theo từng dòng từ trên xuống dưới. Mỗi lần kết hợp, lưu kết quả vào mảng trung gian, sau đó lấy mảng trung gian này ghép với dòng tiếp theo.
 
Upvote 0
Dùng vòng lặp thì có lẽ là cho kết hợp tuần tự theo từng dòng từ trên xuống dưới. Mỗi lần kết hợp, lưu kết quả vào mảng trung gian, sau đó lấy mảng trung gian này ghép với dòng tiếp theo.
Cho code cụ thể thử bạn, tôi tìm bể đâu chưa ra.
Nôm na giống thế này: Đi mua trái cây gồm nhiều loại: me, xoài, cốc, ổi ...; mỗi loại trái có nhiều loại ngon dỡ chất lượng khác nhau nên giá cũng nhiều loại giá khác nhau, từ 1,2,5,...,100 đồng một bịch, kể cả có loại khuyến mãi 0 đồng. Bây giờ tôi có 100 đồng nhưng muốn mua tất cả các loại quả, mỗi loại chỉ một bịch. Tìm cho tôi tất cả các phương án mua mỗi loại trái cây một bịch sao cho tổng số tiền không quá 100 đồng (có thể càng tiệm cận 100 đồng càng tốt)?
Bài đã được tự động gộp:

Dùng vòng lặp thì có lẽ là cho kết hợp tuần tự theo từng dòng từ trên xuống dưới. Mỗi lần kết hợp, lưu kết quả vào mảng trung gian, sau đó lấy mảng trung gian này ghép với dòng tiếp theo.
Cho code cụ thể thử bạn, tôi tìm bể đâu chưa ra.
Nôm na giống thế này: Đi mua trái cây gồm nhiều loại: me, xoài, cốc, ổi ...; mỗi loại trái có nhiều loại ngon dỡ chất lượng khác nhau nên giá cũng nhiều loại giá khác nhau, từ 1,2,5,...,100 đồng một bịch, kể cả có loại khuyến mãi 0 đồng. Bây giờ tôi có 100 đồng nhưng muốn mua tất cả các loại quả, mỗi loại chỉ một bịch. Tìm cho tôi tất cả các phương án mua mỗi loại trái cây một bịch sao cho tổng số tiền không quá 100 đồng (có thể càng tiệm cận 100 đồng càng tốt)?
 
Upvote 0
Cho code cụ thể thử bạn, tôi tìm bể đâu chưa ra.
Nôm na giống thế này: Đi mua trái cây gồm nhiều loại: me, xoài, cốc, ổi ...; mỗi loại trái có nhiều loại ngon dỡ chất lượng khác nhau nên giá cũng nhiều loại giá khác nhau, từ 1,2,5,...,100 đồng một bịch, kể cả có loại khuyến mãi 0 đồng. Bây giờ tôi có 100 đồng nhưng muốn mua tất cả các loại quả, mỗi loại chỉ một bịch. Tìm cho tôi tất cả các phương án mua mỗi loại trái cây một bịch sao cho tổng số tiền không quá 100 đồng (có thể càng tiệm cận 100 đồng càng tốt)?
Bài đã được tự động gộp:


Cho code cụ thể thử bạn, tôi tìm bể đâu chưa ra.
Nôm na giống thế này: Đi mua trái cây gồm nhiều loại: me, xoài, cốc, ổi ...; mỗi loại trái có nhiều loại ngon dỡ chất lượng khác nhau nên giá cũng nhiều loại giá khác nhau, từ 1,2,5,...,100 đồng một bịch, kể cả có loại khuyến mãi 0 đồng. Bây giờ tôi có 100 đồng nhưng muốn mua tất cả các loại quả, mỗi loại chỉ một bịch. Tìm cho tôi tất cả các phương án mua mỗi loại trái cây một bịch sao cho tổng số tiền không quá 100 đồng (có thể càng tiệm cận 100 đồng càng tốt)?
Code dưới đây viết theo nội dung của bài 1324 ở trên.
Bạn điểu chỉnh thêm bớt hoặc gửi file giả định lên giải quyết cho tiện
Mã:
Option Explicit

Sub TestVonglap()
Dim Nguon, Dong, Cot
Dim Mang
Dim DicTT As Object
Dim i, j, k

Set DicTT = CreateObject("Scripting.Dictionary")
Nguon = Sheet1.Range("A1:C5")

Dong = UBound(Nguon)
Cot = UBound(Nguon, 2)
ReDim Mang(Cot - 1)
For j = 1 To Cot
    Mang(j - 1) = Nguon(1, j)
Next j
k = 1
Do While k < Dong
    k = k + 1
    DicTT.RemoveAll
    For i = 0 To UBound(Mang)
        For j = 1 To Cot
            DicTT(Mang(i) & " " & Nguon(k, j)) = ""
        Next j
    Next i
    Mang = DicTT.Keys
Loop
With Sheet2
    .UsedRange.Clear
    .Range("C1").Resize(DicTT.Count, 1) = WorksheetFunction.Transpose(DicTT.Keys)
End With
End Sub
 
Upvote 0
Cho code cụ thể thử bạn, tôi tìm bể đâu chưa ra.
Nôm na giống thế này: Đi mua trái cây gồm nhiều loại: me, xoài, cốc, ổi ...; mỗi loại trái có nhiều loại ngon dỡ chất lượng khác nhau nên giá cũng nhiều loại giá khác nhau, từ 1,2,5,...,100 đồng một bịch, kể cả có loại khuyến mãi 0 đồng. Bây giờ tôi có 100 đồng nhưng muốn mua tất cả các loại quả, mỗi loại chỉ một bịch. Tìm cho tôi tất cả các phương án mua mỗi loại trái cây một bịch sao cho tổng số tiền không quá 100 đồng (có thể càng tiệm cận 100 đồng càng tốt)?
Cái này là bài toán ba lô (knapsack problem).
Đem ra nói chuyện ở đề tài "mảng" thì tìm lên trời còn không ra chứ đừng nói chuyện "tìm bể dâu chưa ra"

Bài giải không giản dị nhưng nó là căn bản của lập trình quy hoạch. Muốn tiếng Anh hay tiếng Việt thì tôi đã mách cho đủ từ khoá rồi. Gú gô sẽ ra cả đống.
 
Upvote 0
Code dưới đây viết theo nội dung của bài 1324 ở trên.
Bạn điểu chỉnh thêm bớt hoặc gửi file giả định lên giải quyết cho tiện
Cảm ơn bạn nhiều, để mình nghiên cứu tiếp "cộng tiền trong ba lô". Bạn quá siêu!
Bài đã được tự động gộp:

Cái này là bài toán ba lô (knapsack problem).
Đem ra nói chuyện ở đề tài "mảng" thì tìm lên trời còn không ra chứ đừng nói chuyện "tìm bể dâu chưa ra"

Bài giải không giản dị nhưng nó là căn bản của lập trình quy hoạch. Muốn tiếng Anh hay tiếng Việt thì tôi đã mách cho đủ từ khoá rồi. Gú gô sẽ ra cả đống.
Cảm ơn anh cho tôi biết các khái niệm trong lập trình, vì là dân lập trình a-ma-tơ nên lần đầu tôi biết bài toán ba lô. Còn chuyện tìm bể đâu thực ra là nói bể đầu, nghĩ nát óc tìm chưa ra. hihi (lỗi tại thằng đánh máy)
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn nhiều, để mình nghiên cứu tiếp "cộng tiền trong ba lô". Bạn quá siêu!
Bài đã được tự động gộp:


Cảm ơn anh cho tôi biết các khái niệm trong lập trình, vì là dân lập trình a-ma-tơ nên lần đầu tôi biết bài toán ba lô. Còn chuyện tìm bể đâu thực ra là nói bể đầu, nghĩ nát óc tìm chưa ra. hihi (lỗi tại thằng đánh máy)
Bạn có thể tìm từ khoá " thuật toán tham lam" nó sẽ ra rất nhiều nguồn để tham khảo
 
Upvote 0
ACE giúp mình lấy dữ liệu từ Sheets("Data") là mảng 1 chiều sang sheets("Sua") là 1 mảng 2 chiều ( 1 to 3, 1 to (lastcol-1)/3).
 

File đính kèm

Upvote 0
Bạn thử với củ khoai sùng này trước nha, trong khi chờ đợi:
PHP:
Sub EditHD()
  Dim Rng As Range, sRng As Range
  Dim J As Long, Rws As Long, Col As Integer, Dg As Integer
  Dim TD As String
    
   [B1].CurrentRegion.Offset(1, 1).ClearContents
  With Sheets("Data")
        Rws = .[A1].CurrentRegion.Rows.Count
        Col = .[A1].CurrentRegion.Columns.Count
        Set Rng = .[A1].Resize(Rws):                Dg = 2
        Set sRng = Rng.Find([K1].Value, , xlFormulas, xlWhole)
        If sRng Is Nothing Then
            MsgBox "Nothing"
        Else
            For J = 1 To Col - 1
                TD = .Cells(1, sRng.Offset(, J).Column).Value
                Col = Switch(TD = "MH", 1, TD = "SH", 2, TD = "DH", 3, TD = "", 9)
                Cells(Dg, 1 + Col).Value = sRng.Offset(, J).Value
                If J Mod 3 = 0 Then Dg = Dg + 1
            Next J
        End If
   End With
End Sub
 
Upvote 0
Ty Bác, đúng cái yêu cầu mà mỗi tội Em phải đọc thêm mấy cái nữa. may ra mới hiểu tại sao.
 
Upvote 0
Cho code cụ thể thử bạn, tôi tìm bể đâu chưa ra.
Nôm na giống thế này: Đi mua trái cây gồm nhiều loại: me, xoài, cốc, ổi ...; mỗi loại trái có nhiều loại ngon dỡ chất lượng khác nhau nên giá cũng nhiều loại giá khác nhau, từ 1,2,5,...,100 đồng một bịch, kể cả có loại khuyến mãi 0 đồng. Bây giờ tôi có 100 đồng nhưng muốn mua tất cả các loại quả, mỗi loại chỉ một bịch. Tìm cho tôi tất cả các phương án mua mỗi loại trái cây một bịch sao cho tổng số tiền không quá 100 đồng (có thể càng tiệm cận 100 đồng càng tốt)?
Bài đã được tự động gộp:


Cho code cụ thể thử bạn, tôi tìm bể đâu chưa ra.
Nôm na giống thế này: Đi mua trái cây gồm nhiều loại: me, xoài, cốc, ổi ...; mỗi loại trái có nhiều loại ngon dỡ chất lượng khác nhau nên giá cũng nhiều loại giá khác nhau, từ 1,2,5,...,100 đồng một bịch, kể cả có loại khuyến mãi 0 đồng. Bây giờ tôi có 100 đồng nhưng muốn mua tất cả các loại quả, mỗi loại chỉ một bịch. Tìm cho tôi tất cả các phương án mua mỗi loại trái cây một bịch sao cho tổng số tiền không quá 100 đồng (có thể càng tiệm cận 100 đồng càng tốt)?
Mỗi loại trái cây chỉ có thể mua 1 bịch hoặc 0 nên có thể dùng vòng lặp cho biến i chạy từ 1 đến 2^n, n là số loại, số bịch loại trái cây thứ k chính là chữ số thứ k trong biểu diễn nhị phân của i. Từ đó có thể tìm ra tất cả các cách mua và cách mua có số tiền gần đúng nhất.
Mã:
Option Explicit
Sub a()
    Dim Max, tmpMax, i, j, k, m, N, Tong
    Dim Sarr(), KQ(), KQ2()
    Sarr = Range("A1:K1")
    N = UBound(Sarr, 2)
    
    ReDim KQ(1 To 1000000)
    Max = 100
    tmpMax = 0
    k = 0
    For m = 1 To 2 ^ N
        Tong = 0
        For i = 1 To N
            If (m And 2 ^ (i - 1)) > 0 Then Tong = Tong + Sarr(1, i)
            If Tong > Max Then GoTo Thoat
        Next
        If Tong > tmpMax And Tong <= Max Then
            tmpMax = Tong
            k = 1
            KQ(k) = m
        ElseIf Tong = tmpMax Then
            k = k + 1
            KQ(k) = m
        End If
Thoat:
    Next
    
    ReDim KQ2(1 To k, 1 To N)
    For i = 1 To k
        For j = 1 To N
            KQ2(i, j) = IIf((KQ(i) And 2 ^ (j - 1)) > 0, 1, 0)
        Next
    Next
    Range("A2").Resize(k, N) = KQ2
    
End Sub
 

File đính kèm

Upvote 0
Mọi người cho hỏi: Có một mảng gồm r hàng và c cột, làm thế nào để duyệt qua tất cả các tổ hợp, mỗi tổ hợp gồm r phần tử; trong mỗi tổ hợp: mỗi hàng có duy nhất một phần tử trong cột bất kỳ (tổng cộng có c^r tổ hợp). Duyệt qua được tất cả các tổ hợp mình sẽ chọn các tổ hợp thỏa mãn điều kiện sẽ lấy.
Rảnh rổi nên lục lại bài xa xưa :)
Dùng hàm Mod và Int xác định dòng dữ liệu tổ hợp
Dữ liệu có thể nhập lung tung như trong file, nếu dữ liệu không có ô trống, Sub CreateArrDaTa sẽ gọn hơn
Mã:
Sub DuyetToHop()
  Dim sArr(), aRow(), Res()
  Dim sCol&, sRow&, N&, k&, i&, j&, iR&
  Dim tMax As Double, Tong As Double
 
  sArr = Range("A2:E8").Value
  sRow = UBound(sArr, 1):   sCol = UBound(sArr, 2)
  ReDim aRow(1 To sCol + 1)
  Call CreateArrDaTa(sArr, aRow, sRow, sCol)
  N = aRow(1)
  ReDim Res(1 To N, 1 To sCol + 1)
  tMax = 100:  k = 1
  For i = 1 To N
    Tong = 0
    For j = 1 To sCol
      iR = ((i - 1) Mod aRow(j)) \ aRow(j + 1) + 1 'Thu tu dong du lieu
      Res(k, j) = sArr(iR, j)
      Tong = Tong + Res(k, j)
    Next j
    If Tong = tMax Then Res(k, j) = Tong
    If Tong <= tMax Then k = k + 1
  Next i
  Range("G2:L1000000").ClearContents
  If k > 1 Then Range("G2").Resize(k - 1, sCol + 1) = Res
End Sub

Private Sub CreateArrDaTa(sArr, aRow, sRow, sCol)
  Dim j&, i&, k&
  aRow(sCol + 1) = 1
  For j = sCol To 1 Step -1
    k = 0
    For i = 1 To sRow
      tmp = sArr(i, j)
      If Len(tmp) Then
        sArr(i, j) = Empty
        k = k + 1:    sArr(k, j) = tmp
      End If
    Next i
    aRow(j) = aRow(j + 1) * k
  Next j
End Sub
 

File đính kèm

Upvote 0
mình có bài toán liên quan đến mảng này mọi người chỉ giúp
1573652261665.png
mình đã lập được mảng colHoanVi gồm 10 phần tử như hình sau:
1573652700809.png
phần tử đầu tiên là 1 mảng gồm 36 phần tử, mỗi phần tử là tập hợp 3 số hạng có tổng là 7
Câu hỏi đặt ra là:
1573652992043.png

duyệt qua các phần tử của mảng colHoanVi(a)(b)(c) như nào để tìm các nghiệm thỏa mãn tổng MT mỗi cột từ 1 đến 3 đều nhỏ hơn 25, tổng CBM mỗi cột 1 đến 3 nhỏ hơn 2.8
 

File đính kèm

  • 1573651898482.png
    1573651898482.png
    10.8 KB · Đọc: 5
  • ToHop.xlsx
    ToHop.xlsx
    14.5 KB · Đọc: 8
Upvote 0
mình có bài toán liên quan đến mảng này mọi người chỉ giúp
View attachment 228303
mình đã lập được mảng colHoanVi gồm 10 phần tử như hình sau:
View attachment 228304
phần tử đầu tiên là 1 mảng gồm 36 phần tử, mỗi phần tử là tập hợp 3 số hạng có tổng là 7
Câu hỏi đặt ra là:
View attachment 228305

duyệt qua các phần tử của mảng colHoanVi(a)(b)(c) như nào để tìm các nghiệm thỏa mãn tổng MT mỗi cột từ 1 đến 3 đều nhỏ hơn 25, tổng CBM mỗi cột 1 đến 3 nhỏ hơn 2.8
Bạn tham khảo bài #7 tại địa chỉ: https://www.giaiphapexcel.com/diend...liệu-nhiều-dòng-nhiều-cột.146064/#post-943790
Với bài nầy không cần vét cạn tốn thời gian, chỉ cần đoán và thu hẹp phạm vi nghiệm để tăng tốc xử lý
Mã:
Sub ABC()
  Dim sArr(), Arr(), aDKien(), Res(), aGHan
  Dim sRow&, N&, i&, q&, j&, m&
  aGHan = Array(0, 25, 2.8) 'Gioi Han dieu kien
  sArr = Range("B4:E13").Value
  sRow = UBound(sArr)
  ReDim Arr(1 To sRow + 1, 1 To 3)
  Arr(sRow + 1, 3) = 1
  For i = sRow To 1 Step -1
    Arr(i, 3) = Arr(i + 1, 3) * 3
    Arr(i, 2) = Round(sArr(i, 4) / 3, 0)
    Arr(i, 1) = sArr(i, 4) - Arr(i, 2) * 2
  Next i
  N = Arr(1, 3)
  For q = 1 To N
    ReDim aDKien(1 To 2, 1 To 3) 'Mang xet dieu kien
    ReDim Res(1 To sRow, 1 To 3) 'Ket qua
    For i = 1 To sRow
      jcol = ((q - 1) Mod Arr(i, 3)) \ Arr(i + 1, 3) + 1 'Thu tu dong du lieu
      Res(i, jcol) = Arr(i, 1)
      For j = 1 To 3
        If j = jcol Then Res(i, j) = Arr(i, 1) Else Res(i, j) = Arr(i, 2)
        For m = 1 To 2
          aDKien(m, j) = aDKien(m, j) + Res(i, j) * sArr(i, m)
          If aDKien(m, j) > aGHan(m) Then GoTo TroLai
        Next m
      Next j
    Next i
    Range("F4").Resize(sRow, 3) = Res
    Exit Sub
TroLai:
  Next q
  Range("F4:H13").ClearContents
  MsgBox ("Can viet Sub Vet Can, phuc tap va chay lau hon")
End Sub
 

File đính kèm

Upvote 0
Bạn tham khảo bài #7 tại địa chỉ: https://www.giaiphapexcel.com/diendan/threads/function-tạo-tổ-hợp-n-phần-tử-từ-mảng-dữ-liệu-nhiều-dòng-nhiều-cột.146064/#post-943790
Với bài nầy không cần vét cạn tốn thời gian, chỉ cần đoán và thu hẹp phạm vi nghiệm để tăng tốc xử lý
Mã:
Sub ABC()
  Dim sArr(), Arr(), aDKien(), Res(), aGHan
  Dim sRow&, N&, i&, q&, j&, m&
  aGHan = Array(0, 25, 2.8) 'Gioi Han dieu kien
  sArr = Range("B4:E13").Value
  sRow = UBound(sArr)
  ReDim Arr(1 To sRow + 1, 1 To 3)
  Arr(sRow + 1, 3) = 1
  For i = sRow To 1 Step -1
    Arr(i, 3) = Arr(i + 1, 3) * 3
    Arr(i, 2) = Round(sArr(i, 4) / 3, 0)
    Arr(i, 1) = sArr(i, 4) - Arr(i, 2) * 2
  Next i
  N = Arr(1, 3)
  For q = 1 To N
    ReDim aDKien(1 To 2, 1 To 3) 'Mang xet dieu kien
    ReDim Res(1 To sRow, 1 To 3) 'Ket qua
    For i = 1 To sRow
      jcol = ((q - 1) Mod Arr(i, 3)) \ Arr(i + 1, 3) + 1 'Thu tu dong du lieu
      Res(i, jcol) = Arr(i, 1)
      For j = 1 To 3
        If j = jcol Then Res(i, j) = Arr(i, 1) Else Res(i, j) = Arr(i, 2)
        For m = 1 To 2
          aDKien(m, j) = aDKien(m, j) + Res(i, j) * sArr(i, m)
          If aDKien(m, j) > aGHan(m) Then GoTo TroLai
        Next m
      Next j
    Next i
    Range("F4").Resize(sRow, 3) = Res
    Exit Sub
TroLai:
  Next q
  Range("F4:H13").ClearContents
  MsgBox ("Can viet Sub Vet Can, phuc tap va chay lau hon")
End Sub
Cám ơn bác
Nhưng nếu giải theo phần hỏi phía trên của mình với mảng colHoanVi có dạng mảng colHoanVi(x1)(x2)(x3) thì sẽ làm thế nào? Mình chưa biết cách tạo tổ hợp các nghiệm để tìm ra nghiệm nào có tổng các giá trị khác 0 là ít nhất
Dựa theo phương pháp mà bác HieuCD đã từng viết trong topic nào đó
Mã:
            For i = 0 To colThuTu - 1
                TongMT = 0
                TongCBM = 0
                For j = 0 To UBound(exam)
                    TongMT += tRow(j, 0) * ColHoanVi(j)(tArr(0, j))(i)
                    If TongMT > 25.1 Then GoTo thoat
                    TongCBM += tRow(j, 1) * ColHoanVi(j)(tArr(0, j))(i)
                    If TongCBM > 2.8 Then GoTo thoat
                Next j

            Next i
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn bác
Nhưng nếu giải theo phần hỏi phía trên của mình với mảng colHoanVi có dạng mảng colHoanVi(x1)(x2)(x3) thì sẽ làm thế nào? Mình chưa biết cách tạo tổ hợp các nghiệm để tìm ra nghiệm nào có tổng các giá trị khác 0 là ít nhất
Dựa theo phương pháp mà bác HieuCD đã từng viết trong topic nào đó
Mã:
            For i = 0 To colThuTu - 1
                TongMT = 0
                TongCBM = 0
                For j = 0 To UBound(exam)
                    TongMT += tRow(j, 0) * ColHoanVi(j)(tArr(0, j))(i)
                    If TongMT > 25.1 Then GoTo thoat
                    TongCBM += tRow(j, 1) * ColHoanVi(j)(tArr(0, j))(i)
                    If TongCBM > 2.8 Then GoTo thoat
                Next j

            Next i
Bạn tạo 1 mảng sArr gồm 10 cột (ứng với 10 dòng) với số dòng là hoán vị cao nhất( hình như là 36)
Chạy từng dòng lấy hoán vị 3 số thỏa mãn tổng như bạn đã làm và gán vào từng cột tương ứng, dòng 1 gán cột 1, dòng 2 gán cột 2. Để nhẹ bộ nhớ có thể chỉ gán số thứ tự
Dùng Function để lấy các mảng các tổ hợp của 10 dòng
Mang = CreateToHop( sArr , True)
Mỗi dòng của mảng là 1 phương án
Hy vọng máy tính đủ bộ nhớ
Mã:
Function CreateToHop(ByVal sArr As Variant, Optional ByVal bNotBlank = False) As Variant
'CreateToHop: Liet ke to hop N phan tu cua "Mang" 2 chieu "sArr"
'sArr: Là Array hoac Range, neu khac se tra ve "Empty"
'bNotBlank: Là giá tri luan ly, mac dinh = False lay ca gia tri "Empty"
'bNotBlank = True: Loai bo gia tri "Empty", neu có Cot chi co gia tri "Empty", Function tra ve "Empty"
  Dim aRow(), Res(), sCol&, sRow&, N As Double, i As Double, j&, iR&, tmp

  On Error Resume Next
  If TypeName(sArr) = "Range" Then
    If sArr.Count = 1 Then
      tmp = sArr.Value
      ReDim sArr(1 To 1, 1 To 1)
      sArr(1, 1) = tmp
    Else
      sArr = sArr.Value
    End If
  End If
  sRow = UBound(sArr, 1):   sCol = UBound(sArr, 2)
  If Err.Number > 0 Then Exit Function

  Call AddValue_aRow(sArr, aRow, sRow, sCol, bNotBlank)
  N = aRow(1)
  If N = 0 Then Exit Function
  ReDim Res(1 To N, 1 To sCol)
  For i = 1 To N
    For j = 1 To sCol
      iR = ((i - 1) Mod aRow(j)) \ aRow(j + 1) + 1 'Thu tu dong du lieu
      If sArr(iR, j) = Empty Then Res(i, j) = "" Else Res(i, j) = sArr(iR, j)
    Next j
  Next i
  CreateToHop = Res
End Function

Private Sub AddValue_aRow(sArr, aRow, sRow, sCol, bNotBlank)
  Dim i&, j&, k&, tmp
  ReDim aRow(1 To sCol + 1)
  aRow(sCol + 1) = 1
  If bNotBlank = False Then
    For j = sCol To 1 Step -1
      aRow(j) = sRow * aRow(j + 1)
    Next j
  Else
    For j = sCol To 1 Step -1
      k = 0
      For i = 1 To sRow
        tmp = sArr(i, j)
        If Len(tmp) Then
          sArr(i, j) = Empty
          k = k + 1
          sArr(k, j) = tmp
        End If
      Next i
      If k > 0 Then aRow(j) = k * aRow(j + 1)
    Next j
  End If
End Sub
 
Upvote 0
Bạn tạo 1 mảng sArr gồm 10 cột (ứng với 10 dòng) với số dòng là hoán vị cao nhất( hình như là 36)
Chạy từng dòng lấy hoán vị 3 số thỏa mãn tổng như bạn đã làm và gán vào từng cột tương ứng, dòng 1 gán cột 1, dòng 2 gán cột 2. Để nhẹ bộ nhớ có thể chỉ gán số thứ tự
Dùng Function để lấy các mảng các tổ hợp của 10 dòng
Mang = CreateToHop( sArr , True)
Mỗi dòng của mảng là 1 phương án
Hy vọng máy tính đủ bộ nhớ
Mã:
Function CreateToHop(ByVal sArr As Variant, Optional ByVal bNotBlank = False) As Variant
'CreateToHop: Liet ke to hop N phan tu cua "Mang" 2 chieu "sArr"
'sArr: Là Array hoac Range, neu khac se tra ve "Empty"
'bNotBlank: Là giá tri luan ly, mac dinh = False lay ca gia tri "Empty"
'bNotBlank = True: Loai bo gia tri "Empty", neu có Cot chi co gia tri "Empty", Function tra ve "Empty"
  Dim aRow(), Res(), sCol&, sRow&, N As Double, i As Double, j&, iR&, tmp

  On Error Resume Next
  If TypeName(sArr) = "Range" Then
    If sArr.Count = 1 Then
      tmp = sArr.Value
      ReDim sArr(1 To 1, 1 To 1)
      sArr(1, 1) = tmp
    Else
      sArr = sArr.Value
    End If
  End If
  sRow = UBound(sArr, 1):   sCol = UBound(sArr, 2)
  If Err.Number > 0 Then Exit Function

  Call AddValue_aRow(sArr, aRow, sRow, sCol, bNotBlank)
  N = aRow(1)
  If N = 0 Then Exit Function
  ReDim Res(1 To N, 1 To sCol)
  For i = 1 To N
    For j = 1 To sCol
      iR = ((i - 1) Mod aRow(j)) \ aRow(j + 1) + 1 'Thu tu dong du lieu
      If sArr(iR, j) = Empty Then Res(i, j) = "" Else Res(i, j) = sArr(iR, j)
    Next j
  Next i
  CreateToHop = Res
End Function

Private Sub AddValue_aRow(sArr, aRow, sRow, sCol, bNotBlank)
  Dim i&, j&, k&, tmp
  ReDim aRow(1 To sCol + 1)
  aRow(sCol + 1) = 1
  If bNotBlank = False Then
    For j = sCol To 1 Step -1
      aRow(j) = sRow * aRow(j + 1)
    Next j
  Else
    For j = sCol To 1 Step -1
      k = 0
      For i = 1 To sRow
        tmp = sArr(i, j)
        If Len(tmp) Then
          sArr(i, j) = Empty
          k = k + 1
          sArr(k, j) = tmp
        End If
      Next i
      If k > 0 Then aRow(j) = k * aRow(j + 1)
    Next j
  End If
End Sub
Đây là chương trình mình viết trong Visual Studio
vẫn với yêu cầu TongKg mỗi cột không quá 25 và TongM3 mỗi cột không quá 2.8 (như bài trên)
nhưng đang mắc ở Sub TestCol_KetQua() chưa lập được TỔ HỢP CÁC NGHIỆM để tìm ra nghiệm 3 cột có giá trị trong mỗi cột >0 là ít nhất thế nào?

Mã:
Module Module1
    Public SoBo As Integer ' n là số bó cần phân tích thành tổng
    Public w, SoLuongCont, CountColHV, iColHV As Integer ' w là số đếm các giá trị của mảng giá trị có tổng là số bó, chưa hóan vị
    Public PhanTichTong, y ' Mảng các giá trị có tổng là số bó, chưa hoán vị
    Public StringNum As String
    Public st As Stopwatch
    Public countTamHV As Integer
    Public cDanhDauHoanVi, xHV, ArrTamHV, Dic, DicBo
    Dim tRow(9, 1)

    Public HoanViTong, ColHoanVi

    Public aSo() As Byte
    Public tTong() As Integer
    Public exam(9)
    Sub Main()
        '------Chương trình Phân tích Tổng- Start------
        st = New Stopwatch
        tRow(0, 0) = 1.46 : tRow(0, 1) = 0.12
        tRow(1, 0) = 1.46 : tRow(1, 1) = 0.16
        tRow(2, 0) = 1.33 : tRow(2, 1) = 0.18
        tRow(3, 0) = 1.5 : tRow(3, 1) = 0.16
        tRow(4, 0) = 1.46 : tRow(4, 1) = 0.2
        tRow(5, 0) = 1.93 : tRow(5, 1) = 0.2
        tRow(6, 0) = 1.54 : tRow(6, 1) = 0.16
        tRow(7, 0) = 0.87 : tRow(7, 1) = 0.16
        tRow(8, 0) = 1.74 : tRow(8, 1) = 0.12
        tRow(9, 0) = 1.03 : tRow(9, 1) = 0.16

        exam(0) = 7
        exam(1) = 5
        exam(2) = 5
        exam(3) = 4
        exam(4) = 5
        exam(5) = 5
        exam(6) = 5
        exam(7) = 7
        exam(8) = 5
        exam(9) = 4


        SoLuongCont = 3
        'SoBo = 41
        st.Start()
        DicBo = CreateObject("Scripting.Dictionary")
        DicBo.CompareMode = vbTextCompare
        For thu = 0 To 9
            SoBo = exam(thu)
            If Not DicBo.Exists(SoBo) Then
                Call Phantich()
                iColHV += 1
                DicBo(SoBo) = ColHoanVi(iColHV - 1)
            Else
                CountColHV += 1
                ReDim Preserve ColHoanVi(CountColHV - 1)
                ColHoanVi(CountColHV - 1) = DicBo(SoBo)
            End If
        Next
        DicBo.RemoveAll
        'Console.WriteLine("Nhap vao so So Bo")
        'SoBo = Console.ReadLine
        'Console.WriteLine("Nhap vao So Luong Cont")
        'SoLuongCont = Console.ReadLine

        TestCol_KetQua()
        st.Stop()
        Console.WriteLine(st.Elapsed)
        Console.ReadKey()
    End Sub
    Sub Phantich()
        Dic = CreateObject("Scripting.Dictionary")
        Dic.CompareMode = vbTextCompare

        ReDim aSo(SoBo)
        ReDim tTong(SoBo)
        aSo(0) = 1
        LuiPT(1)
        CountColHV += 1
        ReDim Preserve ColHoanVi(CountColHV - 1)
        ColHoanVi(CountColHV - 1) = HoanViTong

        Dic.RemoveAll
        Erase aSo, tTong
        countTamHV = Nothing
        y = Nothing
        StringNum = Nothing
        cDanhDauHoanVi = Nothing
        xHV = Nothing
        ArrTamHV = Nothing
        HoanViTong = Nothing
    End Sub
    Sub LuiPT(xPT As Short)
        For z = aSo(xPT - 1) To (SoBo - tTong(xPT - 1)) / 2
            aSo(xPT) = z
            tTong(xPT) = tTong(xPT - 1) + z
            LuiPT(xPT + 1)
        Next
        aSo(xPT) = SoBo - tTong(xPT - 1)
        If xPT = SoLuongCont Then
            ReDim y(SoLuongCont - 1)
            For k = 1 To xPT - 1
                y(k - 1) = aSo(k)
            Next
            y(xPT - 1) = aSo(xPT)
            Call HoanVi()
        ElseIf xPT < SoLuongCont Then
            ReDim y(SoLuongCont - 1)
            For k = 1 To xPT - 1
                y(k - 1) = aSo(k)
            Next
            y(xPT - 1) = aSo(xPT)
            For iBosung = xPT To SoLuongCont - 1
                y(iBosung) = 0
            Next
            Call HoanVi()
        End If
    End Sub
    '------Chương trình Phân tích Tổng- End------
    '------Chương trình Hoán Vị - Start------
    Sub HoanVi()
        ReDim cDanhDauHoanVi(SoLuongCont - 1)
        ReDim xHV(SoLuongCont - 1)
        For vHV = 0 To SoLuongCont - 1
            cDanhDauHoanVi(vHV) = True
        Next
        LuiHoanVi(0)
    End Sub
    Sub LuiHoanVi(iHV As Short)
        StringNum = vbNullString
        For uHV = 0 To SoLuongCont - 1
            If cDanhDauHoanVi(uHV) Then
                xHV(iHV) = uHV
                'Neu i= k thi in ra ket qua
                If iHV = SoLuongCont - 1 Then
                    ReDim ArrTamHV(SoLuongCont - 1)
                    For vHV = 0 To SoLuongCont - 1 ' Thiết lập chuỗi Key
                        StringNum += Str(y(xHV(vHV))) ' xHV(v) chỉ số 0,1,2,3,4
                    Next
                    If Not Dic.exists(StringNum) Then
                        Dic(StringNum) = StringNum
                        For vHV = 0 To SoLuongCont - 1 ' in ra chuoi Hoan Vi
                            ArrTamHV(vHV) = y(xHV(vHV)) ' xHV(v) chỉ số 0,1,2,3,4
                        Next
                        countTamHV += 1
                        ReDim Preserve HoanViTong(countTamHV - 1)
                        HoanViTong(countTamHV - 1) = ArrTamHV
                    End If
                Else
                        cDanhDauHoanVi(uHV) = False
                    LuiHoanVi(iHV + 1)
                    cDanhDauHoanVi(uHV) = True
                End If
            End If
        Next
    End Sub
 
Upvote 0
Đây là chương trình mình viết trong Visual Studio
vẫn với yêu cầu TongKg mỗi cột không quá 25 và TongM3 mỗi cột không quá 2.8 (như bài trên)
nhưng đang mắc ở Sub TestCol_KetQua() chưa lập được TỔ HỢP CÁC NGHIỆM để tìm ra nghiệm 3 cột có giá trị trong mỗi cột >0 là ít nhất thế nào?

Mã:
Module Module1
    Public SoBo As Integer ' n là số bó cần phân tích thành tổng
    Public w, SoLuongCont, CountColHV, iColHV As Integer ' w là số đếm các giá trị của mảng giá trị có tổng là số bó, chưa hóan vị
    Public PhanTichTong, y ' Mảng các giá trị có tổng là số bó, chưa hoán vị
    Public StringNum As String
    Public st As Stopwatch
    Public countTamHV As Integer
    Public cDanhDauHoanVi, xHV, ArrTamHV, Dic, DicBo
    Dim tRow(9, 1)

    Public HoanViTong, ColHoanVi

    Public aSo() As Byte
    Public tTong() As Integer
    Public exam(9)
    Sub Main()
        '------Chương trình Phân tích Tổng- Start------
        st = New Stopwatch
        tRow(0, 0) = 1.46 : tRow(0, 1) = 0.12
        tRow(1, 0) = 1.46 : tRow(1, 1) = 0.16
        tRow(2, 0) = 1.33 : tRow(2, 1) = 0.18
        tRow(3, 0) = 1.5 : tRow(3, 1) = 0.16
        tRow(4, 0) = 1.46 : tRow(4, 1) = 0.2
        tRow(5, 0) = 1.93 : tRow(5, 1) = 0.2
        tRow(6, 0) = 1.54 : tRow(6, 1) = 0.16
        tRow(7, 0) = 0.87 : tRow(7, 1) = 0.16
        tRow(8, 0) = 1.74 : tRow(8, 1) = 0.12
        tRow(9, 0) = 1.03 : tRow(9, 1) = 0.16

        exam(0) = 7
        exam(1) = 5
        exam(2) = 5
        exam(3) = 4
        exam(4) = 5
        exam(5) = 5
        exam(6) = 5
        exam(7) = 7
        exam(8) = 5
        exam(9) = 4


        SoLuongCont = 3
        'SoBo = 41
        st.Start()
        DicBo = CreateObject("Scripting.Dictionary")
        DicBo.CompareMode = vbTextCompare
        For thu = 0 To 9
            SoBo = exam(thu)
            If Not DicBo.Exists(SoBo) Then
                Call Phantich()
                iColHV += 1
                DicBo(SoBo) = ColHoanVi(iColHV - 1)
            Else
                CountColHV += 1
                ReDim Preserve ColHoanVi(CountColHV - 1)
                ColHoanVi(CountColHV - 1) = DicBo(SoBo)
            End If
        Next
        DicBo.RemoveAll
        'Console.WriteLine("Nhap vao so So Bo")
        'SoBo = Console.ReadLine
        'Console.WriteLine("Nhap vao So Luong Cont")
        'SoLuongCont = Console.ReadLine

        TestCol_KetQua()
        st.Stop()
        Console.WriteLine(st.Elapsed)
        Console.ReadKey()
    End Sub
    Sub Phantich()
        Dic = CreateObject("Scripting.Dictionary")
        Dic.CompareMode = vbTextCompare

        ReDim aSo(SoBo)
        ReDim tTong(SoBo)
        aSo(0) = 1
        LuiPT(1)
        CountColHV += 1
        ReDim Preserve ColHoanVi(CountColHV - 1)
        ColHoanVi(CountColHV - 1) = HoanViTong

        Dic.RemoveAll
        Erase aSo, tTong
        countTamHV = Nothing
        y = Nothing
        StringNum = Nothing
        cDanhDauHoanVi = Nothing
        xHV = Nothing
        ArrTamHV = Nothing
        HoanViTong = Nothing
    End Sub
    Sub LuiPT(xPT As Short)
        For z = aSo(xPT - 1) To (SoBo - tTong(xPT - 1)) / 2
            aSo(xPT) = z
            tTong(xPT) = tTong(xPT - 1) + z
            LuiPT(xPT + 1)
        Next
        aSo(xPT) = SoBo - tTong(xPT - 1)
        If xPT = SoLuongCont Then
            ReDim y(SoLuongCont - 1)
            For k = 1 To xPT - 1
                y(k - 1) = aSo(k)
            Next
            y(xPT - 1) = aSo(xPT)
            Call HoanVi()
        ElseIf xPT < SoLuongCont Then
            ReDim y(SoLuongCont - 1)
            For k = 1 To xPT - 1
                y(k - 1) = aSo(k)
            Next
            y(xPT - 1) = aSo(xPT)
            For iBosung = xPT To SoLuongCont - 1
                y(iBosung) = 0
            Next
            Call HoanVi()
        End If
    End Sub
    '------Chương trình Phân tích Tổng- End------
    '------Chương trình Hoán Vị - Start------
    Sub HoanVi()
        ReDim cDanhDauHoanVi(SoLuongCont - 1)
        ReDim xHV(SoLuongCont - 1)
        For vHV = 0 To SoLuongCont - 1
            cDanhDauHoanVi(vHV) = True
        Next
        LuiHoanVi(0)
    End Sub
    Sub LuiHoanVi(iHV As Short)
        StringNum = vbNullString
        For uHV = 0 To SoLuongCont - 1
            If cDanhDauHoanVi(uHV) Then
                xHV(iHV) = uHV
                'Neu i= k thi in ra ket qua
                If iHV = SoLuongCont - 1 Then
                    ReDim ArrTamHV(SoLuongCont - 1)
                    For vHV = 0 To SoLuongCont - 1 ' Thiết lập chuỗi Key
                        StringNum += Str(y(xHV(vHV))) ' xHV(v) chỉ số 0,1,2,3,4
                    Next
                    If Not Dic.exists(StringNum) Then
                        Dic(StringNum) = StringNum
                        For vHV = 0 To SoLuongCont - 1 ' in ra chuoi Hoan Vi
                            ArrTamHV(vHV) = y(xHV(vHV)) ' xHV(v) chỉ số 0,1,2,3,4
                        Next
                        countTamHV += 1
                        ReDim Preserve HoanViTong(countTamHV - 1)
                        HoanViTong(countTamHV - 1) = ArrTamHV
                    End If
                Else
                        cDanhDauHoanVi(uHV) = False
                    LuiHoanVi(iHV + 1)
                    cDanhDauHoanVi(uHV) = True
                End If
            End If
        Next
    End Sub
Số khả năng quá lớn có tới 14 chữ số, mình không có thời gian chạy thử 10 dòng, chỉ chạy thử với 8 dòng dữ liệu, thêm dòng dữ liệu thời gian tăng lên hơn cấp số nhân
Nếu số khả năng tăng lên vượt quá 15 chữ số, sub sẽ tiêu vì giới hạn tính toán số trong VBA
Nếu bỏ công sức tách code thành các sub nhỏ tìm theo số thứ tự từ thấp đến cao của số giá trị >0 có thể rút ngắn thời gian
Mã:
Sub XYZ()
  Dim aMT_CBM(), aSL(), aGHan
  Dim Dic As Object, ToHop, ikey
  Dim sRow&, i&
  Const sCol As Long = 3
  aGHan = Array(0, 25, 2.8) 'Gioi Han dieu kien
  aMT_CBM = Range("B4:C11").Value
  aSL = Range("E4:E11").Value
  sRow = UBound(aSL)
  ReDim Res(1 To sRow, 1 To 3) 'Ket qua
  Set Dic = CreateObject("scripting.dictionary")
  For i = 1 To sRow 'Tao To Hop tung gia tri So Luong
    ikey = aSL(i, 1)
    If Dic.exists(ikey) = False Then
      Call CreateToHopSoLuong(ToHop, sCol, ikey)
      Dic.Add ikey, ToHop
    End If
  Next i
  Call KetQua(Dic, aMT_CBM, aSL, aGHan, sRow, sCol)
End Sub

Private Sub KetQua(Dic, aMT_CBM, aSL, aGHan, sRow, sCol)
  Dim ToHop, aRow(), aDKien(), Res()
  Dim i&, j&, iR&, q As Double, N As Double, t As Double, iMin&, dem&
  ReDim aRow(1 To sRow + 1) 'Tao mang xac dinh thu tu dong
  aRow(sRow + 1) = 1
  For i = sRow To 1 Step -1
    aRow(i) = UBound(Dic.Item(aSL(i, 1))) * aRow(i + 1)
  Next i
  N = aRow(1) 'So kha nang
  iMin = sRow * sCol + 1
  For q = 1 To N
    dem = 0
    ReDim Res(1 To sRow, 1 To sCol)
    ReDim aDKien(1 To 2, 1 To sCol) 'Mang xet dieu kien
    For i = 1 To sRow
      t = q - 1
      Do While t >= aRow(i)
        t = t - aRow(i)
      Loop
      iR = Int(t / aRow(i + 1)) + 1
      ToHop = Dic.Item(aSL(i, 1))
      For j = 1 To sCol
        Res(i, j) = ToHop(iR, j)
        For m = 1 To 2
          aDKien(m, j) = aDKien(m, j) + Res(i, j) * aMT_CBM(i, m)
          If aDKien(m, j) > aGHan(m) Then GoTo TroLai
        Next m
      Next j
      dem = dem + ToHop(iR, sCol + 1)
    Next i
    If iMin > dem Then
      Range("F4").Resize(sRow, sCol) = Res
      iMin = dem
      If iMin = sRow Then Exit Sub
    End If
TroLai:
  Next q
End Sub

Private Sub CreateToHopSoLuong(ToHop, sCol, ByVal SL As Long)
  Dim sArr(), aRow(), tmp(), i&, j&, q&, iR&, N&, tong&
  ReDim aRow(1 To sCol)  'Tao mang xac dinh thu tu dong
  aRow(sCol) = 1
  For j = sCol - 1 To 1 Step -1
    aRow(j) = (SL + 1) * aRow(j + 1)
  Next j
  N = aRow(1)
  ReDim sArr(1 To N, 1 To sCol + 1)
  For i = 1 To N
    tong = 0
    ReDim tmp(1 To sCol)
    For j = 1 To sCol - 1
      iR = ((i - 1) Mod aRow(j)) \ aRow(j + 1)
      tong = tong + iR
      If tong > SL Then Exit For
      tmp(j) = iR
      If iR > 0 Then tmp(sCol) = tmp(sCol) + 1 ' so gia tri ket qua >0
    Next j
    If j = sCol Then
      k = k + 1
      For q = 1 To sCol - 1
        sArr(k, q) = tmp(q)
      Next q
      sArr(k, sCol) = SL - tong
      If sArr(k, sCol) > 0 Then tmp(sCol) = tmp(sCol) + 1 ' so gia tri ket qua >0
      sArr(k, sCol + 1) = tmp(sCol) ' so gia tri ket qua >0
    End If
  Next i
  ReDim ToHop(1 To k, 1 To sCol + 1) 'Tao mang ToHop
  For i = 1 To k
    For j = 1 To sCol + 1
      ToHop(i, j) = sArr(i, j)
    Next j
  Next i
  Erase sArr: Erase aRow: Erase tmp
End Sub
 
Upvote 0
Em nhờ các bác giúp 4 trường hợp sau giúp:


1/ Code VBA để coppy sau VD: Sheet 1
Khi ta dang Mở File C ở Sheet 1 có 1 nút "coppy" Khi click vào Nút "Coppy" thì Coppy tất cả các hàng trong Sheet1 File A những cột A,B,C,D Nếu thỏa cột B có chữ "nhà xe" vào Sheet1 File C


2/ Code VBA để coppy sau VD: Sheet 2
Khi ta dang Mở Sheet2 File C ở Sheet 2 có 1 nút "coppy" Khi click vào Nút "Coppy" thì Coppy tất cả các hàng trong Sheet2 File A những cột A,B,C,D,E,F,G,H,I,K Nếu thỏa cột C Không có chữ "HQ" vào Sheet2 File C

3/ Code VBA để coppy sau VD: Sheet 3
Khi dang lam viec o Sheet3 FileA có các hàng dữ liệu liền nhau có các cột A,B,C,D,E và trong sheet đó có nút Coppy. Nếu Click vào nút Coppy mà thỏa mãn 2 điều kiện sau:
- Dieu kien 1: cột A trong Sheet3 FileC và cột A Sheet3 FileA (sheet và file hiện thời làm việc) có số số liệu trùng nhau.
- Dieu kien 2: cột F trong Sheet3 FileC không có dấu "x"
thì sẽ coppy các dữ liệu của các hàng ở Cột C,D,E của Sheet3 FileC sang các cột C,D,E của Sheet3 FileA
(lưu ý giúp: dữ liệu hãng ở Sheet3 FileA có thể ko liền nhau)

4/ VD: Sheet 4
Trong 1 Form có 2 text boxt sau:
Text boxt 1, Text boxt 2
Khi nhập dữ liệu vào Text boxt 1 bấm enter thì Text boxt 2 ktra 3 ký tự đầu của
Text boxt 1 nếu có 3 chữ "kle" thì Text boxt 2 sẽ tự điền là "kh" còn ko có Text boxt 2 sẽ điền "nhà xe"
 

File đính kèm

Upvote 0
Nhờ anh/chị thông não cá vàng giúp em :D
Giả sử, em có mảng 2 chiều Array(1 to 15, 1 to 6)
Giờ em muốn gán các giá trị Array(10 to 15, 1 to 6) xuống SheetForm không dùng vòng lặp bằng cách nào ạ?
 
Upvote 0
SheetForm là cái gì? và giá trị Array(10 to 15, 1 to 6) là gì?
Nếu nó là Sheet, không phải là Form, và muốn gán mảng từ dòng 10 đến dòng 15 thì có 2 cách:
Cách 1
1. Tạm gán cả mảng xuống một vùng nào đó trống trải trên sheet
2. Copy kể từ dòng 10 của vùng này vào 1 array khác
3. Gán array mới vào đúng nơi mong muốn
4. Delete vùng tạm
Cách 2
1. Gán cả mảng vào nơi mong muốn
2. Delete 9 dòng đầu
 
Upvote 0
SheetForm là cái gì? và giá trị Array(10 to 15, 1 to 6) là gì?
Nếu nó là Sheet, không phải là Form, và muốn gán mảng từ dòng 10 đến dòng 15 thì có 2 cách:
Cách 1
1. Tạm gán cả mảng xuống một vùng nào đó trống trải trên sheet
2. Copy kể từ dòng 10 của vùng này vào 1 array khác
3. Gán array mới vào đúng nơi mong muốn
4. Delete vùng tạm
Cách 2
1. Gán cả mảng vào nơi mong muốn
2. Delete 9 dòng đầu

Anh @VetMini làm em giật mình, em tưởng em sử dụng sai thuật ngữ nhưng em kiểm tra lại thì không sai. Hihi... (em xin gửi hình và link SheetForm của 1 trang web dạy Vba Excel khá nổi tiếng ở dưới ạ)

Giá trị Array(10 to 15, 1 to 6) đại khái là mảng 2 chiều có dữ liệu từ dòng 1 đến dòng 15, cột 1 đến cột 6 nhưng em chỉ cần lấy dữ liệu từ dòng 10 đến dòng 15 và cột 1 đến cột 6 thôi ạ. (Có khả năng trình độ em kém em sử dụng thuật ngữ sai, mong anh bỏ qua giúp em)

Tình hình là 2 cách anh đưa ra thì không cách nào khả thi hết
Cách 1 thì mất nhiều công đoạn quá,
Còn cách 2 thì nếu có dữ liệu trước vị trí cần thêm dữ liệu thì cũng hơi căng à :)

1581180325102.png
 
Upvote 0
Anh @VetMini làm em giật mình, em tưởng em sử dụng sai thuật ngữ nhưng em kiểm tra lại thì không sai. Hihi... (em xin gửi hình và link SheetForm của 1 trang web dạy Vba Excel khá nổi tiếng ở dưới ạ)

Giá trị Array(10 to 15, 1 to 6) đại khái là mảng 2 chiều có dữ liệu từ dòng 1 đến dòng 15, cột 1 đến cột 6 nhưng em chỉ cần lấy dữ liệu từ dòng 10 đến dòng 15 và cột 1 đến cột 6 thôi ạ. (Có khả năng trình độ em kém em sử dụng thuật ngữ sai, mong anh bỏ qua giúp em)

Tình hình là 2 cách anh đưa ra thì không cách nào khả thi hết
Cách 1 thì mất nhiều công đoạn quá,
Còn cách 2 thì nếu có dữ liệu trước vị trí cần thêm dữ liệu thì cũng hơi căng à :)

View attachment 231770
Cả 2 cách của bác Vetmini đều khả thi nhé

Anh giải thích rõ hơn chổ "Biến của Array(10 to 15, 1 to 6)" giúp em ạ?
Em ví dụ có file bên dưới.
Thì tôi nghĩ bạn có khai báo 1 biến Array theo cách: Dim a As Array(10 to 15, 1 to 6)
Thì sẽ làm như bài trên tôi chỉ.

Tuy thế, thấy các bài sau bạn giải thích là muốn gán 1 phần Array thôi, thì cách tốt nhất là: Đổ cái phần giá trị Array đó ra 1 biến Array nhỏ - rồi gán Array nhỏ xuống Sheet thôi.

Việc "Đổ cái phần giá trị", thì chắc không phải bàn, bạn đã biết, dùng cách nào thì tùy - có thể dùng FOR cũng nhanh chán, đảm bảo chưa đến 1/10 nốt nhạc thì đã đổ xong cho bảng 6*6
 
Upvote 0
Giả sử, em có mảng 2 chiều Array(1 to 15, 1 to 6)
Giờ em muốn gán các giá trị Array(10 to 15, 1 to 6) xuống SheetForm không dùng vòng lặp bằng cách nào ạ?
Bạn hãy cho biết cách mà bạn sở hữu mảng 2 chiều đó; & khi ý biết đạu có cách nào khác nữa chăng!
 
Upvote 0
Giả sử, em mảng 2 chiều Array(1 to 15, 1 to 6)
Giờ em muốn gán các giá trị Array(10 to 15, 1 to 6) xuống SheetForm không dùng vòng lặp bằng cách nào ạ?
Ngoài các cách của bác VetMini thì cũng có thể dùng hàm INDEX.

Mã:
Sub TestArray()
Dim A(1 To 15, 1 To 6) As Long
Dim r As Long, c As Long, k As Long
Dim arrRow(10 To 15, 1 To 1), arrCol(1 To 6)
'    mảng các chỉ số dòng
    For k = 10 To 15
        arrRow(k, 1) = k
    Next k
'    mảng các chỉ số  cột
    For k = 1 To 6
        arrCol(k) = k
    Next k
    k = 0
'    nhập giá trị vào mảng A
    For r = 1 To 15
        For c = 1 To 6
            k = k + 1
            A(r, c) = k
        Next c
    Next r
'    nhập mảng A xuống sheet để tiện theo dõi mảng 6 dòng
    Range("A1").Resize(15, 6) = A
'    nhập mảng có từ 6 dòng cuối của A xuống sheet, dùng các hằng số mảng
    Range("H1").Resize(6, 6) = Application.Index(A, [{10;11;12;13;14;15}], Array(1, 2, 3, 4, 5, 6))
'    nhập mảng có từ 6 dòng cuối của  A xuống sheet, dùng mảng các chỉ số dòng và mảng các chỉ số cột
    Range("H10").Resize(6, 6) = Application.Index(A, arrRow, arrCol)
   
'    Tương tự trên sheet: chọn vùng H1:M6 -> nhập công thức
'    =INDEX(A1:F15,{10,11,12,13,14,15},{1\2\3\4\5\6}) -> kết thúc bằng Ctrl + Shift + Enter.

'    Về dấu "\" có thể trên mỗi máy khác nhau. Ở đâu đó hãy nhập công thức
'    =SUM(A1:B2) -> trên thanh công thức bôi đen A1:B2 -> nhấn F9. Nhìn thấy
'    giữa 1 và 2 là dấu gì thì thay nó vào vị trí các dấu "\" trong trong công thức ở trên.
   
'    ---------------
'    Phần thưởng thêm, miễn phí
'    1. Nhập mảng các phần tử từ các dòng 7, 8, 11, 14, và từ các cột 1, 3, 5 - mảng các phần tử ở
'    các điểm giao của các dòng 7, 8, 11, 14 và các cột 1, 3, 5
    Range("A20").Resize(4, 3) = Application.Index(A, [{7;8;11;14}], Array(1, 3, 5))
   
'    2. Lấy vùng từ dòng 7 đến 10, cột từ 3 đến 5
    Range("E20").Resize(4, 3) = Application.Index(A, [{7;8;9;10}], Array(3, 4, 5))
'    Tương tự trên sheet: chọn E20:G23 -> nhập công thức
'    =INDEX(A1:F15, {7,8,9,10}, {3\4\5}) -> kết thúc bằng Ctrl + Shift + Enter.
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
... em tưởng em sử dụng sai thuật ngữ nhưng em kiểm tra lại thì không sai. ...
"giá trị Array(10 to 15, 1 to 6)" chắc chắn là sai thuật ngữ. Tuy nhiên có thể tạm đoán được, cũng như con nít nói bập bẹ người ta cũng có hy vọng đoán được.
SheetForm là một tên riêng. Nếu đề cập đến mọt danh tự riêng và khong phổ biến mà không cho biết ngữ cảnh thì cũng là sai thuật ngữ.
 
Upvote 0
"giá trị Array(10 to 15, 1 to 6)" chắc chắn là sai thuật ngữ. Tuy nhiên có thể tạm đoán được, cũng như con nít nói bập bẹ người ta cũng có hy vọng đoán được.
SheetForm là một tên riêng. Nếu đề cập đến mọt danh tự riêng và khong phổ biến mà không cho biết ngữ cảnh thì cũng là sai thuật ngữ.
Ở cái diễn đàn củ khoai này, thì người hỏi (khách hàng không trả tiền) là thượng đế cứ yêu cầu hỏi sao cũng được, người giúp đi mà hiểu, tìm hiểu. Hỏi lại cũng nhiều khi quyết không nói..., được giúp 1 lại muốn 2 ... muốn 3...4 .....--> thế mà tương lai sánh các cường quốc năm châu sao đây (trong khi các cường quốc người ta đẻ ra bộ Office để cho người dùng tiện lợi rồi, vậy mà còn cần giúp cần ... tự động). Lạ thay
 
Lần chỉnh sửa cuối:
Upvote 0
Ở cái diễn đàn củ khoai này, thì người hỏi (khách hàng) là thượng đế cứ yêu cầu hỏi sao cũng được, người giúp đi mà hiểu, tìm hiểu. Hỏi lại cũng nhiều khi quyết không nói..., được giúp 1 lại muốn 2 ... muốn 3...4 .....--> .... Lạ thay
Thiếu điều nói: "Ngu sao không hiểu người ta hỏi gì?" nữa kia đó!
 
Upvote 0

File đính kèm

Upvote 0
anh @SA_DQ nói quá, em út nào dám đâu. Hic...



Như file em đính kèm, anh xem lại giúp em ạ.
Như dòng đỏ, bạn quyết không nói bắt người ta xem file kèm
Theo ngu kiến của tôi: muốn thuận lợi cho có kết quả thì bạn phải mô tả ra cả ở bài viết lẫn file kèm. Không nên đẩy cái khó cho chính người giúp hay có ý định xem bài giúp mình.
 
Lần chỉnh sửa cuối:
Upvote 0
Như dòng đỏ, bạn quyết không nói bắt người ta xem file kèm
Theo ngu kiến của tôi: muốn thuận lợi cho có kết quả thì bạn phải mô tả ra cả ở bài viết lẫn file kèm

Dạ, ý em có 1 mảng nguồn từ B2:D16, kết quả em cần gán từ B2:D16 ạ

1581239482267.png
 
Upvote 0
Bạn không thể gán khơi khơi, mà muốn gán vùng [B10 : D16] phải có điều kiện nào đó, ví dụ như chỉ lấy 07 dòng cuối trong mảng(?) đem gán, hay. . . .
 
Upvote 0
Dạ, ý em có 1 mảng nguồn từ B2:D16, kết quả em cần gán từ B2:D16 ạ

View attachment 231785
Nếu chỉ là code sai tè le này
trong file
Mã:
Sub test()
    Dim Arr
    Arr = Sheet1.Range("B2:D16").Value
    Sheet1.Range("G2").Resize(6, 6).Value
End Sub

Thì sao lại không là
Mã:
Sub test()
    Dim Arr
    Arr = Sheet1.Range("B10:D16").Value
    Sheet1.Range("G2").Resize(7, 3).Value=Arr
End Sub

hay
Mã:
Sub test()

    Sheet1.Range("G2").Resize(7, 3).Value=Sheet1.Range("B10:D16").Value
End Sub

Nếu tất cả điều trên không đúng nhu cầu thì: Xem lại cách đặt vấn đề của chính mình - nếu không là bịa vấn đề, cũng là đang quá mông lung, không biết mình đang hỏi gì.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu chỉ là code sai tè le này


Thì sao lại không là
Mã:
Sub test()
    Dim Arr
    Arr = Sheet1.Range("B10:D16").Value
    Sheet1.Range("G2").Resize(7, 3).Value=Arr
End Sub

hay
Mã:
Sub test()

    Sheet1.Range("G2").Resize(7, 3).Value=Sheet1.Range("B10:D16").Value
End Sub

Nếu tất cả điều trên không đúng nhu cầu thì: Xem lại cách đặt vấn đề của chính mình - nếu không là bịa vấn đề, cũng là đang quá mông lung, không biết mình đang hỏi gì.

2 cách của anh thì những bạn vừa học viết code cũng viết được anh ạ, mà cũng chẳng cần viết code chi cho mệt, sử dụng phím tắt Ctrl C và Ctrl V là xong. Nếu đơn giản vậy thì em cũng không đăng câu hỏi để hỏi làm gì

Thứ 1: Chủ đề của topic này đang đề cập đến Array.
Thứ 2: Em đã nói Array đã nhận giá trị từ B2:D16.
Thứ 3: Em cần trích và gán dữ liệu từ B10:D16 xuống vị trí khác.

Cám ơn anh đã nhiệt tình giúp đỡ ạ!
 
Upvote 0
2 cách của anh thì những bạn vừa học viết code cũng viết được anh ạ, mà cũng chẳng cần viết code chi cho mệt, sử dụng phím tắt Ctrl C và Ctrl V là xong. Nếu đơn giản vậy thì em cũng không đăng câu hỏi để hỏi làm gì

Thứ 1: Chủ đề của topic này đang đề cập đến Array.
Thứ 2: Em đã nói Array đã nhận giá trị từ B2:D16.
Thứ 3: Em cần trích và gán dữ liệu từ B10:D16 xuống vị trí khác.

Cám ơn anh đã nhiệt tình giúp đỡ ạ!
Vẫn vậy thứ 2, rồi thứ 3 (của riêng bạn) thì đều liên quan đến RANGE , không liên quan gì ARRAY cả

--- và
Như bác SA_DQ đã viết, quan trọng nguồn từ Array của bạn từ đâu ra, thì xử lý từ đó, bạn chỉ ra nguồn nó lấy từ Sheets thì giải pháp đơn giản như trên.
Còn nếu khác thì cần nói rõ và trả lời thực cho câu hỏi của bác SA_DQ trên (thay vì bịa ra 1 cái, làm mất thời gian mọi người):
Bạn hãy cho biết cách mà bạn sở hữu mảng 2 chiều đó; & khi ý biết đạu có cách nào khác nữa chăng!
 
Lần chỉnh sửa cuối:
Upvote 0
Cái này chắc phải duyệt vòng lặp thôi.Vì không có phương thức nào chọn vùng mảng để gán xuống sheets.
Mảng và vòng lặp cũng như dây lạt và bánh tét vậy. Người ta cho rằng dùng dây ấy cắt bánh thì trông quê mùa cho nên muốn thử dùng dao.
Vấn đề chỉ là dùng dao thì trông hiện đại nhưng rửa dao thì cực.
 
Upvote 0
Mảng và vòng lặp cũng như dây lạt và bánh tét vậy. Người ta cho rằng dùng dây ấy cắt bánh thì trông quê mùa cho nên muốn thử dùng dao.
Vấn đề chỉ là dùng dao thì trông hiện đại nhưng rửa dao thì cực.
Có người còn thích phải dùng đúng dao cắt bánh ngọt của tây mới hay
 
Upvote 0
Có người còn thích phải dùng đúng dao cắt bánh ngọt của tây mới hay
Có một con dao, mà rất lạ là cứ khi có "xung đột" thì thường nằm trong tầm tay, quơ quơ tay loạn xạ là đụng tới nó. Đó là dao gọt hoa quả. Cho dù ở bất kỳ đâu, trên xe Lexus (Vũ Thị Kim Anh), trong nhà bếp hay phòng khách, cứ lúc "nước sôi lửa bỏng" mà quờ quờ tay loạn xạ thì luôn vớ được con dao gọt hoa quả. :D
 
Upvote 0
Có một con dao, mà rất lạ là cứ khi có "xung đột" thì thường nằm trong tầm tay, quơ quơ tay loạn xạ là đụng tới nó. Đó là dao gọt hoa quả. Cho dù ở bất kỳ đâu, trên xe Lexus (Vũ Thị Kim Anh), trong nhà bếp hay phòng khách, cứ lúc "nước sôi lửa bỏng" mà quờ quờ tay loạn xạ thì luôn vớ được con dao gọt hoa quả. :D
Chuyện "dầu sôi lửa bỏng" có từ lâu rồi Bác ạ. Điển hình là truyện Đoạn Tuyệt của Nhất Linh mà hồi xưa nằm trong chương trình Giảng Văn bậc Trung Học.

Nói về con dao nhỏ thì người phụ nữ xưa thường mang theo con dao, gọi là dao bổ cau.
Dao con chó nó gắn liền với người VN cho đến cuối thập niên 60. Mãi về sau mới dần bị thay thế bởi dao Mỹ (hàng Quân Tiếp Vụ hoặc hàng lậu)
Bây giờ thì dao Thái phổ biến hơn. Cái con dao gọt quả bác nói đây chắc là dao Thái.
 
Upvote 0
Bây giờ thì dao Thái phổ biến hơn. Cái con dao gọt quả bác nói đây chắc là dao Thái.
Về dao bổ cau, dao phay, dao rựa hồi nhỏ sơ tán về quê tôi cũng thấy nghe nói. Còn dao Thái thì do không sống ở Việt Nam nên tôi không biết. Đọc báo mạng thấy nói nhiều về dao gọt hoa quả thôi.
 
Upvote 0
Vậy là đa số phụ nữ chơi dao
Nam thường chơi dao là tự cắt
?
 
Upvote 0
Mảng và vòng lặp cũng như dây lạt và bánh tét vậy. Người ta cho rằng dùng dây ấy cắt bánh thì trông quê mùa cho nên muốn thử dùng dao.
Vấn đề chỉ là dùng dao thì trông hiện đại nhưng rửa dao thì cực.

Trời, anh nói gì ghê quá, em út mới tập tành lập trình (nghiệp dư) và không biết mới đăng đàn tìm "sư huynh" chỉ bảo chứ có phải hỏi xoay đáp xoáy dao rựa kiếm búa gì đây đâu anh. Hic...

Mà em nghĩ cũng là để trao đổi tranh luận tìm giải pháp và cùng nhau tiến bộ hơn thôi ạ.
 
Upvote 0
...
Mà em nghĩ cũng là để trao đổi tranh luận tìm giải pháp và cùng nhau tiến bộ hơn thôi ạ.
Hổng dám cùng nhau đâu.
Trước mắt thì thấy chúng tôi chả tiến bộ chút nào về kỹ năng "đoán mò câu hỏi"
Và riêng bạn thì cần tiến bộ hơn về kỹ năng "trình bày câu hỏi".
 
Upvote 0
Đúng thế tiến bộ gì
Ngu người đi thì có, giống như nhàn rỗi làm vài đề bài cho mọi người chơi.
 
Upvote 0
Đúng thế tiến bộ gì
Ngu người đi thì có, giống như nhàn rỗi làm vài đề bài cho mọi người chơi.
Tôi thấy mọi người lạ thật.

Người ta có một vấn đề, mình tham gia hoặc không. Thế thôi

Rõ ràng bác VetMini đoán đúng. Bài #1346 là sự khẳng định điều đó. Thế mà sau bài #1346 nhiều người vẫn cứ kêu là khó hiểu. Thực ra xem đoạn tôi trích trong bài của mình thì những ai có thiện ý đều phải hiểu được ý tác giả.

Người ta đã có 1 mảng giá trị, sao cứ vặn vẹo, người ta lấy từ đâu, bằng cách nào?

Rõ ràng với mảng cụ thể A(1 to 15, 1 to 6) này, và cần nhập 6 dòng cuối (10 to 15) xuống sheet không dùng vòng lặp FOR, thì rõ ràng code của tôi LÀM ĐÚNG ĐIỀU ĐÓ. Thế mà có người viết là không thể làm được.

Rõ ràng dòng code dùng 2 hằng mảng thỏa mãn YÊU CẦU CỦA TÁC GIẢ. Thế mà tác giả bài đăng cũng lờ nó đi.
 
Lần chỉnh sửa cuối:
Upvote 0
Nhiều lúc cắt bánh (tét) bằng dây gói nó còn ngon hơn dao nữa cơ!
Cũng giống như đi xe 2 bánh tiện hơn khi tắt đường, so với xe 4 bánh

Chào xuân mới đem vui vẻ đến mọi người & mọi nhà!
 
Upvote 0
Tôi thấy mọi người lạ thật.

Người ta có một vấn đề, mình tham gia hoặc không. Thế thôi

Rõ ràng bác VetMini đoán đúng. Bài #1346 là sự khẳng định điều đó. Thế mà sau bài #1346 nhiều người vẫn cứ kêu là khó hiểu. Thực ra xem đoạn tôi trích trong bài của mình thì những ai có thiện ý đều phải hiểu được ý tác giả.

Người ta đã có 1 mảng giá trị, sao cứ vặn vẹo, người ta lấy từ đâu, bằng cách nào?

Rõ ràng với mảng cụ thể A(1 to 15, 1 to 6) này, và cần nhập 6 dòng cuối (10 to 15) xuống sheet không dùng vòng lặp FOR, thì rõ ràng code của tôi LÀM ĐÚNG ĐIỀU ĐÓ. Thế mà có người viết là không thể làm được.

Rõ ràng dòng code dùng 2 hằng mảng thỏa mãn YÊU CẦU CỦA TÁC GIẢ. Thế mà tác giả bài đăng cũng lờ nó đi.
Yêu cầu của tác giả, chính tác giả đưa ví dụ từ Range của Sheet để trả lời câu hỏi của bác SA, tác giả còn chẳng hiểu thì ai hiểu. Bài bác làm đúng mà tác giả câu hỏi có nhắc gì đến đâu, cứ tiếp tục cho ví dụ và đòi hỏi mọi người hiểu.
 
Upvote 0
Ngoài các cách của bác VetMini thì cũng có thể dùng hàm INDEX.

Mã:
Sub TestArray()
Dim A(1 To 15, 1 To 6) As Long
Dim r As Long, c As Long, k As Long
Dim arrRow(10 To 15, 1 To 1), arrCol(1 To 6)
'    mảng các chỉ số dòng
    For k = 10 To 15
        arrRow(k, 1) = k
    Next k
'    mảng các chỉ số  cột
    For k = 1 To 6
        arrCol(k) = k
    Next k
    k = 0
'    nhập giá trị vào mảng A
    For r = 1 To 15
        For c = 1 To 6
            k = k + 1
            A(r, c) = k
        Next c
    Next r
'    nhập mảng A xuống sheet để tiện theo dõi mảng 6 dòng
    Range("A1").Resize(15, 6) = A
'    nhập mảng có từ 6 dòng cuối của A xuống sheet, dùng các hằng số mảng
    Range("H1").Resize(6, 6) = Application.Index(A, [{10;11;12;13;14;15}], Array(1, 2, 3, 4, 5, 6))
'    nhập mảng có từ 6 dòng cuối của  A xuống sheet, dùng mảng các chỉ số dòng và mảng các chỉ số cột
    Range("H10").Resize(6, 6) = Application.Index(A, arrRow, arrCol)
  
'    Tương tự trên sheet: chọn vùng H1:M6 -> nhập công thức
'    =INDEX(A1:F15,{10,11,12,13,14,15},{1\2\3\4\5\6}) -> kết thúc bằng Ctrl + Shift + Enter.

'    Về dấu "\" có thể trên mỗi máy khác nhau. Ở đâu đó hãy nhập công thức
'    =SUM(A1:B2) -> trên thanh công thức bôi đen A1:B2 -> nhấn F9. Nhìn thấy
'    giữa 1 và 2 là dấu gì thì thay nó vào vị trí các dấu "\" trong trong công thức ở trên.
  
'    ---------------
'    Phần thưởng thêm, miễn phí
'    1. Nhập mảng các phần tử từ các dòng 7, 8, 11, 14, và từ các cột 1, 3, 5 - mảng các phần tử ở
'    các điểm giao của các dòng 7, 8, 11, 14 và các cột 1, 3, 5
    Range("A20").Resize(4, 3) = Application.Index(A, [{7;8;11;14}], Array(1, 3, 5))
  
'    2. Lấy vùng từ dòng 7 đến 10, cột từ 3 đến 5
    Range("E20").Resize(4, 3) = Application.Index(A, [{7;8;9;10}], Array(3, 4, 5))
'    Tương tự trên sheet: chọn E20:G23 -> nhập công thức
'    =INDEX(A1:F15, {7,8,9,10}, {3\4\5}) -> kết thúc bằng Ctrl + Shift + Enter.
End Sub

Cám ơn anh @batman1 đã hướng dẫn.
Đến giờ em mới có chút thời gian rảnh để nghiên cứu phần code của anh.
Em sẽ nghiên cứu thêm phần này xem có hiểu được tẹo nào nữa không,

Chúc anh mạnh khỏe!
 
Upvote 0
các cao thủ cho em hỏi nhờ tại sao đoạn code này bị báo lỗi về khai báo biến arrr.
Và có cách nào ứng dụng được mảng trong hàm sumif thay vì phải dùng range () không ạ
Em cảm ơn ạ

Sub thu12()
Dim sArray, arrr, Arr()
Dim i, j As Long
Sheet2.Select
sArray = Range("a1:a4296").Value
arrr = Range("d1:d4296").Value
ReDim Arr(1 To UBound(sArray), 1 To 1)
For i = 1 To UBound(sArray)

j = j + 1
Arr(j, 1) = arrr(i, 1) / Application.WorksheetFunction.SumIf(Range("a1:d4296"), sArray(i, 1), Range("d1:d4296"))

Next
Range("g1:g4296") = Arr
End Sub
 
Upvote 0
các cao thủ cho em hỏi nhờ tại sao đoạn code này bị báo lỗi về khai báo biến arrr.
Và có cách nào ứng dụng được mảng trong hàm sumif thay vì phải dùng range () không ạ
Em cảm ơn ạ

Sub thu12()
Dim sArray, arrr, Arr()
Dim i, j As Long
Sheet2.Select
sArray = Range("a1:a4296").Value
arrr = Range("d1:d4296").Value
ReDim Arr(1 To UBound(sArray), 1 To 1)
For i = 1 To UBound(sArray)

j = j + 1
Arr(j, 1) = arrr(i, 1) / Application.WorksheetFunction.SumIf(Range("a1:d4296"), sArray(i, 1), Range("d1:d4296"))

Next
Range("g1:g4296") = Arr
End Sub
Nếu là tôi không nên dùng hàm sumif.Vì làm thế này mỗi lần chạy vòng lặp.Nó phải tính 1 lần hàm.Mà bạn nên khai báo biến thì viết rõ ra nhé.
 
Upvote 0
Nếu là tôi không nên dùng hàm sumif.Vì làm thế này mỗi lần chạy vòng lặp.Nó phải tính 1 lần hàm.Mà bạn nên khai báo biến thì viết rõ ra nhé.
Ngừoi ta hỏi về lỗi mờ.

Hỏi "lỗi" mà không nói rõ ra lỗi gì thì chỉ có nước đoán đại:
Cứ nhìn con toán chia thì biết nếu không bị lỗi #DIV0 hiện giờ thì cũng bị trong tương lai.
 
Upvote 0
cảm ơn hai
Nếu là tôi không nên dùng hàm sumif.Vì làm thế này mỗi lần chạy vòng lặp.Nó phải tính 1 lần hàm.Mà bạn nên khai báo biến thì viết rõ ra nhé.
mình đang mò mẫm nên nếu có thể nhờ bạn chỉ giúp có thể thay sumif bằng cách nào khác được ạ. Cảm ơn bạn
Bài đã được tự động gộp:

Ngừoi ta hỏi về lỗi mờ.

Hỏi "lỗi" mà không nói rõ ra lỗi gì thì chỉ có nước đoán đại:
Cứ nhìn con toán chia thì biết nếu không bị lỗi #DIV0 hiện giờ thì cũng bị trong tương lai.
mình có nói là lỗi khai báo biến ạ. còn quá trình xử lý dữ liệu mình đã xử lý lỗi div0 rồi ạ. cảm ơn bạn
 
Upvote 0
cảm ơn hai

mình đang mò mẫm nên nếu có thể nhờ bạn chỉ giúp có thể thay sumif bằng cách nào khác được ạ. Cảm ơn bạn
Bài đã được tự động gộp:


mình có nói là lỗi khai báo biến ạ. còn quá trình xử lý dữ liệu mình đã xử lý lỗi div0 rồi ạ. cảm ơn bạn
Lỗi cái nào bạn chụp màn hình cái lỗi lên đây xem nào.
 
Upvote 0
Lỗi cái nào bạn chụp màn hình cái lỗi lên đây xem nào.
rất cảm ơn bạn đã quan tâm huớng dẫn giúp, mình đã mò ra lỗi rồi ạ. nếu có thể nhờ bạn huớng dẫn mình cách thay thế hàm sumif hoặc phương pháp nào nhanh hơn sử dụng hàm sumif để tăng tốc. Rất cảm ơn bạn
 
Upvote 0
Khai báo biến, nếu có sơ xuất là ở chỗ này:
Dim i, j As Long
Chứ chõ này có gì đâu
Dim sArray, arrr, Arr()

Tuy nhiên, tôi thì khai như vầy:
Dim sArray1, sArray2 ' Dim sArray, arrr
Dim Arr()
Nhưng thằng cùng loại, giống nhiệm vụ thì khai gần nhau, và tên gần nhau. Thằng khác loại thì sang dòng khác.
 
Upvote 0
Khai báo biến, nếu có sơ xuất là ở chỗ này:
Dim i, j As Long
Chứ chõ này có gì đâu
Dim sArray, arrr, Arr()

Tuy nhiên, tôi thì khai như vầy:
Dim sArray1, sArray2 ' Dim sArray, arrr
Dim Arr()
Nhưng thằng cùng loại, giống nhiệm vụ thì khai gần nhau, và tên gần nhau. Thằng khác loại thì sang dòng khác.
cảm ơn bạn nhiều ạ
 
Upvote 0
Thân chào các anh. Giúp e vấn đề về mảng với.
Trong file đính kèm, em tham khảo và ghép từng đoạn code để hoàn thành các bước, giờ còn 1 bước cuối mà e ko biết cách nào làm tiếp...
- Về phần kiểm tra dữ liệu khi chọn mã ở Sheet Main thì tạm ok.
- Về phần nhập dữ liệu mới qua Sheet TH_DATA, thì e muốn so sánh mảng dữ liệu mới và mảng dữ liệu cũ có trùng nhau không, nếu trùng thì hỏi, còn không trùng thì nhập mới.
+ Vì trong Sheet TH_DATA có nhiều mã giống nhau nhưng các nội dung theo mã sẽ khác nhau.
Mong các a giúp đỡ. nếu Code trong file có gì chưa đúng nhờ cải thiện e với.
 

File đính kèm

Upvote 0
Vấn đề của bạn nói tính ra là cả đống chứ đâu phải chỉ là mảng. Nên lập riêng một thớt mà phân giải cho rõ rệt
 
Upvote 0
Hi cả nhà
Mình mới tiếp cận dùng mảng vào trong lập trình VBA, cũng đọc từ đầu topic đến giờ nhưng vẫn còn mông lung, mình có bài toán nhỏ này mong các bạn giúp để thông não ra.
Untitled.jpg
Sheets Data, có vùng A1 : D20,

Mình khai báo mảng 1 lấy dữ liệu từ vùng A1 : D20 rồi (Đặt tên là Mang1),
Mình muốn:
1. Tạo một Mảng 2 (Mang2) dựa trên Mang1, nhưng dữ liệu chỉ gồm cột từ A1 đến C20, và gán giá trị Mang2 Vào ô A1, Sheets KQ1
2.Tạo một Mảng 3 (Mang3) dựa trên Mang1. Theo đó: Xắp xếp dữ liệu Mang1 theo thứ tự Cột Tên Sản phẩm (thứ tự A-B) rồi đến Giá gốc (thứ tự từ Bé đến to), , và gán giá trị Mang3 Vào ô A1, Sheets KQ2
3. Tạo một Mảng 4 (Mang4) dựa trên Mang1. Theo đó chỉ lấy giá trị duy nhất của cột A1:A20
4. Tạo một mảng 5 (Mang5) dựa vào Mang1. Theo đó lấy giá trị của cột A1:A20, xoay thành dữ liệu kiểu hàng ngang, gán kết quả vào ô A1, Sheet KQ3
Cám ớn các bạn
 

File đính kèm

Upvote 0
Hi cả nhà
Mình mới tiếp cận dùng mảng vào trong lập trình VBA, cũng đọc từ đầu topic đến giờ nhưng vẫn còn mông lung, mình có bài toán nhỏ này mong các bạn giúp để thông não ra.
...
Hai với ba cái gì cho mệt. Ngừoi Việt chào hỏi mà dùng tiếng Tây thì cũng đâu có thể là lịch sự. Thà bỏ quách khỏi chào cho xong.

Đây là thớt hỏi về mảng.
Đề bài của bạn tuy là mảng (lời của bạn, chứ nếu tính lại thuật toán thì có thể có cách khác), nhưng nó đâu phải là câu hỏi. Bạn nhờ viết code giùm mà. Lập thớt riêng mà nhờ.

Muón hỏi thì đưa code lên nhờ giải thích và/hoặc chỉ dẫn những chỗ bí.
 
Upvote 0
Hai với ba cái gì cho mệt. Ngừoi Việt chào hỏi mà dùng tiếng Tây thì cũng đâu có thể là lịch sự. Thà bỏ quách khỏi chào cho xong.

Đây là thớt hỏi về mảng.
Đề bài của bạn tuy là mảng (lời của bạn, chứ nếu tính lại thuật toán thì có thể có cách khác), nhưng nó đâu phải là câu hỏi. Bạn nhờ viết code giùm mà. Lập thớt riêng mà nhờ.

Muón hỏi thì đưa code lên nhờ giải thích và/hoặc chỉ dẫn những chỗ bí.
Mình thấy bạn chưa giúp gì nhưng cũng bắt bẻ câu chữ ghê phết, mình ko nhâm thì bạn cũng dùng từ code trong câu trả lời mà, code ko phải tiếng việt đâu
Mình ko nhờ code hộ mà học code qua các câu hỏi, m cũng đọc các bài rồi mới hỏi, nhưng vì các bài toàn giải quyết các vấn đề phức tạp so với một người mới động đến mảng
@ xin lỗi các bạn khác nếu lỡ phải đọc post này, nhưng thực sự m rất dị ứng với kiểu người ko giúp gì người khác mà thích dậy đời
 
Upvote 0
mình ko nhâm thì bạn cũng dùng từ code trong câu trả lời mà, code ko phải tiếng việt đâu
Không ai cấm dùng vài từ tiếng Anh. Có một số từ dùng tiếng Anh sẽ dễ hiểu và ngắn gọn hơn. Đặc biệt về khoa học, công nghệ. Nhưng những câu chào, câu cám ơn và rất nhiều câu khác trong tiếng Việt có, ngắn gọn, dùng hàng ngàn năm rồi. Và người Việt không chấp nhận dùng hai ba trong trường hợp này. Đơn giản bạn thử bước vào một hội trường bất kỳ. Bạn sẽ nói "Hi các bạn?" Nếu không thì bạn đủ biết là vào GPE cũng y như thế.
Góp ý cho bạn thôi. Nếu bạn không chấp nhận thì nói gọn một câu, là bạn không tiếp thu. Thế thôi.
 
Upvote 0
...Mình ko nhờ code hộ mà học code qua các câu hỏi, m cũng đọc các bài rồi mới hỏi, nhưng vì các bài toàn giải quyết các vấn đề phức tạp so với một người mới động đến mảng
...
Dóc. Nếu người ta trả lời bằng cách chỉ dẫn thì biết cách tự code hôn?

...@ xin lỗi các bạn khác nếu lỡ phải đọc post này, nhưng thực sự m rất dị ứng với kiểu người ko giúp gì người khác mà thích dậy đời
Dị ứng cái mốc xì. Nếu thực tâm học code thay vì xin code thì thử hỏi mọi người xem. Ở đây ai cũng biết tôi chuyên môn chỉ dẫn cách code thay vì code giùm.

Học hành mà ham tự ái hảo. Nếu ngày xưa, chúa động Thuỷ Liêm cũng biết tự ái với thái độ của Bồ Đề Lão Tổ thì suốt đời nó cũng chỉ là con khỉ. Đâu có chuyện Tề Thiên Đại Thánh.
 
Lần chỉnh sửa cuối:
  • Cười
Reactions: NHG
Upvote 0
Bác hỏi tôi ấy hở.
Không, tôi không "bị".
Có lẽ người ta biết tôi đã đếm được tới trên 1000 rồi. Muốn khinh, ghét, ... gì tôi thì chịu khó xếp hàng.
(Hiện giờ người đứng cuối là 1007. Số 1008 còn trống)
 
Upvote 0
Chắc chủ topic đang hồi xuân nên có một chút khó tính. Chứ như bọn cháu được hai chú góp ý thì mừng quá là mừng rồi-\\/.-\\/.-\\/.
 
Upvote 0
Hồi xuân mà khó tính thì hồi với ai (?)
Hơn con giáp vừa qua, mình chưa thấy ai khó tính khi hồi xuân cả, bạn mách dùm khi thấy người nào đó thêm nữa dùm nghen!

Mình khai báo mảng 1 lấy dữ liệu từ vùng A1 : D20 rồi (Đặt tên là Mang1),
Mình muốn:
1. Tạo một Mảng 2 (Mang2) dựa trên Mang1, nhưng dữ liệu chỉ gồm cột từ A1 đến C20, và gán giá trị Mang2 Vào ô A1, Sheets KQ1
. . . .
Nếu là mình thì lấy dữ liệu vùng [A1:C20] gán (thẳng) vô mang2 & sau đó đem mảng này gán đi đâu mà chả được (?)
 
Lần chỉnh sửa cuối:
Upvote 0
Hồi xuân mà khó tính thì hồi với ai (?)
Hơn con giáp vừa qua, mình chưa thấy ai khó tính khi hồi xuân cả, bạn mách dùm khi thấy người nào đó thêm nữa dùm nghen!


Nếu là mình thì lấy dữ liệu vùng [A1:C20] gán (thẳng) vô mang2 & sau đó đem mảng này gán đi đâu mà chả được (?)
Mình tìm hiểu cách biến từ mảng to thành mảng nhỏ b ạ
Bài đã được tự động gộp:

Vui phết, đc bao nhiêu người dạy, mỗi vba thì lại chưa học đc thêm gì
 
Upvote 0
Có vẻ như bạn nên viết iêu cầu từ bài đầu là vầy:

. . . Mình khai báo mảng 1 ( & ví dụ mảng đã lấy dữ liệu từ vùng nào đó rồi (Đặt tên là Mang1)),

Mình muốn:
1. Tạo một Mảng 2 (Mang2) dựa trên Mang1, nhưng dữ liệu chỉ gồm từ vài hàng & vài cột từ mang1, & sau đó gán trị Mang2 lẹn ô A1 của trang tính nào đó như Sheets KQ1
. . . . .
$$$$@
 
Upvote 0
Mình tìm hiểu cách biến từ mảng to thành mảng nhỏ b ạ
...
Vui phết, đc bao nhiêu người dạy, mỗi vba thì lại chưa học đc thêm gì
Trên đời thiếu giống gì chuyện học một hiểu mười, nhưng cũng đâu thiếu chuyện mài đũng quần chục năm bao nhiêu cơm cha áo mẹ công thầy trả về một cái lá mít đặc.
Thời buổi kinhn tế thị trường, học trò kén cá chọn canh là tại họ có tiền. Ở đây có trả tiền đâu mà đòi theo ý mình. Học mà cứ vướng cái cục tự ái ở trên đầu thì ba năm cũng còn cái cục ấy.

Muốn học mà không biết nhìn thầy thì hỏi cả chục câu không học được một chữ là lẽ thường.
Ở đây có đủ người về lý thuyết lẫn ngườ về thực hành. Nhè ngay người giỏi nhất về thực hành mảng (không phải tôi) mà không nhìn ra, lo cười mỉm chi cọp, khinh khỉnh nhìn đời.

Mách cho lật lần sáng mắt:
Cứ lộn ngược trở về từ bài này, thấy tên người nào thì tra tìm các bài viết của người ấy. Nếu đủ chí thì học được cả khối. Nếu đủ chí mà vẫn không học được thì hãy quay lại mà nói về giá trị của những người mà mình vừa lên tiếng "khinh".
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu là mình thì lấy dữ liệu vùng [A1:C20] gán (thẳng) vô mang2 & sau đó đem mảng này gán đi đâu mà chả được (?)
Còn tuỳ theo nhiều điều kiện:
1. nếu mang1 sau khi lấy xuống rồi còn xào nấu gì đó thì mang2 muốn lấy theo kiểu nào. Lấy theo một phần của mang1 hay một phần của vàng Range mà mang1 đã từng lấy ra? Nên nhớ là sau khi gán Range cho mang1 thì Raneg và mang1 đã là hai cá thể riêng biệt. Cả hai đều có thể đã thay đổi trước khi mang2 bước vào cuộc.
2. mang2 còn dùng làm cái gì nữa hay không? chứ nếu chỉ muốn chép một phần góc trái của mang1 thì chép dễ dàng, đâu cần mang2. (trừ phi chép phần giữa)
 
Upvote 0
Còn tuỳ theo nhiều điều kiện:
1. nếu mang1 sau khi lấy xuống rồi còn xào nấu gì đó thì mang2 muốn lấy theo kiểu nào. Lấy theo một phần của mang1 hay một phần của vàng Range mà mang1 đã từng lấy ra? Nên nhớ là sau khi gán Range cho mang1 thì Raneg và mang1 đã là hai cá thể riêng biệt. Cả hai đều có thể đã thay đổi trước khi mang2 bước vào cuộc.
2. mang2 còn dùng làm cái gì nữa hay không? chứ nếu chỉ muốn chép một phần góc trái của mang1 thì chép dễ dàng, đâu cần mang2. (trừ phi chép phần giữa)

. . . . . . . . . . (/ậy thì chờ chủ bài đăng 'Mô tả' thêm thôi!
$$$$@
 
Upvote 0
. . . . . . . . . . (/ậy thì chờ chủ bài đăng 'Mô tả' thêm thôi!
$$$$@
Chưa có ai tình nguyện code thì không có thêm đâu bạn ơi. Chủ chơi trò treo tú cầu cho anh hào bắn sẻ. Thảy ra cái đề cho mọi ngừoi xúm vào code thử. Sau đó mới thêm chi tiết này nọ để thiên hạ lại phải chỉnh code.

Kiểu học giống như nhà Mộ Dung gồm thâu chiêu thức thiên hạ về chứa cả thư viện cho con cháu học ấy mà (xem Thiên Long bát Bộ của Kim Dung). Chỉ là Mộ Dung Bác tuổi trẻ tài cao, thông làu nguyên tắc Gậy Ông Đập Lung Ông rồi mới học võ thiên hạ cho nên mới thành tài ba cái thế. Mộ Dung Phục học chẳng ra hồn, ỷ vào biểu muội đọc sách giùm rốt cuộc chẳng đủ xưng hùng, đụng cao thủ cỡ Đoàn Diên Khánh là tèo rồi. Nên nhớ họ Đoàn tuy cao cấp nhưng gặp Kiều Phong là khớp ngay (Diên Khánh nể nội lực Kiều Phong cho nên nói chuyện không dám dùng phúc ngữ, phải dùng gậy vạch trên đất). Thinh danh Bắc Kiều Phong Nam Mộ Dung tới đấy chỉ là hư danh.
 
Upvote 0
Lại là cái tâm á sư phụ Vẹt nhỏ, tại hôm trước xem trên youtube mấy anh bảo là anh Kiều Phong này có rút gọn một số chiêu thức trong Giáng Long Thập Bát Chưởng.


Nghĩa là anh ta hết mục đích sống, sống không biết để làm gì.

Cháu đoán bác gái không có nick trên gpe này, ahihi.
Cả ba đều lạc lối.
1. Cần hiểu rõ thế nào là "rút gọn". Triết lý "một bao mười" mãi đến tập sau này là "Tiếu Ngạo Giang Hồ" mới ra. Độc Cô Cửu Kiếm chỉ có 9 chiêu, bao hết luôn thập bát ban võ nghệ, và diễn ra liên miên bất tuyệt.
Nhưng nên nhớ, Lệnh Hồ Xung đã lúng túng khi phải đối phó với Tịch Tà Kiếm Pháp. Suy ra khi đối phó ma đạo ở điểm quái dị cần bình tâm.
Điếu này KD đã mở trước trong Cô Gái Đồ Long. Trương Giáo Chủ thần công vô địch (*), lại thêm tuyệt tác Thái Cực Quyền và lời dạy "quên sạch" của Trương Tam Phong nhưng vẫn lúng túng khi đối diện với lói đánh quái dị của Càn Khôn Đại Nã Di Thức Pháp.

2. Chỉ có phim mới diễn tả là anh ta hết ý sống. Cần câu nước mắt khán giả mà. Nếu y thực thế thì chưa xứng đáng được tôi gọi là "tâm".
Con người của y cao hơn mức ấy. Y đem cái chết của mình ra để mua lại yên lành cho dân Tống. Y hăm doạ Liêu Vương phải lui binh. Và vì phạm lỗi "quân thần" đối với nước Liêu nên y không thể sống. Tam cương ngũ thường mà.

3. tôi cũng theo đạo "phu vi phụ cương". Chỉ là tôi xem từ "cương" là cái đạo lý mà người chủ gia đình phải làm gương. Bà xã tôi không có nít niếc gì hết. Nhưng bà ấy biết rõ tôi làm gì.

Xin lỗi quý vị khác trên diễn đàn, và đặc biệt thớt này. Tôi diễn triết đạo chuyện kiếm hiệp Hồng Kông hơi dài do tôi thực sự thấy nó có sự liên hệ giữa "triết lý võ học" của Kim Dung với lý thuyết và ứng dụng cấu trúc mảng (và các cấu trúc khác như Collection, Dictionary, ...) trong VBA.
 
Upvote 0
Xin lỗi quý vị khác trên diễn đàn, và đặc biệt thớt này. Tôi diễn triết đạo chuyện kiếm hiệp Hồng Kông hơi dài do tôi thực sự thấy nó có sự liên hệ giữa "triết lý võ học" của Kim Dung với lý thuyết và ứng dụng cấu trúc mảng (và các cấu trúc khác như Collection, Dictionary, ...) trong VBA.
Cám ơn anh. Tuy nhiên cũng nên cắt ngang ở đây
 
Upvote 0
Em muốn check cái báo cáo tình hình sử dụng HĐ của hệ thống, em đã tự viếtt code "Dic" nhưng chỉ đúng khi số HĐ của các dải không trùng nhau. Khi trùng nhau thì đang bị trả kết quả sai.
Em là member mới, chỉ học vẹt code. Kính nhờ các thầy GPE hỗ trợ với ạ. em gửi file đính kèm.
Cám ơn GPE!!!
Kết quả mong muốn--->
- Hiện ra số dải: cố ký hiệu
- Hiện ra số đầu dải: số đầu tiên của mỗi dải ( dấu x)
- Hiện ra số cuối dải: Số kết thúc dải
- Hiện ra số hủy: Số không xuất hiện trong mỗi dải
Note: HĐ đã tự sắp xếp theo thứ tự liên tục rồi, dữ liệu khá nhiều dải và lớn
 

File đính kèm

Upvote 0
Em muốn check cái báo cáo tình hình sử dụng HĐ của hệ thống, em đã tự viếtt code "Dic" nhưng chỉ đúng khi số HĐ của các dải không trùng nhau. Khi trùng nhau thì đang bị trả kết quả sai.
Em là member mới, chỉ học vẹt code. Kính nhờ các thầy GPE hỗ trợ với ạ. em gửi file đính kèm.
Cám ơn GPE!!!
Kết quả mong muốn--->
- Hiện ra số dải: cố ký hiệu
- Hiện ra số đầu dải: số đầu tiên của mỗi dải ( dấu x)
- Hiện ra số cuối dải: Số kết thúc dải
- Hiện ra số hủy: Số không xuất hiện trong mỗi dải
Note: HĐ đã tự sắp xếp theo thứ tự liên tục rồi, dữ liệu khá nhiều dải và lớn
Dữ liệu được sort theo ký hiệu và số hóa đơn
Mã:
Public Sub XYZ()
  Dim sArr(), Res()
  Dim i As Long, sRow As Long, k As Long, KyHieu As String

  With Sheet2
    i = .Range("A" & Rows.Count).End(xlUp).Row
    If i < 2 Then MsgBox ("Khong co du lieu"): Exit Sub
    sArr = .Range("A2:B" & i + 1).Value 'Lay du 1 dong
  End With
  sRow = UBound(sArr, 1) - 1
  ReDim Res(1 To sRow, 1 To 4)
  For i = 1 To sRow
    If KyHieu <> sArr(i, 1) Then
      KyHieu = sArr(i, 1)
      k = k + 1
      Res(k, 1) = sArr(i, 1)
      Res(k, 2) = sArr(i, 2)
    ElseIf sArr(i, 2) > sArr(i - 1, 2) + 1 Then
      For r = sArr(i - 1, 2) + 1 To sArr(i, 2) - 1
        Res(k, 4) = Res(k, 4) & ";" & r
      Next r
    End If
    If KyHieu <> sArr(i + 1, 1) Then
      Res(k, 3) = sArr(i, 2)
      If Res(k, 4) <> Empty Then Res(k, 4) = Mid(Res(k, 4), 2, Len(Res(k, 4)))
    End If
  Next i
  With Sheet2
    .Range("F2:I1000").ClearContents
    .Range("F2").Resize(k, 4) = Res
    MsgBox ("Chuc mung ban")
  End With
End Sub
 
Upvote 0
Em muốn check cái báo cáo tình hình sử dụng HĐ của hệ thống, em đã tự viếtt code "Dic" nhưng chỉ đúng khi số HĐ của các dải không trùng nhau. Khi trùng nhau thì đang bị trả kết quả sai.
Em là member mới, chỉ học vẹt code. Kính nhờ các thầy GPE hỗ trợ với ạ. em gửi file đính kèm.
Cám ơn GPE!!!
Kết quả mong muốn--->
- Hiện ra số dải: cố ký hiệu
- Hiện ra số đầu dải: số đầu tiên của mỗi dải ( dấu x)
- Hiện ra số cuối dải: Số kết thúc dải
- Hiện ra số hủy: Số không xuất hiện trong mỗi dải
Note: HĐ đã tự sắp xếp theo thứ tự liên tục rồi, dữ liệu khá nhiều dải và lớn
Bạn thử.
Mã:
Sub laydulieu()
   Dim i As Long, lr As Long, a As Long, b As Long, arr, kq, dk As String, j As Long
   With Sheets("baocao")
        lr = .Range("A" & Rows.Count).End(xlUp).Row
        arr = .Range("A2:C" & lr).Value
        ReDim kq(1 To UBound(arr), 1 To 4)
        For i = 1 To UBound(arr)
            If dk <> arr(i, 1) Then
               If a Then
                 If Len(kq(a, 4)) > 0 Then kq(a, 4) = Right(kq(a, 4), Len(kq(a, 4)) - 1)
               End If
               dk = arr(i, 1)
               a = a + 1
               kq(a, 1) = arr(i, 1)
               kq(a, 2) = arr(i, 2)
               kq(a, 3) = arr(i, 2)
               b = arr(i, 2)
            Else
               For j = b + 1 To arr(i, 2) - 1
                   kq(a, 4) = kq(a, 4) & "," & j
               Next j
               b = arr(i, 2)
               kq(a, 3) = arr(i, 2)
            End If
        Next i
        .Range("E2:H100").ClearContents
        If Len(kq(a, 4)) > 0 Then kq(a, 4) = Right(kq(a, 4), Len(kq(a, 4)) - 1)
        If a Then .Range("E2:H2").Resize(a).Value = kq
   End With
End Sub
 
Upvote 0
Cảm ơn 2 thầy HieuCD và snow25 ạ, em thử 2 code của bác đều ra kết quả đúng và rất nhanh, Code của 2 bác với trình độ học vẹt của em thì chưa hiểu được hết. Em xin phép copy về dùng và ngâm cứu thêm mới hiểu rõ đường đi nước bước được. Có gì vướng mắc kinh mong các thầy hỗ trợ ạ.
Cám ơn GPE rất nhiều! :)
 
Upvote 0
Em muốn lọc dữ liệu ra từng khách hàng (từ ngày đến ngày), do em sưu tầm và chỉnh sửa lại thôi.
Tình hình là nó như vậy, Em cho lọc dữ liệu từ cột 1 -> 10, nhưng chỉ chạy đến cột thứ 9,
không biết chỉnh lại như thế nào (Cột 10_PHIẾU phân biệt phiếu PN hoặc PX)
Kính nhờ các thầy GPE hỗ trợ với ạ. Em gửi file đính kèm.
Cám ơn GPE !
 

File đính kèm

Upvote 0
Em muốn lọc dữ liệu ra từng khách hàng (từ ngày đến ngày), do em sưu tầm và chỉnh sửa lại thôi.
Tình hình là nó như vậy, Em cho lọc dữ liệu từ cột 1 -> 10, nhưng chỉ chạy đến cột thứ 9,
không biết chỉnh lại như thế nào (Cột 10_PHIẾU phân biệt phiếu PN hoặc PX)
Kính nhờ các thầy GPE hỗ trợ với ạ. Em gửi file đính kèm.
Cám ơn GPE !
Theo yêu cầu của bạn, Bạn tìm 2 dòng này và sửa lại. Các chuyện khác tôi không biết
PHP:
Sheet2.Range("B15:J" & Dcuoi).Clear 'Sửa J thành K'
.......................................
Sheet2.Range("B15").Resize(k, 9) = ArrD 'Sửa 9 thành 10'

Nên dùng With cho trường hợp này:
With Sheet2
    .Range("B15:K" & Dcuoi).Clear
    ....
    .Range("B15").Resize(k, 10) = ArrD
    ....
End With
 
Upvote 0
Em có tập làm form tìm kiếm khách hàng, do em sưu tầm và chỉnh sửa lại thôi.
- Khi nhấn đúp vào ô tìm kiếm (sheet DCCN ô K2, tắt tự động tích vào dòng tiêu đề + mã khách hàng, chỉ được phép chọn 1 mã khách hàng - khi tích chọn khách hàng sau, tích trước tự xóa đi).
- Khi tích chọn mã khách hàng xong, mã khách hàng lại không hiển thị xuống bảng tính (Sheet DCCN ô K2).
Kính nhờ các thầy GPE hỗ trợ với ạ. Em gửi file đính kèm.
Cám ơn GPE !
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bạn thử với con macro xíu này xem có ích gì không:
PHP:
Option Explicit
Private sArray:                             Dim Dic As Object
Dim lbID As Integer

Private Sub LBDMKH_Click()
 lbID = LBDMKH.ListIndex
 MsgBox lbID, , Me!LBDMKH.List(lbID, 3)
End Sub
 
Upvote 0
Bạn thử với con macro xíu này xem có ích gì không:
PHP:
Option Explicit
Private sArray:                             Dim Dic As Object
Dim lbID As Integer

Private Sub LBDMKH_Click()
lbID = LBDMKH.ListIndex
MsgBox lbID, , Me!LBDMKH.List(lbID, 3)
End Sub

Em cám ơn anh nhiều nha, tiếc là chưa phải cái em cần ah.
MA KH.JPG
 
Upvote 0
(/ậy thì thế nào mới phải (đạo), bạn cho mình mục kỉnh bằng 1 ví dụ xem sao!
 
Upvote 0
(/ậy thì thế nào mới phải (đạo), bạn cho mình mục kỉnh bằng 1 ví dụ xem sao!
Mình có gửi file đính kèm ở trên, như thế này:
- Khi nhấn đúp vào ô K2 (sheet DCCN tìm kiếm DMKH).
- Hiện form tự động tích vào dòng tiêu đề + 1 mã khách hàng.
+ Em muốn tắt tích chọn tự động này (lúc hiện lên).
+ Khi tích chọn khách hàng mới, tích trước tự bỏ dấu tích đi (chỉ được chọn 1).
- Khi tích chọn mã khách hàng xong => CHỌN, mã khách hàng lại không hiển thị xuống bảng tính (Sheet DCCN ô K2).
Rất mong các bác GPE giúp đỡ ah, cám ơn rất nhiều !
 
Upvote 0
Thì bạn thử đổi thuộc tính MultiSelect => 0 (single)
Sau đó tiếp tục thử & thử . . . .
 
Upvote 0
Theo yêu cầu của bạn, Bạn tìm 2 dòng này và sửa lại. Các chuyện khác tôi không biết
PHP:
Sheet2.Range("B15:J" & Dcuoi).Clear 'Sửa J thành K'
.......................................
Sheet2.Range("B15").Resize(k, 9) = ArrD 'Sửa 9 thành 10'

Nên dùng With cho trường hợp này:
With Sheet2
    .Range("B15:K" & Dcuoi).Clear
    ....
    .Range("B15").Resize(k, 10) = ArrD
    ....
End With

Bác cho em hỏi, trường hợp này bẫy lỗi
Từ ngày ... đến ngày ... mà không có dữ liệu (phát sinh) thì cho hiện ra bảng thông báo "Chua phat sinh"
Nhờ bác hỗ trợ giúp em đoạn code. Em cám ơn bác rất nhiều, để hoàn thiện hơn ah !
Bài đã được tự động gộp:

Thì bạn thử đổi thuộc tính MultiSelect => 0 (single)
Sau đó tiếp tục thử & thử . . . .

Em đang cố tìm hiểu xem lỗi như thế nào, những vẫn chưa ra bác ah.
Cám ơn bác nha !
 
Upvote 0
Thì bạn thử đổi thuộc tính MultiSelect => 0 (single)
Sau đó tiếp tục thử & thử . . . .
10 người kên đây hỏi hết 9 thiếu tự tin, thấy không ra như ý muốn là tá hoả tam tinh rồi, không còn hồn vía đâu để "thử, thử,..." :p:p:p
 
Upvote 0
Em đang cố tìm hiểu xem lỗi như thế nào, những vẫn chưa ra bác ah.
Chỉ mỗi MultiSelect = TRUE *** thì không giải quyết được đâu.

Có một điều ít người biết là nếu đúp chuột trên vd. CommandButton thì sẽ có 5 sự kiện được kích hoạt. Có thể làm thí nghiệm như sau: mở tập tin mới -> thêm UserForm1 -> đặt CommandButton1 trên UserForm -> viết code trong UserForm
Mã:
Option Explicit

Private k As Long

Private Sub CommandButton1_Click()
    k = k + 1
    Debug.Print "Click" & k
End Sub

Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    k = k + 1
    Debug.Print "DblClick" & k
End Sub

Private Sub CommandButton1_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    k = k + 1
    Debug.Print "Down" & k
End Sub

Private Sub CommandButton1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    k = k + 1
    Debug.Print "Up" & k
End Sub
-> hiển thị Form -> đúp chuột vào CommandButton1 -> sẽ có kết quả:
Down1
Up2
Click3
DblClick4
Up5

Như thế khi đúp chuột thì có 5 sự kiện được kích hoạt cho CommandButton1, thứ tự là: MouseDown -> MouseUp -> Click -> DblClick -> MouseUp.

Trong nhiều tình huống MouseUp thứ 2 được kích hoạt khi "dưới trỏ chột" đã là control hoàn toàn khác. Tức ta đúp chuột trên control1 và MouseUp thứ 2 không được kích hoạt cho control1 mà nó được kích hoạt cho control2, khi mà ở thời điểm sau khi thực hiện DblClick thì "dưới trỏ chuột" không phải là control1 mà là control2.

Cụ thể trong trường hợp của bạn như thế nào? Bạn hãy thiết lập MultiSelect = TRUE *** . Khi bạn đúp chuột trong K2 thì có thể KH0007 (đúp chuột gần mép trên của K2), KH0008 (đúp chuột quãng giữa của K2) hoặc KH0009 (đúp chuột gần mép dưới của K2) được chọn trong ListBox. Tại sao? Khi hiển thị Form thì mục KH0007, KH0008 và KH0009 đều nằm gọn trong dòng 2 của sheet so với màn hình. Trên máy bạn với độ phân giải khác thì rất có thể đó là 3 mục KH... khác nhưng bản chất là như nhau. Tức sau khi Form được hiển thị thì trỏ chuột đang ở vị trí của dòng KH0007, KH008 hoăc KH009 trong ListBox . Vì thế MouseUp thứ 2 được kích hoạt cho ListBox. Lúc đó code trong thư viện VBA sẽ chọn KH007, KH0008 hoặc KH0009 tùy theo vị trị chuột lúc đó ở trên dòng của mục KH0007, KH0008 hay KH0009 (dòng dưới trỏ chuột sẽ được chọn).
----------
Theo tôi bạn không dùng Worksheet_BeforeDoubleClick cho sheet DCCN. Bạn có thể đặt 1 Button1 trên sheet vả hiển thị Form từ Button1.
---------
***
: nhầm, phải là False, chính xác thì là fmMultiSelectSingle
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom