Truy xuất dữ liệu theo điều kiện bằng hàm, hoặc VBA (1 người xem)

Liên hệ QC

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

BuiQuangThuan

❆❆❆❆❆❆❆❆❆❆❆❆
Tham gia
17/12/10
Bài viết
2,740
Được thích
3,308
Giới tính
Nam
Nhờ các thầy cô xem giúp em file đính kèm ạ. File đính em em cũng đang dùng code sẵn rồi. Nhưng lại chưa đúng ý lắm.
Các thầy cô có thể giúp em viết code. Hoặc tư vấn em nên dùng hàm gì trong excel để đáp ứng được các yêu cầu trong đó ạ.
Tiện thể cho em hỏi luôn chuyện khác xíu. Khi em xuất dữ liệu từ phần mềm AS400 ra. Nó lại cứ ra 2 tời ( 1 tờ kín và 1 tờ chỉ có 1 cột). Ngày trước là chỉ có 1 tờ. Mà không biết em nghịch cái gì. Giờ thành ra bị như vậy. Có nhờ IT người nhật mà cũng không khắc phục đươc.
Em cám ơn
 

File đính kèm

Lần chỉnh sửa cuối:
Hình như em lại post nhầm khu vực rồi thì phải
 
Nhờ các thầy cô xem giúp em file đính kèm ạ. File đính em em cũng đang dùng code sẵn rồi. Nhưng lại chưa đúng ý lắm.
Các thầy cô có thể giúp em viết code. Hoặc tư vấn em nên dùng hàm gì trong excel để đáp ứng được các yêu cầu trong đó ạ.
Tiện thể cho em hỏi luôn chuyện khác xíu. Khi em xuất dữ liệu từ phần mềm AS400 ra. Nó lại cứ ra 2 tời ( 1 tờ kín và 1 tờ chỉ có 1 cột). Ngày trước là chỉ có 1 tờ. Mà không biết em nghịch cái gì. Giờ thành ra bị như vậy. Có nhờ IT người nhật mà cũng không khắc phục đươc.
Em cám ơn
1/ File đính kèm bài #1 bị lỗi không download được.
2/ Muốn in gọn trong trang in (không bị tràn cột qua trang khác), xem hướng dẫn trong file kèm.

Thân
 

File đính kèm

1/ File đính kèm bài #1 bị lỗi không download được.
2/ Muốn in gọn trong trang in (không bị tràn cột qua trang khác), xem hướng dẫn trong file kèm.

Thân
- Cám ơn anh ạ. Em đã đính kèm lại file rồi ạ. Có điều này em thắc mắc. Sao cái File em nó nặng vây. Anh có thể giải thích và cho em hướng khắc phục không ạ.
- Còn chỗ in ấn ấy ạ. Lý do là em xuất từ phần mềm AS400 ra. Nó tự động in luôn. Nên mình không chỉnh được. Khi tìm đến tận file gốc trong phần mềm. Căn chỉnh xong. đến lúc mình nhập dữ liệu vào và xuất ra. Nó vẫn bị ạ
 
Có điều này em thắc mắc. Sao cái File em nó nặng vây. Anh có thể giải thích và cho em hướng khắc phục không ạ.
Có thể "Save as" với tên đuôi "Excel Binary Workbook", tôi đã làm thử và file của bạn chỉ còn 261Kb (xem file kèm)
Trong quá trình bạn thao tác, có nhiều nguyên nhân làm file tăng dung lượng, bạn có thể tham khảo trên google. Cách đưa về tên đuôi Binary, cũng nhằm làm giảm thiểu dung lượng file.​
Còn chỗ in ấn ấy ạ. Lý do là em xuất từ phần mềm AS400 ra. Nó tự động in luôn. Nên mình không chỉnh được. Khi tìm đến tận file gốc trong phần mềm. Căn chỉnh xong. đến lúc mình nhập dữ liệu vào và xuất ra. Nó vẫn bị ạ
Vào "Devices and Printers", click phải chuột vào biểu tượng máy in "mặc định" (hoặc bất kỳ máy in nào bạn muốn in), chọn "Printing preference", đến tab nào có điều chỉnh: "Paper size", chỉnh về khổ A4.

Thân
 

File đính kèm

Có thể "Save as" với tên đuôi "Excel Binary Workbook", tôi đã làm thử và file của bạn chỉ còn 261Kb (xem file kèm)
Trong quá trình bạn thao tác, có nhiều nguyên nhân làm file tăng dung lượng, bạn có thể tham khảo trên google. Cách đưa về tên đuôi Binary, cũng nhằm làm giảm thiểu dung lượng file.​

Vào "Devices and Printers", click phải chuột vào biểu tượng máy in "mặc định" (hoặc bất kỳ máy in nào bạn muốn in), chọn "Printing preference", đến tab nào có điều chỉnh: "Paper size", chỉnh về khổ A4.

Thân
Vâng. cám ơn anh. Để em sẽ đính kèm cái file của anh lên #1 để mọi người xem ạ.
 
1/ File đính kèm bài #1 bị lỗi không download được.
2/ Muốn in gọn trong trang in (không bị tràn cột qua trang khác), xem hướng dẫn trong file kèm.

Thân
Dùng code
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim sArr(), Res()
  Dim iR As Long, i As Long, k As Long, maStr As String
  Application.EnableEvents = False
  If Not Intersect(Target, Range("C11:C65000")) Is Nothing Then
    If Target.Count = 1 Then
      maStr = Target.Value
      iR = Target.Row
      sArr = Sheets("Data").Range("A3", Sheets("Data").Range("A3").End(xlDown)).Resize(, 8).Value
      sRow = UBound(sArr)
      ReDim Res(1 To sRow, 1 To 19)
      For i = 1 To sRow
        If sArr(i, 2) = maStr Then
          k = k + 1
          If k = 1 Then
            Res(k, 1) = Application.Max(Range("A10:A" & iR)) + 1
            Res(k, 2) = sArr(i, 1)
            Res(k, 3) = maStr
            Res(k, 5) = sArr(i, 8)
            Res(k, 9) = "=RC[-5]*RC[-3]+(RC[-5]*RC[-3]*RC[-1])"
            Res(k, 16) = "=RC[-7]"
            Res(k, 19) = "=RC[-3]+RC[-8]-RC[-10]"
          End If
          Res(k, 6) = sArr(i, 3)
          Res(k, 7) = sArr(i, 6)
          Res(k, 8) = sArr(i, 7)
          Res(k, 10) = sArr(i, 6)
          Res(k, 11) = 0
          Res(k, 12) = sArr(i, 6)
          Res(k, 13) = sArr(i, 5)
          Res(k, 14) = sArr(i, 4)
        End If
      Next i
    End If
  End If
  If k Then
    Range("A" & iR).Resize(k, 19) = Res
    Range("A11").Resize(, 19).Copy
    Range("A" & iR).Resize(k, 19).PasteSpecial Paste:=xlPasteFormats
    Application.CutCopyMode = False
  End If
  Application.EnableEvents = True
End Sub
 

File đính kèm

Dùng code
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim sArr(), Res()
  Dim iR As Long, i As Long, k As Long, maStr As String
  Application.EnableEvents = False
  If Not Intersect(Target, Range("C11:C65000")) Is Nothing Then
    If Target.Count = 1 Then
      maStr = Target.Value
      iR = Target.Row
      sArr = Sheets("Data").Range("A3", Sheets("Data").Range("A3").End(xlDown)).Resize(, 8).Value
      sRow = UBound(sArr)
      ReDim Res(1 To sRow, 1 To 19)
      For i = 1 To sRow
        If sArr(i, 2) = maStr Then
          k = k + 1
          If k = 1 Then
            Res(k, 1) = Application.Max(Range("A10:A" & iR)) + 1
            Res(k, 2) = sArr(i, 1)
            Res(k, 3) = maStr
            Res(k, 5) = sArr(i, 8)
            Res(k, 9) = "=RC[-5]*RC[-3]+(RC[-5]*RC[-3]*RC[-1])"
            Res(k, 16) = "=RC[-7]"
            Res(k, 19) = "=RC[-3]+RC[-8]-RC[-10]"
          End If
          Res(k, 6) = sArr(i, 3)
          Res(k, 7) = sArr(i, 6)
          Res(k, 8) = sArr(i, 7)
          Res(k, 10) = sArr(i, 6)
          Res(k, 11) = 0
          Res(k, 12) = sArr(i, 6)
          Res(k, 13) = sArr(i, 5)
          Res(k, 14) = sArr(i, 4)
        End If
      Next i
    End If
  End If
  If k Then
    Range("A" & iR).Resize(k, 19) = Res
    Range("A11").Resize(, 19).Copy
    Range("A" & iR).Resize(k, 19).PasteSpecial Paste:=xlPasteFormats
    Application.CutCopyMode = False
  End If
  Application.EnableEvents = True
End Sub
Cám ơn anh nhiều ạ. Để em test rồi báo kết quả cho anh và các thầy cô sau ạ
 
Xin cám ơn thầy nhớ. Có duyên mời thầy dùng cơm nhé.
Còn chỗ này nữa. Nhờ các thầy coi giúp em với ạ.
Cột D. Khi em điền số lượng vào hàng mà Cột C có dữ liệu thì cột I lại chỉ có nhảy 1 số cùng hàng với cột C ( do khi điền vào cột C, có loại hàng nó nhảy ra 1 định mức- thì cột I nhảy đúng. Có hàng nhảy ra 2 định mức - cột I lại thiếu 1 hàng không nhảy công thức. Có hàng 2 định mức- cột I thiếu 2 hàng không nhảy công thức).
Có cách nào giải quyết được vấn đề này không ạ các thầy
 
Xin cám ơn thầy nhớ. Có duyên mời thầy dùng cơm nhé.
Còn chỗ này nữa. Nhờ các thầy coi giúp em với ạ.
Cột D. Khi em điền số lượng vào hàng mà Cột C có dữ liệu thì cột I lại chỉ có nhảy 1 số cùng hàng với cột C ( do khi điền vào cột C, có loại hàng nó nhảy ra 1 định mức- thì cột I nhảy đúng. Có hàng nhảy ra 2 định mức - cột I lại thiếu 1 hàng không nhảy công thức. Có hàng 2 định mức- cột I thiếu 2 hàng không nhảy công thức).
Có cách nào giải quyết được vấn đề này không ạ các thầy
Chỉnh lại code
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim sArr(), Res()
  Dim iR As Long, i As Long, k As Long, maStr As String
  Application.EnableEvents = False
  If Not Intersect(Target, Range("C11:C65000")) Is Nothing Then
    If Target.Count = 1 Then
      maStr = Target.Value
      iR = Target.Row
      sArr = Sheets("Data").Range("A3", Sheets("Data").Range("A3").End(xlDown)).Resize(, 8).Value
      sRow = UBound(sArr)
      ReDim Res(1 To sRow, 1 To 19)
      For i = 1 To sRow
        If sArr(i, 2) = maStr Then
          k = k + 1
          If k = 1 Then
            Res(k, 1) = Application.Max(Range("A10:A" & iR)) + 1
            Res(k, 2) = sArr(i, 1)
            Res(k, 3) = maStr
            Res(k, 5) = sArr(i, 8)
          End If
          Res(k, 6) = sArr(i, 3)
          Res(k, 7) = sArr(i, 6)
          Res(k, 8) = sArr(i, 7)
          Res(k, 10) = sArr(i, 6)
          Res(k, 11) = 0
          Res(k, 12) = sArr(i, 6)
          Res(k, 13) = sArr(i, 5)
          Res(k, 14) = sArr(i, 4)
          Res(k, 9) = "=R" & iR & "C[-5]*RC[-3]+R" & iR & "C[-5]*RC[-3]*RC[-1]"
          Res(k, 16) = "=RC[-7]"
          Res(k, 19) = "=RC[-3]+RC[-8]-RC[-10]"
        End If
      Next i
    End If
  End If
  If k Then
    Range("A" & iR).Resize(k, 19) = Res
    Range("A11").Resize(, 19).Copy
    Range("A" & iR).Resize(k, 19).PasteSpecial Paste:=xlPasteFormats
    Application.CutCopyMode = False
  End If
  Application.EnableEvents = True
End Sub
 
Cám ơn thầy rất nhiều. Có lẽ là ok rồi. Tại em đã rời công ty. Nên chưa test ngay được. Một lần nữa cám ơn các thầy cô ạ.
Thêm lệnh tránh nhập đè dữ liệu có trước
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim sArr(), Res()
  Dim iR As Long, i As Long, k As Long, maStr As String
  Application.EnableEvents = False
  If Not Intersect(Target, Range("C11:C65000")) Is Nothing Then
    If Target.Count = 1 Then
      maStr = Target.Value
      iR = Target.Row
      If Len(maStr) > 0 And Len(Range("G" & iR)) > 0 Then
        MsgBox ("Dòng Nhâp Có Du Lieu, Khong Nhap De Len Du Lieu Cu")
        Target.Value = Empty
        Application.EnableEvents = True
        Exit Sub
      End If
      sArr = Sheets("Data").Range("A3", Sheets("Data").Range("A3").End(xlDown)).Resize(, 8).Value
      sRow = UBound(sArr)
      ReDim Res(1 To sRow, 1 To 19)
      For i = 1 To sRow
        If sArr(i, 2) = maStr Then
          k = k + 1
          If k = 1 Then
            Res(k, 1) = Application.Max(Range("A10:A" & iR)) + 1
            Res(k, 2) = sArr(i, 1)
            Res(k, 3) = maStr
            Res(k, 5) = sArr(i, 8)
          End If
          Res(k, 6) = sArr(i, 3)
          Res(k, 7) = sArr(i, 6)
          Res(k, 8) = sArr(i, 7)
          Res(k, 10) = sArr(i, 6)
          Res(k, 11) = 0
          Res(k, 12) = sArr(i, 6)
          Res(k, 13) = sArr(i, 5)
          Res(k, 14) = sArr(i, 4)
          Res(k, 9) = "=R" & iR & "C[-5]*RC[-3]+R" & iR & "C[-5]*RC[-3]*RC[-1]"
          Res(k, 16) = "=RC[-7]"
          Res(k, 19) = "=RC[-3]+RC[-8]-RC[-10]"
        End If
      Next i
    End If
  End If
  If k Then
    Range("A" & iR).Resize(k, 19) = Res
    Range("A11").Resize(, 19).Copy
    Range("A" & iR).Resize(k, 19).PasteSpecial Paste:=xlPasteFormats
    Application.CutCopyMode = False
  End If
  Application.EnableEvents = True
End Sub
 
Thêm lệnh tránh nhập đè dữ liệu có trước
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim sArr(), Res()
  Dim iR As Long, i As Long, k As Long, maStr As String
  Application.EnableEvents = False
  If Not Intersect(Target, Range("C11:C65000")) Is Nothing Then
    If Target.Count = 1 Then
      maStr = Target.Value
      iR = Target.Row
      If Len(maStr) > 0 And Len(Range("G" & iR)) > 0 Then
        MsgBox ("Dòng Nhâp Có Du Lieu, Khong Nhap De Len Du Lieu Cu")
        Target.Value = Empty
        Application.EnableEvents = True
        Exit Sub
      End If
      sArr = Sheets("Data").Range("A3", Sheets("Data").Range("A3").End(xlDown)).Resize(, 8).Value
      sRow = UBound(sArr)
      ReDim Res(1 To sRow, 1 To 19)
      For i = 1 To sRow
        If sArr(i, 2) = maStr Then
          k = k + 1
          If k = 1 Then
            Res(k, 1) = Application.Max(Range("A10:A" & iR)) + 1
            Res(k, 2) = sArr(i, 1)
            Res(k, 3) = maStr
            Res(k, 5) = sArr(i, 8)
          End If
          Res(k, 6) = sArr(i, 3)
          Res(k, 7) = sArr(i, 6)
          Res(k, 8) = sArr(i, 7)
          Res(k, 10) = sArr(i, 6)
          Res(k, 11) = 0
          Res(k, 12) = sArr(i, 6)
          Res(k, 13) = sArr(i, 5)
          Res(k, 14) = sArr(i, 4)
          Res(k, 9) = "=R" & iR & "C[-5]*RC[-3]+R" & iR & "C[-5]*RC[-3]*RC[-1]"
          Res(k, 16) = "=RC[-7]"
          Res(k, 19) = "=RC[-3]+RC[-8]-RC[-10]"
        End If
      Next i
    End If
  End If
  If k Then
    Range("A" & iR).Resize(k, 19) = Res
    Range("A11").Resize(, 19).Copy
    Range("A" & iR).Resize(k, 19).PasteSpecial Paste:=xlPasteFormats
    Application.CutCopyMode = False
  End If
  Application.EnableEvents = True
End Sub
Chào thầy @Hiếu CD.
Cảm ơn thầy về đoạn code bữa trước nhờ thầy giúp. Hôm nay muốn nhờ thầy 1 chút nữa:
1 .Cho em hỏi có đoạn code nào mà lấy được tên workbook để đưa vào 1 ô trong worksheet không ạ. Khi thay đổi thì trong worksheet cũng thay đổi theo ạ? (chẳng hạn ô L6 trong file đính kèm ở #1)
2 .Ở cuối cùng của bảng dữ liệu. Có 1 ô ghi chú cố định mà lúc nào in ra nó cũng có cái dòng ghi chú đó không ạ
 
Chào thầy @Hiếu CD.
Cảm ơn thầy về đoạn code bữa trước nhờ thầy giúp. Hôm nay muốn nhờ thầy 1 chút nữa:
1 .Cho em hỏi có đoạn code nào mà lấy được tên workbook để đưa vào 1 ô trong worksheet không ạ. Khi thay đổi thì trong worksheet cũng thay đổi theo ạ? (chẳng hạn ô L6 trong file đính kèm ở #1)
2 .Ở cuối cùng của bảng dữ liệu. Có 1 ô ghi chú cố định mà lúc nào in ra nó cũng có cái dòng ghi chú đó không ạ
1 .code lấy tên workbook
Sub Macro1()
Range("L6") = ThisWorkbook.Name
End Sub
Còn "Khi thay đổi thì trong worksheet cũng thay đổi theo" không hiểu ý
2 .Ở cuối cùng của bảng dữ liệu. Có 1 ô ghi chú cố định mà lúc nào in ra nó cũng có cái dòng ghi chú đó: Vào Page setup insert Footer
 
2. cái Footer ấy thì em biết. Ý của em là: Ở cuối bảng dữ liệu ấy. Em muốn ghi chú 1 số thứ cố định. Mà giờ có cái code của thầy nếu nhập thêm dữ liệu là nó xóa mất luôn cái gi chú ấy. chẳng hạn dữ liệu của em là "A1:H22". thì em muốn cái ghi chú ấy nó nằm ở vùng G23:H23 chẳng hạn ạ
Còn "Khi thay đổi thì trong worksheet cũng thay đổi theo" không hiểu ý
cái này là do em để 1 form gốc. cứ 1 lần em làm là em sẽ coppy thành 1 cái khác và đổi tên
 

File đính kèm

Web KT

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

Back
Top Bottom