Nhờ mọi người sửa đoạn code để ghép vị trí giúp em với ạ.

Liên hệ QC

zPeterPan

Thành viên hoạt động
Tham gia
27/2/21
Bài viết
149
Được thích
10
Em chào tất cả thầy cô và anh chị em trên diễn đàn, file của em ngày trước được thầy Ba Tê trợ giúp file này để ghép 2 số. Em đã biên tập lại và giờ muốn ghép 3 vị trí thì thêm vòng lặp nhưng báo lỗi nhờ mọi người sửa giúp em với ạ ( vì em không chuyên về viết code ạ ), em xin cảm ơn ạ.
Kết quả em mong muốn đây ạ ( em gõ tay ví dụ vài dòng ghép ạ):
123.JPG
Mã:
Sub GhepViTri_3So()
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayAlerts = False
Dim sArr(), dArr(), tArr(), Tmp As Variant, fDay As Date, eDay As Date
Dim i As Long, J1 As Long, k As Long, J2 As Long, J3 As Long, R As Long, R2 As Long, CoL As Long, CoLs As Long, xCol As Long
    CoLs = 82  ' So ky tu trong 1 cell, cot C trong sheet1'
With Sheet1
    sArr = .Range("C4", .Range("C4").End(xlDown)).Value
    R = UBound(sArr)    'So dong cua mang sArr'
ReDim dArr(1 To R, 1 To CoLs)
    CoLs = 86
    sArr = .Range("A2").Resize(R + 2, CoLs).Value
    R = UBound(sArr)
End With
With Sheet2
    .Range("B2:QQQ11344").ClearContents
    fDay = .Range("C1").Value
    eDay = .Range("H1").Value
    xCol = eDay - fDay + 20 'So cot trong sheet2'
    ReDim dArr(1 To 82 * 81 + 1, 1 To xCol)
    CoL = 1
    For i = 2 To R
        If sArr(i, 2) >= fDay Then
            If sArr(i, 2) <= eDay Then
                CoL = CoL + 1
                k = 1
                For J1 = 5 To CoLs
                    For J2 = 5 To CoLs
                        For J3 = 5 To CoLs
                        If J1 <> J2 & J2 <> J3 & J1 <> J3 Then
                            dArr(1, CoL) = sArr(i, 2)
                            k = k + 1
                            If CoL = 3 Then dArr(k, 1) = sArr(2, J1) & "-" & sArr(2, J2) & "-" & sArr(2, J3)
                            dArr(k, CoL) = sArr(i, J1) & sArr(i, J2) & sArr(i, J3)
                        End If
                        Next J3
                    Next J2
                Next J1
                If sArr(i, 2) > eDay Then Exit For
            End If
          End If
    Next i
    .Range("A2:A12000").Resize(, 10000).ClearContents
    .Range("A2").Resize(k, xCol) = dArr
End With
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.DisplayAlerts = True
End Sub
 

File đính kèm

  • GhepVT_3so.xlsb
    219.1 KB · Đọc: 13
Lần chỉnh sửa cuối:
Em chào tất cả thầy cô và anh chị em trên diễn đàn, file của em ngày trước được thầy Ba Tê trợ giúp file này để ghép 2 số. . . em đã biên tập lại và giờ muốn ghép 3 vị trí thì thêm vòng lặp nhưng báo lỗi nhờ mọi người sửa giúp em với ạ. . . ( vì em không chuyên về viết code ạ ) em xin cảm ơn ạ. . .
Nhiều ba chấm ". . ." thế này thì biết đường nào mà lần đây bạn.
 
Upvote 0
Em chào tất cả thầy cô và anh chị em trên diễn đàn, file của em ngày trước được thầy Ba Tê trợ giúp file này để ghép 2 số. Em đã biên tập lại và giờ muốn ghép 3 vị trí thì thêm vòng lặp nhưng báo lỗi nhờ mọi người sửa giúp em với ạ ( vì em không chuyên về viết code ạ ), em xin cảm ơn ạ.
Mã:
Sub GhepViTri_3So()
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.DisplayAlerts = False
Dim sArr(), dArr(), tArr(), Tmp As Variant, fDay As Date, eDay As Date
Dim i As Long, J1 As Long, k As Long, J2 As Long, J3 As Long, R As Long, R2 As Long, CoL As Long, CoLs As Long, xCol As Long
    CoLs = 82  ' So ky tu trong 1 cell, cot C trong sheet1'
With Sheet1
    sArr = .Range("C4", .Range("C4").End(xlDown)).Value
    R = UBound(sArr)    'So dong cua mang sArr'
ReDim dArr(1 To R, 1 To CoLs)
    CoLs = 86
    sArr = .Range("A2").Resize(R + 2, CoLs).Value
    R = UBound(sArr)
End With
With Sheet2
    .Range("B2:QQQ11344").ClearContents
    fDay = .Range("C1").Value
    eDay = .Range("H1").Value
    xCol = eDay - fDay + 20 'So cot trong sheet2'
    ReDim dArr(1 To 82 * 81 + 1, 1 To xCol)
    CoL = 1
    For i = 2 To R
        If sArr(i, 2) >= fDay Then
            If sArr(i, 2) <= eDay Then
                CoL = CoL + 1
                k = 1
                For J1 = 5 To CoLs
                    For J2 = 5 To CoLs
                        For J3 = 5 To CoLs
                        If J1 <> J2 & J2 <> J3 & J1 <> J3 Then
                            dArr(1, CoL) = sArr(i, 2)
                            k = k + 1
                            If CoL = 3 Then dArr(k, 1) = sArr(2, J1) & "-" & sArr(2, J2) & "-" & sArr(2, J3)
                            dArr(k, CoL) = sArr(i, J1) & sArr(i, J2) & sArr(i, J3)
                        End If
                        Next J3
                    Next J2
                Next J1
                If sArr(i, 2) > eDay Then Exit For
            End If
          End If
    Next i
    .Range("A2:A12000").Resize(, 10000).ClearContents
    .Range("A2").Resize(k, xCol) = dArr
End With
Application.ScreenUpdating = True
Application.EnableEvents = True
Application.DisplayAlerts = True
End Sub
Muốn kết quả như thế nào? Nói rỏ yêu cầu và nhập tay ví dụ kết quả
 
Upvote 0
Dạ, em sửa bài viết thêm hình ảnh và tải lại file rồi ạ, bác xem sửa giúp em với ạ. Em cảm ơn ạ.
Chạy sub ABC . . .
Mã:
Sub ABC()
  Dim sArr(), res$(), aNgay(), fDay As Date, eDay As Date
  Dim sRow&, sCol&, fR&, eR&, i&, k&, j&, j2&, j3&, r&, c&

  With Sheet1
    sArr = .Range("B4", .Range("C4").End(xlDown)).Value
  End With
  sRow = UBound(sArr)    'So dong cua mang sArr'
  sCol = Len(sArr(1, 2)) ' So ky tu trong 1 cell, cot C trong sheet1'
  With Sheet2
    fDay = .Range("C1").Value
    eDay = .Range("G1").Value
  End With
  ReDim aNgay(1 To 1, 1 To eDay - fDay + 1)
  ReDim res(1 To sCol * (sCol - 1) * (sCol - 2), 0 To eDay - fDay + 1)
  For i = 1 To sRow
    If sArr(i, 1) >= fDay Then
      If fR = 0 Then fR = i
      If sArr(i, 1) > eDay Then Exit For
      eR = i
      c = c + 1
      aNgay(1, c) = sArr(i, 1)
    End If
  Next i
  For j = 1 To sCol
    For j2 = 1 To sCol
      If j <> j2 Then
        For j3 = 1 To sCol
          If j <> j3 Then
            If j2 <> j3 Then
              k = k + 1
              res(k, 0) = "VT" & j & "-VT" & j2 & "-VT" & j3
              For i = fR To eR
                res(k, i - fR + 1) = Mid(sArr(i, 2), j, 1) & Mid(sArr(i, 2), j2, 1) & Mid(sArr(i, 2), j3, 1)
              Next i
            End If
          End If
        Next j3
      End If
    Next j2
  Next j
  Application.ScreenUpdating = False
  With Sheet2
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i > 1 Then .Range("A2:A" & i).Resize(, 10000).ClearContents
    .Range("B2").Resize(1, c) = aNgay
    .Range("A3").Resize(k, c + 1) = res
  End With
  Application.ScreenUpdating = True
End Sub
 
Upvote 0
sub XYZ dài hơn nhưng chạy nhanh hơn sub ABC
Mã:
Sub XYZ()
  Dim sArr(), t$(), res$(), aNgay(), vt$
  Dim iDay As Date, fDay As Date, eDay As Date, fR&, eR&
  Dim eRow&, sCol&, N&, i&, k&, j&, j2&, j3&, r&, tg#
 
  tg = Timer
  With Sheet2
    fDay = .Range("C1").Value
    eDay = .Range("G1").Value
  End With
  ReDim aNgay(1 To 1, 1 To eDay - fDay + 1)
  With Sheet1
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    For i = 4 To eRow
      iDay = .Range("B" & i).Value
      If iDay >= fDay Then
        If fR = 0 Then fR = i
        If iDay > eDay Then Exit For
        eR = i
        sCol = sCol + 1
        aNgay(1, sCol) = iDay
      End If
    Next i
    If fR = 0 Or fR > eR Then MsgBox ("Khong co du lieu thoa thoi gian!"): Exit Sub
    sArr = .Range("B" & fR & ":C" & eR).Value
  End With
  N = Len(sArr(1, 2)) ' So ky tu trong 1 Chuoi, cot C trong sheet1'
  ReDim t(1 To 2, 1 To sCol)
  ReDim res(1 To N * (N - 1) * (N - 2), 0 To sCol)

  For j = 1 To N
    For i = 1 To sCol
      t(1, i) = Mid(sArr(i, 2), j, 1)
    Next i
    For j2 = 1 To N
      If j <> j2 Then
        For i = 1 To sCol
          t(2, i) = t(1, i) & Mid(sArr(i, 2), j2, 1)
        Next i
        vt = "VT" & j & "-VT" & j2 & "-VT"
        For j3 = 1 To N
          If j <> j3 Then
            If j2 <> j3 Then
              k = k + 1
              res(k, 0) = vt & j3
              For i = 1 To sCol
                res(k, i) = t(2, i) & Mid(sArr(i, 2), j3, 1)
              Next i
            End If
          End If
        Next j3
      End If
    Next j2
  Next j
  Application.ScreenUpdating = False
  With Sheet2
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i > 1 Then .Range("A2:A" & i).Resize(, 10000).ClearContents
    .Range("B2").Resize(1, sCol) = aNgay
    .Range("A3").Resize(k, sCol + 1) = res
  End With
  Application.ScreenUpdating = True
  MsgBox Timer - tg & " Giay!"
End Sub
 
Upvote 0
sub XYZ dài hơn nhưng chạy nhanh hơn sub ABC
Mã:
Sub XYZ()
  Dim sArr(), t$(), res$(), aNgay(), vt$
  Dim iDay As Date, fDay As Date, eDay As Date, fR&, eR&
  Dim eRow&, sCol&, N&, i&, k&, j&, j2&, j3&, r&, tg#
 
  tg = Timer
  With Sheet2
    fDay = .Range("C1").Value
    eDay = .Range("G1").Value
  End With
  ReDim aNgay(1 To 1, 1 To eDay - fDay + 1)
  With Sheet1
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    For i = 4 To eRow
      iDay = .Range("B" & i).Value
      If iDay >= fDay Then
        If fR = 0 Then fR = i
        If iDay > eDay Then Exit For
        eR = i
        sCol = sCol + 1
        aNgay(1, sCol) = iDay
      End If
    Next i
    If fR = 0 Or fR > eR Then MsgBox ("Khong co du lieu thoa thoi gian!"): Exit Sub
    sArr = .Range("B" & fR & ":C" & eR).Value
  End With
  N = Len(sArr(1, 2)) ' So ky tu trong 1 Chuoi, cot C trong sheet1'
  ReDim t(1 To 2, 1 To sCol)
  ReDim res(1 To N * (N - 1) * (N - 2), 0 To sCol)

  For j = 1 To N
    For i = 1 To sCol
      t(1, i) = Mid(sArr(i, 2), j, 1)
    Next i
    For j2 = 1 To N
      If j <> j2 Then
        For i = 1 To sCol
          t(2, i) = t(1, i) & Mid(sArr(i, 2), j2, 1)
        Next i
        vt = "VT" & j & "-VT" & j2 & "-VT"
        For j3 = 1 To N
          If j <> j3 Then
            If j2 <> j3 Then
              k = k + 1
              res(k, 0) = vt & j3
              For i = 1 To sCol
                res(k, i) = t(2, i) & Mid(sArr(i, 2), j3, 1)
              Next i
            End If
          End If
        Next j3
      End If
    Next j2
  Next j
  Application.ScreenUpdating = False
  With Sheet2
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i > 1 Then .Range("A2:A" & i).Resize(, 10000).ClearContents
    .Range("B2").Resize(1, sCol) = aNgay
    .Range("A3").Resize(k, sCol + 1) = res
  End With
  Application.ScreenUpdating = True
  MsgBox Timer - tg & " Giay!"
End Sub
code chạy bị thiếu VT1-VT2-VT1 VÀ VT1-VT2-VT2, và khi chạy đến VT1-VT82 thì bị thiếu VT1-VT82-VT1, và khi chạy đến VT82 thì bị thiếu VT82-VT81-VT82 ạ, bác sửa giúp em với ạ. Em cảm ơn ạ.
 
Upvote 0
code chạy bị thiếu VT1-VT2-VT1 VÀ VT1-VT2-VT2, và khi chạy đến VT1-VT82 thì bị thiếu VT1-VT82-VT1, và khi chạy đến VT82 thì bị thiếu VT82-VT81-VT82 ạ, bác sửa giúp em với ạ. Em cảm ơn ạ.
Cách Lấy kết quả khá lạ, thành phần thứ 3 không nhất quán với 2 thành phần đầu
Bỏ 2 lệnh If
Mã:
Sub XYZ()
  Dim sArr(), t$(), res$(), aNgay(), vt$
  Dim iDay As Date, fDay As Date, eDay As Date, fR&, eR&
  Dim eRow&, sCol&, N&, i&, k&, j&, j2&, j3&, r&, tg#
 
  tg = Timer
  With Sheet2
    fDay = .Range("C1").Value
    eDay = .Range("G1").Value
  End With
  ReDim aNgay(1 To 1, 1 To eDay - fDay + 1)
  With Sheet1
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    For i = 4 To eRow
      iDay = .Range("B" & i).Value
      If iDay >= fDay Then
        If fR = 0 Then fR = i
        If iDay > eDay Then Exit For
        eR = i
        sCol = sCol + 1
        aNgay(1, sCol) = iDay
      End If
    Next i
    If fR = 0 Or fR > eR Then MsgBox ("Khong co du lieu thoa thoi gian!"): Exit Sub
    sArr = .Range("B" & fR & ":C" & eR).Value
  End With
  N = Len(sArr(1, 2)) ' So ky tu trong 1 Chuoi
  ReDim t(1 To 2, 1 To sCol)
  ReDim res(1 To N * (N - 1) * N, 0 To sCol) '***

  For j = 1 To N
    For i = 1 To sCol
      t(1, i) = Mid(sArr(i, 2), j, 1)
    Next i
    For j2 = 1 To N
      If j <> j2 Then
        For i = 1 To sCol
          t(2, i) = t(1, i) & Mid(sArr(i, 2), j2, 1)
        Next i
        vt = "VT" & j & "-VT" & j2 & "-VT"
        For j3 = 1 To N
          'If j <> j3 Then
            'If j2 <> j3 Then
              k = k + 1
              res(k, 0) = vt & j3
              For i = 1 To sCol
                res(k, i) = t(2, i) & Mid(sArr(i, 2), j3, 1)
              Next i
            'End If
          'End If
        Next j3
      End If
    Next j2
  Next j
  Application.ScreenUpdating = False
  With Sheet2
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i > 1 Then .Range("A2:A" & i).Resize(, 10000).ClearContents
    .Range("B2").Resize(1, sCol) = aNgay
    .Range("A3").Resize(k, sCol + 1) = res
  End With
  Application.ScreenUpdating = True
  MsgBox Timer - tg & " Giay!"
End Sub
 
Upvote 0
code chạy bị thiếu VT1-VT2-VT1 VÀ VT1-VT2-VT2, và khi chạy đến VT1-VT82 thì bị thiếu VT1-VT82-VT1, và khi chạy đến VT82 thì bị thiếu VT82-VT81-VT82 ạ, bác sửa giúp em với ạ. Em cảm ơn ạ.
Chỉnh lại Code Bài #1, Bạn chạy thử Sub này, chậm rì, chờ người khác chỉnh lại nhanh hơn.
 

File đính kèm

  • GhepVT_3so.rar
    181.1 KB · Đọc: 10
Lần chỉnh sửa cuối:
Upvote 0
Cách Lấy kết quả khá lạ, thành phần thứ 3 không nhất quán với 2 thành phần đầu
Bỏ 2 lệnh If
Mã:
Sub XYZ()
  Dim sArr(), t$(), res$(), aNgay(), vt$
  Dim iDay As Date, fDay As Date, eDay As Date, fR&, eR&
  Dim eRow&, sCol&, N&, i&, k&, j&, j2&, j3&, r&, tg#
 
  tg = Timer
  With Sheet2
    fDay = .Range("C1").Value
    eDay = .Range("G1").Value
  End With
  ReDim aNgay(1 To 1, 1 To eDay - fDay + 1)
  With Sheet1
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    For i = 4 To eRow
      iDay = .Range("B" & i).Value
      If iDay >= fDay Then
        If fR = 0 Then fR = i
        If iDay > eDay Then Exit For
        eR = i
        sCol = sCol + 1
        aNgay(1, sCol) = iDay
      End If
    Next i
    If fR = 0 Or fR > eR Then MsgBox ("Khong co du lieu thoa thoi gian!"): Exit Sub
    sArr = .Range("B" & fR & ":C" & eR).Value
  End With
  N = Len(sArr(1, 2)) ' So ky tu trong 1 Chuoi
  ReDim t(1 To 2, 1 To sCol)
  ReDim res(1 To N * (N - 1) * N, 0 To sCol) '***

  For j = 1 To N
    For i = 1 To sCol
      t(1, i) = Mid(sArr(i, 2), j, 1)
    Next i
    For j2 = 1 To N
      If j <> j2 Then
        For i = 1 To sCol
          t(2, i) = t(1, i) & Mid(sArr(i, 2), j2, 1)
        Next i
        vt = "VT" & j & "-VT" & j2 & "-VT"
        For j3 = 1 To N
          'If j <> j3 Then
            'If j2 <> j3 Then
              k = k + 1
              res(k, 0) = vt & j3
              For i = 1 To sCol
                res(k, i) = t(2, i) & Mid(sArr(i, 2), j3, 1)
              Next i
            'End If
          'End If
        Next j3
      End If
    Next j2
  Next j
  Application.ScreenUpdating = False
  With Sheet2
    i = .Range("B" & Rows.Count).End(xlUp).Row
    If i > 1 Then .Range("A2:A" & i).Resize(, 10000).ClearContents
    .Range("B2").Resize(1, sCol) = aNgay
    .Range("A3").Resize(k, sCol + 1) = res
  End With
  Application.ScreenUpdating = True
  MsgBox Timer - tg & " Giay!"
End Sub
không nhất quán tức là sao ạ.
 
Upvote 0
Web KT
Back
Top Bottom