Dùng VBA để chuyển đổi định dạng

Liên hệ QC

soledad_90

Thành viên thường trực
Tham gia
12/1/10
Bài viết
253
Được thích
47
Giới tính
Nam
Em có file yêu cầu cần chuyển đổi :
Với thông tin tại sheet Data và kết quả mong muốn tại sheet yeucau
Tại sheet yeucau em mong muốn code VBA chạy theo số tự nhiên nhưng trong giới hạn bảng tính.
Với sheet Data thì dữ liệu sẽ không giới hạn số cột và số hàng dữ liệu (A1:Y1) và Y327
Em xin cảm ơn ạ!
 

File đính kèm

  • 211123_chuyendoi dong goi giao-nhan. thanhpham-.xls
    131 KB · Đọc: 18
Em có file yêu cầu cần chuyển đổi :
Với thông tin tại sheet Data và kết quả mong muốn tại sheet yeucau
Tại sheet yeucau em mong muốn code VBA chạy theo số tự nhiên nhưng trong giới hạn bảng tính.
Với sheet Data thì dữ liệu sẽ không giới hạn số cột và số hàng dữ liệu (A1:Y1) và Y327
Em xin cảm ơn ạ!
Mong nhận được sự giúp đỡ từ diễn đàn cho topic này ạ.
Em xin cảm ơn!
 
Upvote 0
Tôi ngại làm việc với file xls lắm. Bạn chuyển nó thành xlsx rồi tính tiếp.
 
Upvote 0
Chịu thua. Code này viết rất dài dòng, rất mất thì giờ mà hiện tại thì tôi chưa thấy được cái pattern của dữ liệu.
Chịu khó chờ người sáng suốt hơn tôi.
 
Upvote 0
Chịu thua. Code này viết rất dài dòng, rất mất thì giờ mà hiện tại thì tôi chưa thấy được cái pattern của dữ liệu.
Chịu khó chờ người sáng suốt hơn tôi.
Chuyện code dài ngắn chả là gì cả. Nhưng muốn giúp thì trước hết phải hiểu. Người ta tung dữ liệu và kết quả mong đợi mà không một lời mô tả. Thôi thì nhìn kết quả mong đợi rồi đoán mò.

Đọc từ dòng 4 tới 34 trong sheet yeucau thì tôi thấy sao mình thông minh thế. Tự tin là mình đoán mò đúng. Nhưng đọc tiếp thì tẽn tò. Tưởng rằng cứ theo "qui luật" thì phải có Y36 = 12 nhưng lại thấy Y36 = 1, lẽ ra phải có A37:L37 = 1, 2, ..., 12 thì lại có D37:F37 = 2, 4, 6.

Thôi thì mình thuộc loại chậm hiểu, không lanh lợi như con nhà người ta ...
 
Upvote 0
Chuyện code dài ngắn chả là gì cả. Nhưng muốn giúp thì trước hết phải hiểu. Người ta tung dữ liệu và kết quả mong đợi mà không một lời mô tả. Thôi thì nhìn kết quả mong đợi rồi đoán mò.

Đọc từ dòng 4 tới 34 trong sheet yeucau thì tôi thấy sao mình thông minh thế. Tự tin là mình đoán mò đúng. Nhưng đọc tiếp thì tẽn tò. Tưởng rằng cứ theo "qui luật" thì phải có Y36 = 12 nhưng lại thấy Y36 = 1, lẽ ra phải có A37:L37 = 1, 2, ..., 12 thì lại có D37:F37 = 2, 4, 6.

Thôi thì mình thuộc loại chậm hiểu, không lanh lợi như con nhà người ta ...
Tuỳ theo bác nhận ra được cái pattern của nó.
Nếu nhận ra được cái rất rõ thì code dễ dàng. Nếu chỉ lờ mờ thì code rất dài, vì phải bao qua được cái chỗ lờ mờ đó.
 
Upvote 0
Tuỳ theo bác nhận ra được cái pattern của nó.
Nếu nhận ra được cái rất rõ thì code dễ dàng. Nếu chỉ lờ mờ thì code rất dài, vì phải bao qua được cái chỗ lờ mờ đó.
Tôi chỉ chơi khi tôi hiểu, hoặc tưởng mình hiểu. Nếu chỉ lờ mờ thì không mất công làm gì.
 
Upvote 0
Tôi chỉ chơi khi tôi hiểu, hoặc tưởng mình hiểu. Nếu chỉ lờ mờ thì không mất công làm gì.
Bởi vậy tôi nhường lại cho những người thích code lờ mờ.
Cũng có thể người đa đang luyện kỹ năng theo kiểu "ra đáp án tạm thật nhanh, chỉnh sửa sau".
 
Upvote 0
Em có file yêu cầu cần chuyển đổi :
Với thông tin tại sheet Data và kết quả mong muốn tại sheet yeucau
Tại sheet yeucau em mong muốn code VBA chạy theo số tự nhiên nhưng trong giới hạn bảng tính.
Với sheet Data thì dữ liệu sẽ không giới hạn số cột và số hàng dữ liệu (A1:Y1) và Y327
Em xin cảm ơn ạ!
Chạy code . . .
Mã:
Option Explicit
Sub XYZ()
  Dim sArr(), res(), b12 As Boolean
  Dim sRow&, scol&, sBox&, i&, j&, k&, c&, jC&
  With Sheets("data")
    sArr = .Range("A4", .Cells(.Range("Y" & Rows.Count).End(xlUp).Row + 1, .Range("A3").End(xlToRight).Column)).Value
  End With
  sRow = UBound(sArr):    scol = UBound(sArr, 2)
  ReDim res(1 To 1000, 1 To scol) '1.000 dong ket qua
  k = -2
  For i = 1 To sRow
    If sArr(i, 1) <> Empty Then
      b12 = False
      k = k + 3
      For j = 1 To scol
        res(k, j) = sArr(i, j)
        res(k + 1, j) = sArr(i + 1, j)
        If j > 2 And j < scol Then
          If res(k, j) > 11 Then b12 = True
        End If
      Next j
      If b12 Then
        sBox = res(k + 1, scol)
        jC = 0
        k = k + 2
        For c = 1 To sBox
          If jC = scol Then
            jC = 1
            k = k + 1
          Else
            jC = jC + 1
          End If
          res(k, jC) = c
        Next c
        i = i + 2
      Else
        c = 1
      End If
    ElseIf sArr(i, scol) <> Empty Then
      k = k + 1
      For j = 3 To scol - 1
        res(k, j) = sArr(i, j)
      Next j
      res(k, scol) = c
      c = c + 1
    End If
  Next i
  With Sheets("yeucau")
    .Range("A4:BA1003").Clear
    .Range("A4").Resize(k, scol) = res
    .Range("A4").Resize(k, scol).Borders.LineStyle = 1
  End With
End Sub
 
Upvote 0
Chạy code . . .
Mã:
Option Explicit
Sub XYZ()
  Dim sArr(), res(), b12 As Boolean
  Dim sRow&, scol&, sBox&, i&, j&, k&, c&, jC&
  With Sheets("data")
    sArr = .Range("A4", .Cells(.Range("Y" & Rows.Count).End(xlUp).Row + 1, .Range("A3").End(xlToRight).Column)).Value
  End With
  sRow = UBound(sArr):    scol = UBound(sArr, 2)
  ReDim res(1 To 1000, 1 To scol) '1.000 dong ket qua
  k = -2
  For i = 1 To sRow
    If sArr(i, 1) <> Empty Then
      b12 = False
      k = k + 3
      For j = 1 To scol
        res(k, j) = sArr(i, j)
        res(k + 1, j) = sArr(i + 1, j)
        If j > 2 And j < scol Then
          If res(k, j) > 11 Then b12 = True
        End If
      Next j
      If b12 Then
        sBox = res(k + 1, scol)
        jC = 0
        k = k + 2
        For c = 1 To sBox
          If jC = scol Then
            jC = 1
            k = k + 1
          Else
            jC = jC + 1
          End If
          res(k, jC) = c
        Next c
        i = i + 2
      Else
        c = 1
      End If
    ElseIf sArr(i, scol) <> Empty Then
      k = k + 1
      For j = 3 To scol - 1
        res(k, j) = sArr(i, j)
      Next j
      res(k, scol) = c
      c = c + 1
    End If
  Next i
  With Sheets("yeucau")
    .Range("A4:BA1003").Clear
    .Range("A4").Resize(k, scol) = res
    .Range("A4").Resize(k, scol).Borders.LineStyle = 1
  End With
End Sub

Em cảm ơn anh nhiều ạ.
Code chạy cho ra kết quả đúng rồi ạ.
 
Upvote 0
Đọc từ dòng 4 tới 34 trong sheet yeucau thì tôi thấy sao mình thông minh thế. Tự tin là mình đoán mò đúng. Nhưng đọc tiếp thì tẽn tò. Tưởng rằng cứ theo "qui luật" thì phải có Y36 = 12 nhưng lại thấy Y36 = 1, lẽ ra phải có A37:L37 = 1, 2, ..., 12 thì lại có D37:F37 = 2, 4, 6.
1639442505705.png

Em xin giải thích thêm về quy luật ạ ( đây là thông tin đóng gói ) sẽ khá rườm rà khi trình bày, gây khó hiểu nên em không thể hiện.
Em cảm ơn góp ý của a .
 
Upvote 0
Chạy code . . .
Mã:
Option Explicit
Sub XYZ()
  Dim sArr(), res(), b12 As Boolean
  Dim sRow&, scol&, sBox&, i&, j&, k&, c&, jC&
  With Sheets("data")
    sArr = .Range("A4", .Cells(.Range("Y" & Rows.Count).End(xlUp).Row + 1, .Range("A3").End(xlToRight).Column)).Value
  End With
  sRow = UBound(sArr):    scol = UBound(sArr, 2)
  ReDim res(1 To 1000, 1 To scol) '1.000 dong ket qua
  k = -2
  For i = 1 To sRow
    If sArr(i, 1) <> Empty Then
      b12 = False
      k = k + 3
      For j = 1 To scol
        res(k, j) = sArr(i, j)
        res(k + 1, j) = sArr(i + 1, j)
        If j > 2 And j < scol Then
          If res(k, j) > 11 Then b12 = True
        End If
      Next j
      If b12 Then
        sBox = res(k + 1, scol)
        jC = 0
        k = k + 2
        For c = 1 To sBox
          If jC = scol Then
            jC = 1
            k = k + 1
          Else
            jC = jC + 1
          End If
          res(k, jC) = c
        Next c
        i = i + 2
      Else
        c = 1
      End If
    ElseIf sArr(i, scol) <> Empty Then
      k = k + 1
      For j = 3 To scol - 1
        res(k, j) = sArr(i, j)
      Next j
      res(k, scol) = c
      c = c + 1
    End If
  Next i
  With Sheets("yeucau")
    .Range("A4:BA1003").Clear
    .Range("A4").Resize(k, scol) = res
    .Range("A4").Resize(k, scol).Borders.LineStyle = 1
  End With
End Sub
1639456033459.png

Sau khi e cho chạy 1 đơn hàng mới thì code hiển thị sai kết quả ạ.
Ở đây chỉ có quy luật của thông tin về đóng gói là cố định , còn số size / số lượng đôi / số thùng chắn / số thùng ghép sẽ thay đổi ạ.
View attachment 270297

Em xin giải thích thêm về quy luật ạ ( đây là thông tin đóng gói ) sẽ khá rườm rà khi trình bày, gây khó hiểu nên em không thể hiện.
Em cảm ơn góp ý của a .
Em rất mong sớm nhận được đóng góp chỉnh sửa từ anh ạ.
Em cảm ơn ạ.
 

File đính kèm

  • 211123_chuyendoi dong goi giao-nhan. thanhpham- CAPNHAT-.xlsb
    41.1 KB · Đọc: 5
Upvote 0
Em rất mong sớm nhận được đóng góp chỉnh sửa từ anh ạ.
Em cảm ơn ạ.
Khả năng là thế này. bạn thử sửa code thế này coi
Mã:
Sub XYZ()
  Dim sArr(), res(), b12 As Boolean
  Dim sRow&, scol&, sBox&, i&, j&, k&, c&, jC&, iR&, iC&
  With Sheets("data")
    iC = .Cells(3, Columns.Count).End(1).Column
    iR = .Cells(Rows.Count, iC).End(3).Row
    sArr = .Range("A4").Resize(iR - 3, iC).Value
  End With
  sRow = UBound(sArr):    scol = UBound(sArr, 2)
  ReDim res(1 To 1000, 1 To scol) '1.000 dong ket qua
  k = -2
  For i = 1 To sRow
    If sArr(i, 1) <> Empty Then
      b12 = False
      k = k + 3
      For j = 1 To scol
        res(k, j) = sArr(i, j)
        res(k + 1, j) = sArr(i + 1, j)
        If j > 2 And j < scol Then
          If res(k, j) > 11 Then b12 = True
        End If
      Next j
      If b12 Then
        sBox = res(k + 1, scol)
        jC = 0
        k = k + 2
        For c = 1 To sBox
          If jC = scol Then
            jC = 1
            k = k + 1
          Else
            jC = jC + 1
          End If
          res(k, jC) = c
        Next c
        i = i + 2
      Else
        c = 1
      End If
    ElseIf sArr(i, scol) <> Empty Then
      k = k + 1
      For j = 3 To scol - 1
        res(k, j) = sArr(i, j)
      Next j
      res(k, scol) = c
      c = c + 1
    End If
  Next i
  With Sheets("yeucau")
    .Range("A4:BA1003").Clear
    .Range("A4").Resize(k, scol) = res
    .Range("A4").Resize(k, scol).Borders.LineStyle = 1
  End With
End Sub
 
Upvote 0
Khả năng là thế này. bạn thử sửa code thế này coi
Mã:
Sub XYZ()
  Dim sArr(), res(), b12 As Boolean
  Dim sRow&, scol&, sBox&, i&, j&, k&, c&, jC&, iR&, iC&
  With Sheets("data")
    iC = .Cells(3, Columns.Count).End(1).Column
    iR = .Cells(Rows.Count, iC).End(3).Row
    sArr = .Range("A4").Resize(iR - 3, iC).Value
  End With
  sRow = UBound(sArr):    scol = UBound(sArr, 2)
  ReDim res(1 To 1000, 1 To scol) '1.000 dong ket qua
  k = -2
  For i = 1 To sRow
    If sArr(i, 1) <> Empty Then
      b12 = False
      k = k + 3
      For j = 1 To scol
        res(k, j) = sArr(i, j)
        res(k + 1, j) = sArr(i + 1, j)
        If j > 2 And j < scol Then
          If res(k, j) > 11 Then b12 = True
        End If
      Next j
      If b12 Then
        sBox = res(k + 1, scol)
        jC = 0
        k = k + 2
        For c = 1 To sBox
          If jC = scol Then
            jC = 1
            k = k + 1
          Else
            jC = jC + 1
          End If
          res(k, jC) = c
        Next c
        i = i + 2
      Else
        c = 1
      End If
    ElseIf sArr(i, scol) <> Empty Then
      k = k + 1
      For j = 3 To scol - 1
        res(k, j) = sArr(i, j)
      Next j
      res(k, scol) = c
      c = c + 1
    End If
  Next i
  With Sheets("yeucau")
    .Range("A4:BA1003").Clear
    .Range("A4").Resize(k, scol) = res
    .Range("A4").Resize(k, scol).Borders.LineStyle = 1
  End With
End Sub
Cảm ơn bạn nhiều nhé . Code hiện kết quả đúng rồi.
 
Upvote 0
Đã nói cái này dài lắm mờ. :p
Khong phải bạn viết thiếu. Mà do chính thớt cũng chưa nắm vững hết những điều kiện của mình. Phải có đồ thử rồi từ từ mới ra.
1-2 lần chưa hết các điều kiện còn ẩn bên trong đâu.
 
Upvote 0
Đã nói cái này dài lắm mờ. :p
Khong phải bạn viết thiếu. Mà do chính thớt cũng chưa nắm vững hết những điều kiện của mình. Phải có đồ thử rồi từ từ mới ra.
1-2 lần chưa hết các điều kiện còn ẩn bên trong đâu.
Dạ anh .
Cảm ơn anh đã nhắc nhở, đúng là lỗi từ em khi trình bày chưa hết ý .
Và em cũng xin cảm ơn anh @HieuCD và bạn @BuiQuangThuan đã giúp đỡ ạ.
 
Upvote 0
Web KT

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

Back
Top Bottom