TRỢ GIÚP CODE VBA

Liên hệ QC

MANHTS

Thành viên chính thức
Tham gia
16/11/20
Bài viết
63
Được thích
4
Kính gửi: Các bác trong diễn đàn.
Em có 1 file do ngày trước có nhờ 1 bác làm giúp bây giờ em không liên hệ được với bác ấy nên nhờ các bác giúp giùm
Chẳng là em có 1 sheet để nhập dữ liệu hàng ngày và 1 sheet biểu mẫu để xuất ra (trong file là Sheet "PHIEU NBH")
Hiện tại dữ liệu sheet biểu mẫu này dòng xuất đang ở dòng thứ 4 bây giờ em muốn chuyển lên dòng số 10 (lưu ý dòng chỗ giao nhận mẫu không mất )
Rất mong nhận được sự trợ giúp từ các bác.
Em xin chân thành cảm ơn!
 

File đính kèm

  • FILE CHUYEN MẪU.xlsm
    38.2 KB · Đọc: 17
Nhận xét ban đầu của mình:
1 phiếu giao nhận của bạn mình tạm chia làm 3 phần, & như cách mình gọi 3 phần đó là (từ trên xuống):
a./ Phần tiêu đề, gồm 3 dòng như trang 'Ph. .' của bạn hiện nay (sau khi đã cho macro chạy)
b./ Phần chi tiết, gồm các dòng dữ liệu của 1 mã SF
c./ Phần ký tá để xác nhận quá trình giao nhận

Thường thì số dòng cực đại của 1 phiếu bạn có thể khẳng định được từ kinh nghiệm qua các năm làm việc với phiếu
(Với loại phiếu in trên khổ A5 chắc không quá 9 dòng; nếu quá mươi dòng ta phải in trên khổ A4)

Thêm nữa, khi ta chọn 1 mã phiếu, macro nào đó sẽ cho ta biết số dòng của phần chi tiết
& số dòng này sẽ thay theo số phiếu

Chính vì lẽ đó, phần tiêu đề sẽ không đổi số dòng trong 1 thời gian vĩnh cữu nào đó;

Như vậy ta có thể ấn dịnh phần kí tá ở dòng thứ 99 nào đó, khá dư để chứa phần chi tiết
2uan trọng mình muốn nói là: Sau khi macro đổ các dòng chi tiết, ta tiến hành ẩn các dòng trống trên dòng 99 đi là OK thôi.

Còn như bạn làm hiện này ẩn chứa nguy hiểm tiềm tàng, 1 khi 1 ngày xấu trời nào đó ta không thao tác không theo lối mòn & làm lệch lạc các dữ liệu có trên trang 'Ph. . .' này

Rất vui nếu được thảo luận tiếp cùng (các) bạn!
 
Upvote 0
Nhận xét ban đầu của mình:
1 phiếu giao nhận của bạn mình tạm chia làm 3 phần, & như cách mình gọi 3 phần đó là (từ trên xuống):
a./ Phần tiêu đề, gồm 3 dòng như trang 'Ph. .' của bạn hiện nay (sau khi đã cho macro chạy)
b./ Phần chi tiết, gồm các dòng dữ liệu của 1 mã SF
c./ Phần ký tá để xác nhận quá trình giao nhận

Thường thì số dòng cực đại của 1 phiếu bạn có thể khẳng định được từ kinh nghiệm qua các năm làm việc với phiếu
(Với loại phiếu in trên khổ A5 chắc không quá 9 dòng; nếu quá mươi dòng ta phải in trên khổ A4)

Thêm nữa, khi ta chọn 1 mã phiếu, macro nào đó sẽ cho ta biết số dòng của phần chi tiết
& số dòng này sẽ thay theo số phiếu

Chính vì lẽ đó, phần tiêu đề sẽ không đổi số dòng trong 1 thời gian vĩnh cữu nào đó;

Như vậy ta có thể ấn dịnh phần kí tá ở dòng thứ 99 nào đó, khá dư để chứa phần chi tiết
2uan trọng mình muốn nói là: Sau khi macro đổ các dòng chi tiết, ta tiến hành ẩn các dòng trống trên dòng 99 đi là OK thôi.

Còn như bạn làm hiện này ẩn chứa nguy hiểm tiềm tàng, 1 khi 1 ngày xấu trời nào đó ta không thao tác không theo lối mòn & làm lệch lạc các dữ liệu có trên trang 'Ph. . .' này

Rất vui nếu được thảo luận tiếp cùng (các) bạn!
Tks bác
Em cũng không rành về cái này ạ tại bác ấy làm cho sài thì thấy ok. Bác có thể sửa lại giúp em được không ạ. Em cảm ơn bác
 
Upvote 0
Bạn tham khảo cách của mình!
 

File đính kèm

  • Tìm Kiếm.rar
    45 KB · Đọc: 7
Upvote 0
Bạn tham khảo cách của mình!
Em cảm ơn bác của bác còn chả cần bấm chạy code nữa đúng là Pro quá.
Nhưng bác xem trong file khi ra dữ liệu ở cột A-D lại không có bôi đen dòng và từ cột E-I lại bôi đen thêm 1 cột dư ở dưới ạ
Em cảm ơn bác
 
Upvote 0
Em thấy còn 1 điểm nữa code chưa nhận diện được là Mã SỐ MẪU 1 phiếu có nhiều mã số mẫu nhưng của bác nó gộp hết ô vào 1 ạ
 
Upvote 0
Nhưng bác xem trong file khi ra dữ liệu ở cột A-D lại không có bôi đen dòng và từ cột E-I lại bôi đen thêm 1 cột dư ở dưới ạ Em cảm ơn bác
Thì để bạn tham khảo đường hướng mà thôi còn phần định dạng chưa tính tiếp;
Chắc phải sửa lại code.
♥♥♥ ♦♦♦ ♣♣♣ ♠♠♠
Em thấy còn 1 điểm nữa code chưa nhận diện được là Mã SỐ MẪU 1 phiếu có nhiều mã số mẫu nhưng của bác nó gộp hết ô vào 1 ạ
Phải cụ thể thông tin mới được: Đó mà mã nào, lý ra phải là sao; Mong muốn của bạn là gì.
 
Upvote 0
Thì để bạn tham khảo đường hướng mà thôi còn phần định dạng chưa tính tiếp;

♥♥♥ ♦♦♦ ♣♣♣ ♠♠♠

Phải cụ thể thông tin mới được: Đó mà mã nào, lý ra phải là sao; Mong muốn của bạn là gì.
Anh chỉ cần sửa lại code cũ trong bài gốc, chuyển vùng kết quả xuống dòng 10 theo yêu cầu.
Phần "đuôi" ở dưới ghi vào dòng 100 hay bi nhiêu đó, rồi ẩn các dòng không có dữ liệu (trống) phía trên dòng "đuôi"
 
Upvote 0
Anh chỉ cần sửa lại code cũ trong bài gốc, chuyển vùng kết quả xuống dòng 10 theo yêu cầu.
Phần "đuôi" ở dưới ghi vào dòng 100 hay bi nhiêu đó, rồi ẩn các dòng không có dữ liệu (trống) phía trên dòng "đuôi"
/(hông, chuyện đó xin nhường thầy hay mọi người, khà, khà,. . . . !
Mình chỉ đường hướng sao cho CSDL tồn tại vững chãi & lâu bền mà thôi;
 
Upvote 0
Upvote 0
Kiểu viết code này giống cách viết của @HieuCD, chắc chờ tác giả sửa.
Kiểu viết khác của mình nhiều
Kính gửi: Các bác trong diễn đàn.
Em có 1 file do ngày trước có nhờ 1 bác làm giúp bây giờ em không liên hệ được với bác ấy nên nhờ các bác giúp giùm
Chẳng là em có 1 sheet để nhập dữ liệu hàng ngày và 1 sheet biểu mẫu để xuất ra (trong file là Sheet "PHIEU NBH")
Hiện tại dữ liệu sheet biểu mẫu này dòng xuất đang ở dòng thứ 4 bây giờ em muốn chuyển lên dòng số 10 (lưu ý dòng chỗ giao nhận mẫu không mất )
Rất mong nhận được sự trợ giúp từ các bác.
Em xin chân thành cảm ơn!
Chạy thử
Mã:
Sub XYZ()
  ' Loc du lieu vao sheet PHIEUNBH
  Dim sArr(), Res(), SoPhieu$
  Dim sRow&, eRow&, i&, iR&, k&
  Const fR& = 10 'Dòng dau
 
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  With Sheets("DU LIEU NHAP")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 3 Then MsgBox ("Khong co du lieu!"): Exit Sub
    sArr = .Range("A3:S" & eRow).Value
  End With
  sRow = UBound(sArr, 1)
  ReDim Res(1 To sRow, 1 To 8)
  SoPhieu = Sheets("PHIEUNBH").Range("E2").Value
  For i = 1 To sRow
    If sArr(i, 19) = SoPhieu Then
      k = k + 1
      Res(k, 1) = sArr(i, 7): Res(k, 2) = sArr(i, 9)
      Res(k, 3) = sArr(i, 18): Res(k, 4) = sArr(i, 10)
      Res(k, 5) = "": Res(k, 6) = sArr(i, 12)
      Res(k, 7) = sArr(i, 11)
    End If
  Next i
  With Sheets("PHIEUNBH")
    eRow = .Range("B" & Rows.Count).End(3).Row
    If eRow > fR + 6 Then .Rows(fR & ":" & eRow - 6).Delete
    If k > 0 Then
      If k > 1 Then .Range("A" & fR + 1).Offset(1).Resize(k - 1, 9).Insert xlDown, 0
      .Range("B" & fR).Resize(k, 8).Value = Res
      .Range("B" & fR).Resize(k, 8).Borders.LineStyle = 1
      .Range("B" & fR).Resize(k, 8).Font.Bold = False
      Range("B" & fR).Resize(k, 8).Sort Range("B" & fR), 1, Range("C" & fR), , 1
      If k > 1 Then
        For i = fR To k + fR - 1
          If .Range("B" & i).Value <> .Range("B" & i - 1).Value Then iR = i
          If .Range("B" & i).Value <> .Range("B" & i + 1).Value Then
            If i > iR + 1 Then
              .Range("B" & iR + 1 & ":D" & i).ClearContents
              .Range("B" & iR & ":B" & i).Merge
              .Range("C" & iR & ":C" & i).Merge
              .Range("D" & iR & ":D" & i).Merge
            End If
          End If
        Next
      End If
      eRow = .Range("B" & Rows.Count).End(3).Row
      .Range("D" & eRow - 3).Value = sArr(sRow, 5)
      .Rows(fR & ":" & eRow - 4).RowHeight = 22
      .PageSetup.PrintArea = "$A$1:$I$" & eRow + 1
    End If
  End With
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
  MsgBox "OK"
End Sub
 

File đính kèm

  • FILE CHUYEN.xlsm
    45.1 KB · Đọc: 15
Upvote 0
Kiểu viết khác của mình nhiều

Chạy thử
Mã:
Sub XYZ()
  ' Loc du lieu vao sheet PHIEUNBH
  Dim sArr(), Res(), SoPhieu$
  Dim sRow&, eRow&, i&, iR&, k&
  Const fR& = 10 'Dòng dau
 
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  With Sheets("DU LIEU NHAP")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 3 Then MsgBox ("Khong co du lieu!"): Exit Sub
    sArr = .Range("A3:S" & eRow).Value
  End With
  sRow = UBound(sArr, 1)
  ReDim Res(1 To sRow, 1 To 8)
  SoPhieu = Sheets("PHIEUNBH").Range("E2").Value
  For i = 1 To sRow
    If sArr(i, 19) = SoPhieu Then
      k = k + 1
      Res(k, 1) = sArr(i, 7): Res(k, 2) = sArr(i, 9)
      Res(k, 3) = sArr(i, 18): Res(k, 4) = sArr(i, 10)
      Res(k, 5) = "": Res(k, 6) = sArr(i, 12)
      Res(k, 7) = sArr(i, 11)
    End If
  Next i
  With Sheets("PHIEUNBH")
    eRow = .Range("B" & Rows.Count).End(3).Row
    If eRow > fR + 6 Then .Rows(fR & ":" & eRow - 6).Delete
    If k > 0 Then
      If k > 1 Then .Range("A" & fR + 1).Offset(1).Resize(k - 1, 9).Insert xlDown, 0
      .Range("B" & fR).Resize(k, 8).Value = Res
      .Range("B" & fR).Resize(k, 8).Borders.LineStyle = 1
      .Range("B" & fR).Resize(k, 8).Font.Bold = False
      Range("B" & fR).Resize(k, 8).Sort Range("B" & fR), 1, Range("C" & fR), , 1
      If k > 1 Then
        For i = fR To k + fR - 1
          If .Range("B" & i).Value <> .Range("B" & i - 1).Value Then iR = i
          If .Range("B" & i).Value <> .Range("B" & i + 1).Value Then
            If i > iR + 1 Then
              .Range("B" & iR + 1 & ":D" & i).ClearContents
              .Range("B" & iR & ":B" & i).Merge
              .Range("C" & iR & ":C" & i).Merge
              .Range("D" & iR & ":D" & i).Merge
            End If
          End If
        Next
      End If
      eRow = .Range("B" & Rows.Count).End(3).Row
      .Range("D" & eRow - 3).Value = sArr(sRow, 5)
      .Rows(fR & ":" & eRow - 4).RowHeight = 22
      .PageSetup.PrintArea = "$A$1:$I$" & eRow + 1
    End If
  End With
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
  MsgBox "OK"
End Sub
Em cảm ơn bác Hiếu rất nhiều em chỉ thấy còn 1 chút vấn đề là những dữ liệu 2 dòng thì ở các ô B;C;D nó không tự động mercell bác ạ không biết bác có thể chỉnh lại 1 chút giúp em được không
 
Upvote 0
Em cảm ơn bác Hiếu rất nhiều em chỉ thấy còn 1 chút vấn đề là những dữ liệu 2 dòng thì ở các ô B;C;D nó không tự động mercell bác ạ không biết bác có thể chỉnh lại 1 chút giúp em được không
Chỉnh lại tí xíu
Mã:
Sub XYZ()
  ' Loc du lieu vao sheet PHIEUNBH
  Dim sArr(), Res(), SoPhieu$
  Dim sRow&, eRow&, i&, iR&, k&
  Const fR& = 10 'Dòng dau
 
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  With Sheets("DU LIEU NHAP")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 3 Then MsgBox ("Khong co du lieu!"): Exit Sub
    sArr = .Range("A3:S" & eRow).Value
  End With
  sRow = UBound(sArr, 1)
  ReDim Res(1 To sRow, 1 To 8)
  SoPhieu = Sheets("PHIEUNBH").Range("E2").Value
  For i = 1 To sRow
    If sArr(i, 19) = SoPhieu Then
      k = k + 1
      Res(k, 1) = sArr(i, 7): Res(k, 2) = sArr(i, 9)
      Res(k, 3) = sArr(i, 18): Res(k, 4) = sArr(i, 10)
      Res(k, 5) = "": Res(k, 6) = sArr(i, 12)
      Res(k, 7) = sArr(i, 11)
    End If
  Next i
  With Sheets("PHIEUNBH")
    eRow = .Range("B" & Rows.Count).End(3).Row
    If eRow > fR + 6 Then .Rows(fR & ":" & eRow - 6).Delete
    If k > 0 Then
      If k > 1 Then .Range("A" & fR + 1).Offset(1).Resize(k - 1, 9).Insert xlDown, 0
      .Range("B" & fR).Resize(k, 8).Value = Res
      .Range("B" & fR).Resize(k, 8).Borders.LineStyle = 1
      .Range("B" & fR).Resize(k, 8).Font.Bold = False
      Range("B" & fR).Resize(k, 8).Sort Range("B" & fR), 1, Range("C" & fR), , 1
      If k > 1 Then
        For i = fR To k + fR - 1
          If .Range("B" & i).Value <> .Range("B" & i - 1).Value Then iR = i
          If .Range("B" & i).Value <> .Range("B" & i + 1).Value Then
            If i > iR Then
              .Range("B" & iR + 1 & ":D" & i).ClearContents
              .Range("B" & iR & ":B" & i).Merge
              .Range("C" & iR & ":C" & i).Merge
              .Range("D" & iR & ":D" & i).Merge
            End If
          End If
        Next
      End If
      eRow = .Range("B" & Rows.Count).End(3).Row
      .Range("D" & eRow - 3).Value = sArr(sRow, 5)
      .Rows(fR & ":" & eRow - 4).RowHeight = 22
      .PageSetup.PrintArea = "$A$1:$I$" & eRow + 1
    End If
  End With
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
  MsgBox "OK"
End Sub
 
Upvote 0
Chỉnh lại tí xíu
Mã:
Sub XYZ()
  ' Loc du lieu vao sheet PHIEUNBH
  Dim sArr(), Res(), SoPhieu$
  Dim sRow&, eRow&, i&, iR&, k&
  Const fR& = 10 'Dòng dau
 
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  With Sheets("DU LIEU NHAP")
    eRow = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < 3 Then MsgBox ("Khong co du lieu!"): Exit Sub
    sArr = .Range("A3:S" & eRow).Value
  End With
  sRow = UBound(sArr, 1)
  ReDim Res(1 To sRow, 1 To 8)
  SoPhieu = Sheets("PHIEUNBH").Range("E2").Value
  For i = 1 To sRow
    If sArr(i, 19) = SoPhieu Then
      k = k + 1
      Res(k, 1) = sArr(i, 7): Res(k, 2) = sArr(i, 9)
      Res(k, 3) = sArr(i, 18): Res(k, 4) = sArr(i, 10)
      Res(k, 5) = "": Res(k, 6) = sArr(i, 12)
      Res(k, 7) = sArr(i, 11)
    End If
  Next i
  With Sheets("PHIEUNBH")
    eRow = .Range("B" & Rows.Count).End(3).Row
    If eRow > fR + 6 Then .Rows(fR & ":" & eRow - 6).Delete
    If k > 0 Then
      If k > 1 Then .Range("A" & fR + 1).Offset(1).Resize(k - 1, 9).Insert xlDown, 0
      .Range("B" & fR).Resize(k, 8).Value = Res
      .Range("B" & fR).Resize(k, 8).Borders.LineStyle = 1
      .Range("B" & fR).Resize(k, 8).Font.Bold = False
      Range("B" & fR).Resize(k, 8).Sort Range("B" & fR), 1, Range("C" & fR), , 1
      If k > 1 Then
        For i = fR To k + fR - 1
          If .Range("B" & i).Value <> .Range("B" & i - 1).Value Then iR = i
          If .Range("B" & i).Value <> .Range("B" & i + 1).Value Then
            If i > iR Then
              .Range("B" & iR + 1 & ":D" & i).ClearContents
              .Range("B" & iR & ":B" & i).Merge
              .Range("C" & iR & ":C" & i).Merge
              .Range("D" & iR & ":D" & i).Merge
            End If
          End If
        Next
      End If
      eRow = .Range("B" & Rows.Count).End(3).Row
      .Range("D" & eRow - 3).Value = sArr(sRow, 5)
      .Rows(fR & ":" & eRow - 4).RowHeight = 22
      .PageSetup.PrintArea = "$A$1:$I$" & eRow + 1
    End If
  End With
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
  MsgBox "OK"
End Sub
Em cảm ơn Bác Hiếu code chạy đã rất ok rồi
Xin chân thành cảm ơn bác
 
Upvote 0
Upvote 0
Em cảm ơn Bác Hiếu code chạy đã rất ok rồi
Xin chân thành cảm ơn bác
Mã:
Sub Loc_PhieuNBH()
    ' Loc du lieu vao sheet PHIEUNBH
    Dim sArr(), Res(), i&, iR&, SoPhieu$, K&, R&, iRow&, X&, A&
    Dim ws As Worksheet
    Set ws = Sheets("DU LIEU NHAP")
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    With Sheets("PHIEUNBH")
        iR = .Range("B" & Rows.Count).End(3).Row
        If iR <= 16 Then GoTo Tiep
        .Rows("11:" & iR - 6).Delete
    End With
Tiep:
    SoPhieu = Sheets("PHIEUNBH").Range("E8").Value
    iR = ws.Range("B" & Rows.Count).End(3).Row
    sArr = ws.Range("A3").Resize(iR, 23).Value
    R = UBound(sArr, 1)
    ReDim Res(1 To UBound(sArr, 1), 1 To 8)
    For i = 1 To R
        If sArr(i, 19) = SoPhieu Then
            K = K + 1
            Res(K, 1) = sArr(i, 7): Res(K, 2) = sArr(i, 9)
            Res(K, 3) = sArr(i, 18): Res(K, 4) = sArr(i, 10)
            Res(K, 5) = "": Res(K, 6) = sArr(i, 12)
            Res(K, 7) = sArr(i, 11)
            Sheets("PHIEUNBH").Range("N1").Value = sArr(i, 5)
        End If
    Next
    With Sheets("PHIEUNBH")
        If K > 0 Then
            If K > 1 Then
            .Cells(10, 1).Offset(1).Resize(K - 1, 9).Insert xlDown, 0
            End If
            .Range("B10").Resize(K, 8).Value = Res
            .Range("B10").Resize(K, 8).Borders.LineStyle = 1
            .Range("B10").Resize(K, 8).Font.Bold = False
            .Range("B10").Resize(K, 8).Sort .Range("B9"), xlAscending, .Range("C9")
            If K > 1 Then
            For i = K + 9 To 10 Step -1
                If .Range("B" & i).Value = .Range("B" & i - 1).Value Then
                    .Range("B" & i & ":B" & i - 1).Merge
                    .Range("C" & i & ":C" & i - 1).Merge
                    .Range("D" & i & ":D" & i - 1).Merge
                End If
            Next
            End If
            iR = .Range("B" & Rows.Count).End(3).Row
            .Range("D" & iR - 3).Value = .[N1].Value
            .Rows("4:" & iR - 4).RowHeight = 22
            .[N1].ClearContents
            .PageSetup.PrintArea = "$A$1:$I$" & K + 16
        End If
    End With
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
    MsgBox "OK"
End Sub
gửi lại thớt code sửa
 
Upvote 0
Web KT

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

Back
Top Bottom