Chuyên mục xử lý, gỡ rối code VBA (1 người xem)

Liên hệ QC

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

Status
Không mở trả lời sau này.

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,970
Xin chỉnh giúp đoạn code bên dưới vì khi đưa câu Option Explicit thì nó bị lỗi.
Cảm ơn các anh chị nhiều.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
For Each Cll In Intersect(Target.EntireRow, [B:B])
If Cll.Row > 7 Then
If Cll.Value = "" Then
Range("A8:A1000").ClearContents
Else
If Range("A" & Cll.Row).Formula = "" Then Range("A" & Cll.Row).FormulaR1C1 = "=IF(RC[1]<>"""",MAX(R7C1:R[-1]C)+1,"""")"
If Range("L" & Cll.Row).Formula = "" Then Range("L" & Cll.Row).FormulaR1C1 = "=IF(RC[-10]="""","""",IF(RC[-5]=""x"",""x"",""/""))"
If Range("M" & Cll.Row).Formula = "" Then Range("M" & Cll.Row).FormulaR1C1 = "=IF(RC[-11]="""","""",IF(RC[-2]=R1C11,""Cdi"",IF(RC[-2]=R2C11,""Cde"",""/"")))"
If Range("N" & Cll.Row).Formula = "" Then Range("N" & Cll.Row).FormulaR1C1 = "=RIGHT(RC[-6],2)"
End If
End If
Next
Application.EnableEvents = True
End Sub
 
Upvote 0
Chào cả nhà. Mình mới học VBA nên gà mờ quá. Đang code đến chỗ này thì nó báo lỗi Application-Defined or Object-defined error 1004 chỗ Do While mà mình k hiểu mình sai ở đâu. Mong các cao nhân chỉ giáo
Mã:
Sub Button1_Click()

Dim id1, id2, id3, id4, id5, id6 As Variant

Dim i, n As Integer

Worksheets("ACC").Activate

id1 = Sheets("ACC").Range("E5").Value
id2 = Sheets("ACC").Range("G5").Value
id3 = Sheets("ACC").Range("I5").Value
id4 = Sheets("ACC").Range("K5").Value
id5 = Sheets("ACC").Range("M5").Value
id6 = Sheets("ACC").Range("O5").Value

Worksheets("TOEICScore").Activate



Do While id1 = Sheets("TOEICScore").Range("A", i).Value Or Sheets("TOEICScore").Range("A", i).Value = Null
      If id1 = Sheets("TOEICScore").Range("A", i).Value Then
         Sheets("ACC").Range("F5").Value = Sheets("TOEICScore").Range("B", i).Value
         Sheets("ACC").Range("E21").Value = Sheets("TOEICScore").Range("F", i).Value
         Sheets("ACC").Range("F21").Value = Sheets("TOEICScore").Range("E", i).Value
      End If
      i = i + 1

Loop

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chỉnh giúp đoạn code bên dưới vì khi đưa câu Option Explicit thì nó bị lỗi.
Cảm ơn các anh chị nhiều.
Mã:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range
For Each Cll In Intersect(Target.EntireRow, [B:B])
  If Cll.Row > 7 Then
    If Cll.Value = "" Then
      Range("A8:A1000").ClearContents
    Else
      If Range("A" & Cll.Row).Formula = "" Then Range("A" & Cll.Row).FormulaR1C1 = "=IF(RC[1]<>"""",MAX(R7C1:R[-1]C)+1,"""")"
      If Range("L" & Cll.Row).Formula = "" Then Range("L" & Cll.Row).FormulaR1C1 = "=IF(RC[-10]="""","""",IF(RC[-5]=""x"",""x"",""/""))"
      If Range("M" & Cll.Row).Formula = "" Then Range("M" & Cll.Row).FormulaR1C1 = "=IF(RC[-11]="""","""",IF(RC[-2]=R1C11,""Cdi"",IF(RC[-2]=R2C11,""Cde"",""/"")))"
      If Range("N" & Cll.Row).Formula = "" Then Range("N" & Cll.Row).FormulaR1C1 = "=RIGHT(RC[-6],2)"
    End If
  End If
Next
End Sub
 
Upvote 0
Mã:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range
For Each Cll In Intersect(Target.EntireRow, [B:B])
  If Cll.Row > 7 Then
    If Cll.Value = "" Then
      Range("A8:A1000").ClearContents
    Else
      If Range("A" & Cll.Row).Formula = "" Then Range("A" & Cll.Row).FormulaR1C1 = "=IF(RC[1]<>"""",MAX(R7C1:R[-1]C)+1,"""")"
      If Range("L" & Cll.Row).Formula = "" Then Range("L" & Cll.Row).FormulaR1C1 = "=IF(RC[-10]="""","""",IF(RC[-5]=""x"",""x"",""/""))"
      If Range("M" & Cll.Row).Formula = "" Then Range("M" & Cll.Row).FormulaR1C1 = "=IF(RC[-11]="""","""",IF(RC[-2]=R1C11,""Cdi"",IF(RC[-2]=R2C11,""Cde"",""/"")))"
      If Range("N" & Cll.Row).Formula = "" Then Range("N" & Cll.Row).FormulaR1C1 = "=RIGHT(RC[-6],2)"
    End If
  End If
Next
End Sub
Cảm ơn HieuCD đã nhiệt tình giúp đỡ.
Chúc Bạn cùng gia đình nhiều niềm vui ngày cuối tuần
 

File đính kèm

Upvote 0
Híc. Ko ai giúp mình à. @@
 
Upvote 0
Mã:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Cll As Range
For Each Cll In Intersect(Target.EntireRow, [B:B])
  If Cll.Row > 7 Then
    If Cll.Value = "" Then
      Range("A8:A1000").ClearContents
    Else
      If Range("A" & Cll.Row).Formula = "" Then Range("A" & Cll.Row).FormulaR1C1 = "=IF(RC[1]<>"""",MAX(R7C1:R[-1]C)+1,"""")"
      If Range("L" & Cll.Row).Formula = "" Then Range("L" & Cll.Row).FormulaR1C1 = "=IF(RC[-10]="""","""",IF(RC[-5]=""x"",""x"",""/""))"
      If Range("M" & Cll.Row).Formula = "" Then Range("M" & Cll.Row).FormulaR1C1 = "=IF(RC[-11]="""","""",IF(RC[-2]=R1C11,""Cdi"",IF(RC[-2]=R2C11,""Cde"",""/"")))"
      If Range("N" & Cll.Row).Formula = "" Then Range("N" & Cll.Row).FormulaR1C1 = "=RIGHT(RC[-6],2)"
    End If
  End If
Next
End Sub
Với đoạn code trên khi thực hiện với dữ liệu khoảng 3000 dòng. code chạy rất lâu.
Xin nhờ các anh chị có thể chỉnh giúp code trên để chạy được nhanh hơn.
Cảm ơn các anh chị nhiều.
 

File đính kèm

Upvote 0
Với đoạn code trên khi thực hiện với dữ liệu khoảng 3000 dòng. code chạy rất lâu.
Xin nhờ các anh chị có thể chỉnh giúp code trên để chạy được nhanh hơn.
Cảm ơn các anh chị nhiều.
Đã dùng VBA mà nạp công thức cho từng dòng là "kỳ cục". Công thức càng IF() nhiều lại càng nặng.
Ráng chịu đi, hoặc xử lý tất cả bằng VBA 1 lần.
 
Upvote 0
Đã dùng VBA mà nạp công thức cho từng dòng là "kỳ cục". Công thức càng IF() nhiều lại càng nặng.
Ráng chịu đi, hoặc xử lý tất cả bằng VBA 1 lần.
Cảm ơn Thầy.
Nhờ Thầy có thể viết giúp đoạn code với ạ. ( Code sẽ xử lý trên các cột tô màu vàng )
Xin cảm ơn Thầy nhiều.
 

File đính kèm

Upvote 0
Cảm ơn Thầy.
Nhờ Thầy có thể viết giúp đoạn code với ạ. ( Code sẽ xử lý trên các cột tô màu vàng )
Xin cảm ơn Thầy nhiều.
Cột B không biết! Cột V (Nam) là thừa (Tốn công thức) trong khi cột U ghi "x" là Nữ, để trống đã biết là Nam.
Tôi có chèn thêm 1 dòng 2, dữ liệu từ dòng 3.
PHP:
Public Sub GPE()
Dim sArr(), dArr(), I As Long, R As Long, Txt As String
Txt = "'11-14"
sArr = Range("M3", Range("M3").End(xlDown)).Resize(, 35).Value
R = UBound(sArr): ReDim dArr(1 To R, 1 To 3)
For I = 1 To R
    If sArr(I, 24) <> Empty Then
        If sArr(I, 24) = "HTCHTH" Then
            dArr(I, 1) = "HT" & sArr(I, 25)
        ElseIf sArr(I, 27) <> Empty Or sArr(I, 28) <> Empty Then
            dArr(I, 1) = "CDi-BHo"
        Else
            dArr(I, 1) = Left(sArr(I, 24), 1)
        End If
    End If
    dArr(I, 2) = Txt             '<--------------Cột B?'
    dArr(I, 3) = IIf(sArr(I, 31) <> Empty, sArr(I, 31), "/")
Next I
Range("A3").Resize(R, 3) = dArr
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cột B không biết!
PHP:
Public Sub GPE()
Dim sArr(), dArr(), I As Long, R As Long, Txt As String
Txt = "'11-14"
sArr = Range("M3", Range("M3").End(xlDown)).Resize(, 35).Value
R = UBound(sArr): ReDim dArr(1 To R, 1 To 3)
For I = 1 To R
    If sArr(I, 24) <> Empty Then
        If sArr(I, 24) = "HTCHTH" Then
            dArr(I, 1) = "HT" & sArr(I, 25)
        ElseIf sArr(I, 27) <> Empty Or sArr(I, 28) <> Empty Then
            dArr(I, 1) = "CDi-BHo"
        Else
            dArr(I, 1) = Left(sArr(I, 24), 1)
        End If
    End If
    dArr(I, 2) = Txt             '<--------------Cột B?'
    dArr(I, 3) = IIf(sArr(I, 31) <> Empty, sArr(I, 31), "/")
Next I
Range("A3").Resize(R, 3) = dArr
End Sub
Do vội quá nên nhầm mong thầy thông cảm.
Cột B dùng để tính độ tuổi 11-14 tuổi còn đang học.
Cách tính: lấy năm hiện tại - năm (cột S ). Nếu kết quả bằng hoặc lớn hơn 11 cùng với điều kiện ký tự đầu tiên bên trái cột AJ nhỏ hơn hoặc bằng 5 sẽ ghi ở cột B là 11-14
Cảm ơn thầy nhiều ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Thử xem file này coi có đúng ý bạn không.
Dạ đúng rồi ạ, e cảm ơn bác nhiều, nhưng e xin phép được nhờ thêm tí nữa ạ!
Hiện giờ dữ liệu ở M6 chỉ có thể được nhập khi có đủ điều kiện ở K6 là "CHUYỂN ĐƠN"
E muốn nó copy và lặp lại ở tất cả các dòng khi Em sử dụng nút thêm dòng để chèn thêm dòng trong bản tính, để tất cả các dòng chèn thêm đều đáp ứng được yêu cầu cầu tương ứng cho cột M khi có dữ liệu "CHUYỂN ĐƠN" ở cột K được ko ạ?
 

File đính kèm

Upvote 0
Cho em hỏi, hiện tại em có 2 sheet, sheet1 là BQ_Mau và sheet2 là BQ_KMau em lấy được dữ liệu vào một sheet thứ 3 rồi, nhưng trong 2 sheet cần lấy dữ liệu có dữ liệu trùng nhau. Em có viết một đoạn code để lọc dữ liệu mà khi chạy thì tất cả tên ở sheet2 đều giống nhau nhưng vẫn chưa lọc được. Mọi người xem và gợi ý giúp em cách sửa code với ạ. Em cảm ơn.
Đây là đoạn code lấy dữ liệu ở sheet2.
PHP:
Dim shBQMau As Worksheet
    Dim shBQKMau As Worksheet
    Dim j As Long
    Dim i As Long
    Dim LastRowBQMau As Long
    Dim LastRowBQKMau As Long
  
    wsKCSKo.Select
    Cells(csHangTieuDe, csCotMaVatTu).End(xlDown).Select
    intSoLuongHang = ActiveCell.Row - csHangTieuDe
    
    Set shBQMau = ActiveWorkbook.Worksheets("BQ_Mau")
    Set shBQKMau = ActiveWorkbook.Worksheets("BQ_KMau")
    LastRowBQMau = shBQMau.Cells(Rows.count, "B").End(xlUp).Row
    LastRowBQKMau = shBQKMau.Cells(Rows.count, "B").End(xlUp).Row
    

    For H = 0 To intSoLuongHang - 1

            Set rgDuLieu = Cells(csHangTieuDe + 1 + H, csCotTonCuoiKCS)

            If (rgDuLieu.Value <> 0) Then
            
                intCount = intCount + 1
            
                rgTieuDe_NgayChot.Offset(intCount, 0).Value = NgayChot

                MaVatTu = Cells(rgDuLieu.Row(), csCotMaVatTu)
                MaKho = csMaKhoPXKCS
                For i = 7 To LastRowBQKMau
                For j = 7 To LastRowBQMau
                If shBQMau.Range("B" & j).Value = shBQKMau.Range("B" & i).Value Then
                MaVatTu = shBQKMau.Range("B" & j).Value
                Else
                MaVatTu = shBQKMau.Range("B" & i).Value
                End If
                Next j
                Next i

                ' Chuyen doi ma Phoi sang ma chi tiet thuong
                Call DieuChinhMa(MaVatTu, "", "", MaVatTuDC, "", MaKhoDC)
                rgTieuDe_MaVatTu.Offset(intCount, 0).Value = MaVatTuDC
                rgTieuDe_MaKho.Offset(intCount, 0).Value = MaKho

                MaBeMat = "_"
                rgTieuDe_MaBeMat.Offset(intCount, 0).Value = MaBeMat

                SoLuong = rgDuLieu.Value
                If SoLuong < 0 Then
                    MsgBox ("Bang KCS, kiem tra lai ma " & MaVatTu & "-" & MaBeMat & " tai kho " & MaKho & " bi am " & SoLuong)
                End If
                rgTieuDe_SoLuong.Offset(intCount, 0).Value = SoLuong

            End If
          
NextH8:
    Next H
 
Lần chỉnh sửa cuối:
Upvote 0
NHờ các anh chị sửa giúp đoạn code trong file.
Khi nhập 1 vào ô K1 sheet AB thì code chạy nhưng nhập 2 code báo lỗi.
Xin cảm ơn
 

File đính kèm

Upvote 0
Lỗi tùm lum, không biết muốn sao.
Cảm ơn Thầy đã giúp đỡ.
NHờ Thầy giúp cho tí nữa ạ:
- Khi nhập 1 ở ô K1 sẽ lọc ra 10 dòng dữ liệu ( theo điều kiện tại vùng L1:Q3) từ sheet Data gán vào sheet AB như hiện tại
- Khi nhập 2 ở ô K1 sẽ lọc ra 10 dòng dữ liệu tiếp theo ( theo điều kiện tại vùng L1:Q3) từ sheet Data gán vào sheet AB và cột STT sẽ tính bắt đầu từ 11 đến 20
( trong file khi sửa dữ liệu cột lớp sheet Data thì sheet AB lọc không đủ 10 dòng dữ liệu )
 

File đính kèm

Upvote 0
Nhờ các anh chị xem giúp edit code để tìm được trong các sub-folder nhé. File này của anh QuangHai mình tìm được nhưng mình không search được trong các sub-folder. Cảm ơn anh chị
 

File đính kèm

Upvote 0
Nhờ các anh chị xem giúp edit code để tìm được trong các sub-folder nhé. File này của anh QuangHai mình tìm được nhưng mình không search được trong các sub-folder. Cảm ơn anh chị
Có sẵn rồi mà sửa gì nữa.
Sửa
PHP:
   Sarr = GetAllFile(path, 0)
thành
PHP:
   Sarr = GetAllFile(path, True)
 
Upvote 0
Upvote 0
Cảm ơn Thầy đã giúp đỡ.
NHờ Thầy giúp cho tí nữa ạ:
- Khi nhập 1 ở ô K1 sẽ lọc ra 10 dòng dữ liệu ( theo điều kiện tại vùng L1:Q3) từ sheet Data gán vào sheet AB như hiện tại
- Khi nhập 2 ở ô K1 sẽ lọc ra 10 dòng dữ liệu tiếp theo ( theo điều kiện tại vùng L1:Q3) từ sheet Data gán vào sheet AB và cột STT sẽ tính bắt đầu từ 11 đến 20
( trong file khi sửa dữ liệu cột lớp sheet Data thì sheet AB lọc không đủ 10 dòng dữ liệu )
Bạn xem lại file này, dữ liệu mẫu cũng phải tương đối có đủ dữ liệu, đưa dữ liệu chỉ có 1 lớp sao kiểm tra được?
 

File đính kèm

Upvote 0
Có cách nào chỉ nhập dữ liệu không trùng mà không nhập dữ liệu trùng không mọi người, ko dùng xóa dữ liệu trùng?
 
Upvote 0
Thử xem file này coi có đúng ý bạn không.
Dạ đúng rồi ạ, e cảm ơn bác nhiều, nhưng e xin phép được nhờ thêm tí nữa ạ!
Hiện giờ dữ liệu ở M6 chỉ có thể được nhập khi có đủ điều kiện ở K6 là "CHUYỂN ĐƠN"
E muốn nó copy và lặp lại ở tất cả các dòng khi Em sử dụng nút thêm dòng để chèn thêm dòng trong bản tính, để tất cả các dòng chèn thêm đều đáp ứng được yêu cầu cầu tương ứng cho cột M khi có dữ liệu "CHUYỂN ĐƠN" ở cột K được ko ạ?
Nhờ Bác #Ba Tê xem giúp em!
 

File đính kèm

Upvote 0
Dạ đúng rồi ạ, e cảm ơn bác nhiều, nhưng e xin phép được nhờ thêm tí nữa ạ!
Hiện giờ dữ liệu ở M6 chỉ có thể được nhập khi có đủ điều kiện ở K6 là "CHUYỂN ĐƠN"
E muốn nó copy và lặp lại ở tất cả các dòng khi Em sử dụng nút thêm dòng để chèn thêm dòng trong bản tính, để tất cả các dòng chèn thêm đều đáp ứng được yêu cầu cầu tương ứng cho cột M khi có dữ liệu "CHUYỂN ĐƠN" ở cột K được ko ạ?
Nhờ Bác #Ba Tê xem giúp em!
Chuyển từ một ô sang một vùng?
Chèn dòng là chuyện của bạn, tôi không biết à nghe!
 

File đính kèm

Upvote 0
Nhờ các anh chị chỉnh sửa giúp code.

1. Nhờ anh chị chỉnh code khi "phân tích vật tư" thì tại ô G9 khi click sẽ là =1.03*200 chứ không phải là 206. giống như cột D13 tại sheet CSDL DM

2. Nhờ a thêm code thêm đơn vị vật liệu tại cột E, Hiện tại cột E chỉ hiện đơn vị cho hàng đầu thôi.
 

File đính kèm

Upvote 0
Mọi người xem giúp em code trong Module Tong_hop_cong này sai ở đâu mà không chạy

PHP:
Option Explicit
Private Sub Tong_cong()
Dim Dic As Object, Col As Object, ws As Worksheet, Tem As String, Rws As Long
Dim R As Long, I As Long, J As Long, K As Long, C As Long
Dim sArr As Variant, dArr(1 To 10000, 1 To 40)
Set Dic = CreateObject("Scripting.Dictionary")

Set Col = CreateObject("Scripting.Dictionary")
With Application
    .CalculateBeforeSave = False
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
    .EnableEvents = False
    .EnableCancelKey = xlErrorHandler
End With

With Sheets("Tong hop cong")
    If CStr(.Range("C7")) <> "" Then
        .Range("C8:BP7000").ClearContents
    End If
    sArr = .Range("B6").Resize(, 34).Value
    For J = 4 To 34
        If sArr(1, J) <> Empty Then
            If IsDate(sArr(1, J)) Then Col.Item(Day(sArr(1, J))) = J
        End If
    Next J
    For I = 2 To UBound(sArr, 1)
        If sArr(I, 1) <> Empty Then
            Dic.Item(sArr(I, 1)) = I
        End If
    Next I
End With
For Each ws In Worksheets
    If IsNumeric(ws.Name) Then
        C = Col.Item(Val(ws.Name))
        sArr = ws.Range("B2", ws.Range("B65000").End(xlUp)).Resize(, 17).Value
        For I = 1 To UBound(sArr, 1)
             Tem=sarr(I,1)
            If Len(sArr(I, 1)) = 5 And Left(sArr(I, 1), 1) < 3 And sArr(I, 17) > 0 Then
                If Dic.exists(Tem) Then
                    K = K + 1
                    dArr(K, 1) = 1
                    dArr(K, 2) = sArr(I, 1)
                    dArr(K, 3) = sArr(I, 2)
                End If
                Rws = Dic.Item(Tem)
                dArr(Rws, C) = sArr(I, 17)
            End If
        Next I
    End If
Next ws
Sheets("Tong hop cong").Range("B8").Resize(K, 34) = dArr
Set Dic = Nothing
Set Col = Nothing
With Application
    .CalculateBeforeSave = True
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = True
    .EnableEvents = True
    .CalculateBeforeSave = True
    .EnableCancelKey = xlInterrupt
End With
End Sub

Nguyên tắc là từ list ID cột B trong sheet Tong hop cong, tổng hợp toàn bộ công của các ngày sheet và add vào ngày tương ứng. Ví dụ em có ID 11111, em rà soát các ngày công 26 27 và 28, tại cột R của các sheet này nếu lớn hơn không thì add vào cột ngày tương ứng của sheet Tong hop cong. Từ bài lần trước của bạn hkphuong giúp đỡ cứ tưởng là đã hiểu sơ sơ về Dic rồi vậy mà không hiểu sao lại sai :(
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mọi người xem giúp em code trong Module Tong_hop_cong này sai ở đâu mà không chạy

PHP:
Option Explicit
Private Sub Tong_cong()
Dim Dic As Object, Col As Object, ws As Worksheet, Tem As String, Rws As Long
Dim R As Long, I As Long, J As Long, K As Long, C As Long
Dim sArr As Variant, dArr(1 To 10000, 1 To 40)
Set Dic = CreateObject("Scripting.Dictionary")

Set Col = CreateObject("Scripting.Dictionary")
With Application
    .CalculateBeforeSave = False
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
    .EnableEvents = False
    .EnableCancelKey = xlErrorHandler
End With

With Sheets("Tong hop cong")
    If CStr(.Range("C7")) <> "" Then
        .Range("C8:BP7000").ClearContents
    End If
    sArr = .Range("B6").Resize(, 34).Value
    For J = 4 To 34
        If sArr(1, J) <> Empty Then
            If IsDate(sArr(1, J)) Then Col.Item(Day(sArr(1, J))) = J
        End If
    Next J
    For I = 2 To UBound(sArr, 1)
        If sArr(I, 1) <> Empty Then
            Dic.Item(sArr(I, 1)) = I
        End If
    Next I
End With
For Each ws In Worksheets
    If IsNumeric(ws.Name) Then
        C = Col.Item(Val(ws.Name))
        sArr = ws.Range("B2", ws.Range("B65000").End(xlUp)).Resize(, 17).Value
        For I = 1 To UBound(sArr, 1)
            If Len(sArr(I, 1)) = 5 And Left(sArr(I, 1), 1) < 3 And sArr(I, 17) > 0 Then
                If Dic.exists(sArr(I, 1)) Then
                    K = K + 1
                    dArr(K, 1) = 1
                    dArr(K, 2) = sArr(I, 1)
                    dArr(K, 3) = sArr(I, 2)
                End If
                Rws = Dic.Item(Tem)
                dArr(Rws, C) = sArr(I, 17)
            End If
        Next I
    End If
Next ws
Sheets("Tong hop cong").Range("B8").Resize(K, 34) = dArr
Set Dic = Nothing
Set Col = Nothing
With Application
    .CalculateBeforeSave = True
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = True
    .EnableEvents = True
    .CalculateBeforeSave = True
    .EnableCancelKey = xlInterrupt
End With
End Sub

Nguyên tắc là từ list ID cột B trong sheet Tong hop cong, tổng hợp toàn bộ công của các ngày sheet và add vào ngày tương ứng. Ví dụ em có ID 11111, em rà soát các ngày công 26 27 và 28, tại cột R của các sheet này nếu lớn hơn không thì add vào cột ngày tương ứng của sheet Tong hop cong. Từ bài lần trước của bạn hkphuong giúp đỡ cứ tưởng là đã hiểu sơ sơ về Dic rồi vậy mà không hiểu sao lại sai :(
Code của bạn có đoạn: Rws = Dic.Item(Tem)
Biến Tem tính toán từ đâu ra vậy?
 
Upvote 0
Code của bạn có đoạn: Rws = Dic.Item(Tem)
Biến Tem tính toán từ đâu ra vậy?
Từ đoạn này
For I = 1 To UBound(sArr, 1)
If Len(sArr(I, 1)) = 5 And Left(sArr(I, 1), 1) < 3 And sArr(I, 17) > 0 Then

Em đặt Tem như vậy thầy ạ.
Tem = sarr(i,1)
For I = 1 To UBound(sArr, 1)

Cả đoạn sẽ là như sau
PHP:
Option Explicit
Private Sub Tong_cong()
Dim Dic As Object, Col As Object, ws As Worksheet, Tem As String, Rws As Long
Dim R As Long, I As Long, J As Long, K As Long, C As Long
Dim sArr As Variant, dArr(1 To 10000, 1 To 40)
Set Dic = CreateObject("Scripting.Dictionary")
Set Col = CreateObject("Scripting.Dictionary")
With Application
    .CalculateBeforeSave = False
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
    .EnableEvents = False
    .EnableCancelKey = xlErrorHandler
End With
With Sheets("Tong hop cong")
    sArr = .Range("B6").Resize(100, 34).Value
    For J = 4 To 34
        If sArr(1, J) <> Empty Then
            If IsDate(sArr(1, J)) Then Col.Item(Day(sArr(1, J))) = J
        End If
    Next J
    Set Dic = CreateObject("Scripting.Dictionary")
    For I = 2 To UBound(sArr, 1)
        Dic.Item(sArr(I, 1)) = I
    Next
End With
For Each ws In Worksheets
    If IsNumeric(ws.Name) Then
        C = Col.Item(Val(ws.Name))
        sArr = ws.Range("B2", ws.Range("B65000").End(xlUp)).Resize(, 17).Value
        For I = 1 To UBound(sArr, 1)
            Tem = sArr(I, 1)
            If Len(sArr(I, 1)) = 5 And Left(sArr(I, 1), 1) < 3 And sArr(I, 17) > 0 Then
                If Dic.exists(Tem) Then
                    K = K + 1
                    dArr(K, 1) = sArr(I, 1)
                    dArr(K, 2) = sArr(I, 2)
                    dArr(K, 3) = sArr(I, 3)
                End If
                Rws = Dic.Item(Tem)
                dArr(Rws, C) = sArr(I, 17)
            End If
        Next I
    End If
Next ws
Sheets("Tong hop cong").Range("B7").Resize(K, 34) = dArr
Set Dic = Nothing
Set Col = Nothing
sArr = Range("A6").CurrentRegion
R = UBound(sArr, 1)
C = UBound(sArr, 2)
ReDim tArr(2 To R, 1 To 5)
For I = 2 To R
    For J = 5 To C
        If sArr(1, J) <= sArr(I, 1) Then
            If IsNumeric(sArr(I, J)) Then
                tArr(I, 1) = tArr(I, 1) + sArr(I, J)
            ElseIf sArr(I, J) Like "1D" Then
                tArr(I, 2) = Application.WorksheetFunction.Sum(tArr(I, 2) + Left(sArr(I, J), InStr(1, sArr(I, J), "D") - 1))
            End If
        ElseIf sArr(1, J) > sArr(I, 1) Then
            If IsNumeric(sArr(I, J)) Then
                tArr(I, 3) = tArr(I, 3) + sArr(I, J)
            ElseIf sArr(I, J) Like "1D" Then
                tArr(I, 4) = Application.WorksheetFunction.Sum(tArr(I, 4) + Left(sArr(I, J), InStr(1, sArr(I, J), "D") - 1))
            End If
        End If
    Next J
    tArr(I, 5) = tArr(I, 1) + tArr(I, 2) + tArr(I, 3) + tArr(I, 4)
Next I
Sheets("Tong hop cong").Range("AK7").Resize(I - 2, 5) = tArr
Sheets("Tong hop cong").Range("A6").CurrentRegion.Borders.LineStyle = xlContinuous
With Application
    .CalculateBeforeSave = True
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = True
    .EnableEvents = True
    .CalculateBeforeSave = True
    .EnableCancelKey = xlInterrupt
End With
End Sub

Em bị báo lỗi dòng
dArr(Rws, C) = sArr(I, 17)
 
Lần chỉnh sửa cuối:
Upvote 0
Mọi người xem giúp em code trong Module Tong_hop_cong này sai ở đâu mà không chạy

PHP:
Option Explicit
Private Sub Tong_cong()
Dim Dic As Object, Col As Object, ws As Worksheet, Tem As String, Rws As Long
Dim R As Long, I As Long, J As Long, K As Long, C As Long
Dim sArr As Variant, dArr(1 To 10000, 1 To 40)
Set Dic = CreateObject("Scripting.Dictionary")

Set Col = CreateObject("Scripting.Dictionary")
With Application
    .CalculateBeforeSave = False
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
    .EnableEvents = False
    .EnableCancelKey = xlErrorHandler
End With

With Sheets("Tong hop cong")
    If CStr(.Range("C7")) <> "" Then
        .Range("C8:BP7000").ClearContents
    End If
    sArr = .Range("B6").Resize(, 34).Value
    For J = 4 To 34
        If sArr(1, J) <> Empty Then
            If IsDate(sArr(1, J)) Then Col.Item(Day(sArr(1, J))) = J
        End If
    Next J
    For I = 2 To UBound(sArr, 1)
        If sArr(I, 1) <> Empty Then
            Dic.Item(sArr(I, 1)) = I
        End If
    Next I
End With
For Each ws In Worksheets
    If IsNumeric(ws.Name) Then
        C = Col.Item(Val(ws.Name))
        sArr = ws.Range("B2", ws.Range("B65000").End(xlUp)).Resize(, 17).Value
        For I = 1 To UBound(sArr, 1)
             Tem=sarr(I,1)
            If Len(sArr(I, 1)) = 5 And Left(sArr(I, 1), 1) < 3 And sArr(I, 17) > 0 Then
                If Dic.exists(Tem) Then
                    K = K + 1
                    dArr(K, 1) = 1
                    dArr(K, 2) = sArr(I, 1)
                    dArr(K, 3) = sArr(I, 2)
                End If
                Rws = Dic.Item(Tem)
                dArr(Rws, C) = sArr(I, 17)
            End If
        Next I
    End If
Next ws
Sheets("Tong hop cong").Range("B8").Resize(K, 34) = dArr
Set Dic = Nothing
Set Col = Nothing
With Application
    .CalculateBeforeSave = True
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = True
    .EnableEvents = True
    .CalculateBeforeSave = True
    .EnableCancelKey = xlInterrupt
End With
End Sub

Nguyên tắc là từ list ID cột B trong sheet Tong hop cong, tổng hợp toàn bộ công của các ngày sheet và add vào ngày tương ứng. Ví dụ em có ID 11111, em rà soát các ngày công 26 27 và 28, tại cột R của các sheet này nếu lớn hơn không thì add vào cột ngày tương ứng của sheet Tong hop cong. Từ bài lần trước của bạn hkphuong giúp đỡ cứ tưởng là đã hiểu sơ sơ về Dic rồi vậy mà không hiểu sao lại sai :(

sArr = .Range("B6").Resize(, 34).Value chỉ có 1 dòng thôi
 
Upvote 0
Sub Button16_click()
Dim printFrom As Integer, printTo As Integer, I As Integer
Dim Ra As Range
'================================

printFrom = Sheets("PYC").Range("AG3").Value 'STT bat dau
printTo = Sheets("PYC").Range("AG4").Value 'STT ket thuc

'================================

For I = printFrom To printTo
Sheets("PYC").Range("AG1").Value = I
Sheets("PYC").PrintOut preview:=False
Next I
End Sub


Nhờ các bác chỉnh sửa giùm em đoạn code này với ak. Hiện tại em tạo nút in trên sheet PYC luôn. Em muốn tạo 1 form in dữ liệu, khi nhấn Button16_click thì sẽ hiện form in và in dữ liệu ở sheet PYC. Em làm đủ cách mà không ra. Em có đính kèm Form in dữ liệu.
 

File đính kèm

  • IN PYC.jpg
    IN PYC.jpg
    14.2 KB · Đọc: 3
Upvote 0
Sub Button16_click()
Dim printFrom As Integer, printTo As Integer, I As Integer
Dim Ra As Range
'================================

printFrom = Sheets("PYC").Range("AG3").Value 'STT bat dau
printTo = Sheets("PYC").Range("AG4").Value 'STT ket thuc

'================================

For I = printFrom To printTo
Sheets("PYC").Range("AG1").Value = I
Sheets("PYC").PrintOut preview:=False
Next I
End Sub


Nhờ các bác chỉnh sửa giùm em đoạn code này với ak. Hiện tại em tạo nút in trên sheet PYC luôn. Em muốn tạo 1 form in dữ liệu, khi nhấn Button16_click thì sẽ hiện form in và in dữ liệu ở sheet PYC. Em làm đủ cách mà không ra. Em có đính kèm Form in dữ liệu.
Thay vì đính kèm cái ảnh kia bạn đính kèm File thì đã nhận hàng chục câu trả lời rồi
 
Upvote 0
Em sửa lại code bài #1248 rồi mà vẫn không được. Vẫn báo lỗi như vậy. Không biết còn sai ở đâu.
Bạn cần gì nêu cụ thể, viết mới tiện hơn
Cột ID chỉ lấy 8 dòng qui định trước hay lấy hết ở các sheet khác, các sheet ID là giống hay khác?
 
Upvote 0
Bạn cần gì nêu cụ thể, viết mới tiện hơn
Cột ID chỉ lấy 8 dòng qui định trước hay lấy hết ở các sheet khác, các sheet ID là giống hay khác?
- Em chỉ lấy 8 dòng quy định trước. Từ list ID này sẽ lấy dữ liệu ở cột R của các sheet 26 27 28 nếu có. (26 27 28 là dữ liệu chấm công của lần lượt các ngày 26 27 28). ID có thể có ở sheet này không có ở sheet kia hoặc đều có ở 3 sheet nhưng chắc chắn tối thiểu sẽ có ở 1 trong 3 sheet 26 27 28
 
Upvote 0
- Em chỉ lấy 8 dòng quy định trước. Từ list ID này sẽ lấy dữ liệu ở cột R của các sheet 26 27 28 nếu có. (26 27 28 là dữ liệu chấm công của lần lượt các ngày 26 27 28). ID có thể có ở sheet này không có ở sheet kia hoặc đều có ở 3 sheet nhưng chắc chắn tối thiểu sẽ có ở 1 trong 3 sheet 26 27 28
Mã:
Private Sub Tong_cong()
Dim Dic As Object, ws As Worksheet, Tem As String
Dim ngayd As Long, I As Long, K As Long, C As Long
Dim sArr As Variant, dArr As Variant
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")

With Sheets("Tong hop cong")
    ngayd = Day(.Range("E6").Value)
    If CStr(.Range("C7")) <> "" Then
        .Range("C7:BP7000").ClearContents
    End If
    sArr = .Range("B7", Range("B65000").End(xlUp)).Value
    ReDim dArr(1 To UBound(sArr), 1 To 31)
    For I = 1 To UBound(sArr, 1)
        If sArr(I, 1) <> Empty Then
            Dic.Item(CStr(sArr(I, 1))) = I
        End If
    Next I
End With
For Each ws In Worksheets
    If IsNumeric(ws.Name) Then
        C = ((Val(ws.Name) - ngayd) Mod 31) + 4
        sArr = ws.Range("B2", ws.Range("B65000").End(xlUp)).Resize(, 17).Value
        For I = 1 To UBound(sArr, 1)
            If sArr(I, 17) > 0 Then
                Tem = sArr(I, 1)
                If Dic.exists(CStr(Tem)) Then
                    K = Dic.Item(Tem)
                    dArr(K, 1) = Tem
                    dArr(K, 2) = sArr(I, 2)
                    dArr(K, 3) = sArr(I, 3)
                    dArr(K, C) = sArr(I, 17)
                End If
            End If
        Next I
    End If
Next ws
Sheets("Tong hop cong").Range("B7").Resize(UBound(dArr), 34) = dArr
Set Dic = Nothing
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Mã:
Private Sub Tong_cong()
Dim Dic As Object, ws As Worksheet, Tem As String
Dim ngayd As Long, I As Long, K As Long, C As Long
Dim sArr As Variant, dArr As Variant
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")

With Sheets("Tong hop cong")
    ngayd = Day(.Range("E6").Value)
    If CStr(.Range("C7")) <> "" Then
        .Range("C7:BP7000").ClearContents
    End If
    sArr = .Range("B7", Range("B65000").End(xlUp)).Value
    ReDim dArr(1 To UBound(sArr), 1 To 31)
    For I = 1 To UBound(sArr, 1)
        If sArr(I, 1) <> Empty Then
            Dic.Item(CStr(sArr(I, 1))) = I
        End If
    Next I
End With
For Each ws In Worksheets
    If IsNumeric(ws.Name) Then
        C = ((Val(ws.Name) - ngayd) Mod 31) + 4
        sArr = ws.Range("B2", ws.Range("B65000").End(xlUp)).Resize(, 17).Value
        For I = 1 To UBound(sArr, 1)
            If sArr(I, 17) > 0 Then
                Tem = sArr(I, 1)
                If Dic.exists(CStr(Tem)) Then
                    K = Dic.Item(Tem)
                    dArr(K, 1) = Tem
                    dArr(K, 2) = sArr(I, 2)
                    dArr(K, 3) = sArr(I, 3)
                    dArr(K, C) = sArr(I, 17)
                End If
            End If
        Next I
    End If
Next ws
Sheets("Tong hop cong").Range("B7").Resize(UBound(dArr), 34) = dArr
Set Dic = Nothing
Application.ScreenUpdating = True
End Sub
Tại ngày 23 24 25 xuất hiện #N/A anh ơi.
 
Lần chỉnh sửa cuối:
Upvote 0
Khi chạy nó báo Type mismatch ở dòng If sArr(I, 1) <> Empty Then
Ngoài ra cái cách viết Col ban đầu khá hay có cách nào giữ nguyên cách đó mà vẫn giải quyết được bài toán này không anh? Nếu không được cũng không sao miễn là giải quyết được vấn đề này của e
Type mismatch ở dòng If sArr(I, 1) <> Empty cũng hơi lạ bạn có đổi khai báo Dim không? thử If Len(sArr(I, 1)) > 0 Then
Dùng Dic để tính col chắc ăn hơn, bạn tự thêm vào để thế dòng lệnh dưới xem sau
C = ((Val(ws.Name) - ngayd) Mod 31) + 4
 
Upvote 0
Type mismatch ở dòng If sArr(I, 1) <> Empty cũng hơi lạ bạn có đổi khai báo Dim không? thử If Len(sArr(I, 1)) > 0 Then
Dùng Dic để tính col chắc ăn hơn, bạn tự thêm vào để thế dòng lệnh dưới xem sau
C = ((Val(ws.Name) - ngayd) Mod 31) + 4

Chắc ban đầu code mới dán vào chưa được lưu nên chạy lỗi, chạy lại đã không còn lỗi nữa nhưng cột 23 24 25 xuất hiện giá trị #N/A (3x8 = 24 giá trị #N/A)
 
Upvote 0
Chắc ban đầu code mới dán vào chưa được lưu nên chạy lỗi, chạy lại đã không còn lỗi nữa nhưng cột 23 24 25 xuất hiện giá trị #N/A (3x8 = 24 giá trị #N/A)
Mình quên nhìn các cột cuối
Mã:
Private Sub Tong_cong()
Dim Dic As Object, ws As Worksheet, Tem As String
Dim ngayd As Long, I As Long, K As Long, C As Long
Dim sArr As Variant, dArr As Variant
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")

With Sheets("Tong hop cong")
    ngayd = Day(.Range("E6").Value)
    If CStr(.Range("C7")) <> "" Then
        .Range("C7:BP7000").ClearContents
    End If
    sArr = .Range("B7", .Range("B65000").End(xlUp)).Value
    ReDim dArr(1 To UBound(sArr), 1 To 34)
    For I = 1 To UBound(sArr, 1)
        If Len(sArr(I, 1)) > 0 Then
            Dic.Item(CStr(sArr(I, 1))) = I
        End If
    Next I
End With
For Each ws In Worksheets
    If IsNumeric(ws.Name) Then
        C = ((Val(ws.Name) + 31 - ngayd) Mod 31) + 4
        sArr = ws.Range("B2", ws.Range("B65000").End(xlUp)).Resize(, 17).Value
        For I = 1 To UBound(sArr, 1)
            If sArr(I, 17) > 0 Then
                Tem = sArr(I, 1)
                If Dic.exists(CStr(Tem)) Then
                    K = Dic.Item(Tem)
                    dArr(K, 1) = Tem
                    dArr(K, 2) = sArr(I, 2)
                    dArr(K, 3) = sArr(I, 3)
                    dArr(K, C) = sArr(I, 17)
                End If
            End If
        Next I
    End If
Next ws
Sheets("Tong hop cong").Range("B7").Resize(UBound(dArr), 34) = dArr
Set Dic = Nothing
Application.ScreenUpdating = True
End Sub
 
Upvote 0
Mình quên nhìn các cột cuối
Mã:
Private Sub Tong_cong()
Dim Dic As Object, ws As Worksheet, Tem As String
Dim ngayd As Long, I As Long, K As Long, C As Long
Dim sArr As Variant, dArr As Variant
Application.ScreenUpdating = False
Set Dic = CreateObject("Scripting.Dictionary")

With Sheets("Tong hop cong")
    ngayd = Day(.Range("E6").Value)
    If CStr(.Range("C7")) <> "" Then
        .Range("C7:BP7000").ClearContents
    End If
    sArr = .Range("B7", .Range("B65000").End(xlUp)).Value
    ReDim dArr(1 To UBound(sArr), 1 To 34)
    For I = 1 To UBound(sArr, 1)
        If Len(sArr(I, 1)) > 0 Then
            Dic.Item(CStr(sArr(I, 1))) = I
        End If
    Next I
End With
For Each ws In Worksheets
    If IsNumeric(ws.Name) Then
        C = ((Val(ws.Name) + 31 - ngayd) Mod 31) + 4
        sArr = ws.Range("B2", ws.Range("B65000").End(xlUp)).Resize(, 17).Value
        For I = 1 To UBound(sArr, 1)
            If sArr(I, 17) > 0 Then
                Tem = sArr(I, 1)
                If Dic.exists(CStr(Tem)) Then
                    K = Dic.Item(Tem)
                    dArr(K, 1) = Tem
                    dArr(K, 2) = sArr(I, 2)
                    dArr(K, 3) = sArr(I, 3)
                    dArr(K, C) = sArr(I, 17)
                End If
            End If
        Next I
    End If
Next ws
Sheets("Tong hop cong").Range("B7").Resize(UBound(dArr), 34) = dArr
Set Dic = Nothing
Application.ScreenUpdating = True
End Sub
Từ code của bạn mình viết theo ý giữ nguyên Col như sau:
PHP:
Option Explicit
Private Sub Tong_cong()
Dim Dic As Object, Col As Object, ws As Worksheet, Tem As String, Rws As Long
Dim R As Long, I As Long, J As Long, K As Long, C As Long
Dim sArr As Variant
Set Dic = CreateObject("Scripting.Dictionary")

Set Col = CreateObject("Scripting.Dictionary")
With Application
    .CalculateBeforeSave = False
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
    .EnableEvents = False
    .EnableCancelKey = xlErrorHandler
End With
With Sheets("Tong hop cong")
    If CStr(.Range("C7")) <> "" Then
        .Range("C8:BP7000").ClearContents
    End If
    sArr = .Range("B6", .Range("B65000").End(xlUp)).Resize(, 34).Value
    ReDim dArr(2 To UBound(sArr, 1), 1 To 34)
    For J = 4 To 34
        If sArr(1, J) <> Empty Then
            If IsDate(sArr(1, J)) Then Col.Item(Day(sArr(1, J))) = J
        End If
    Next J
    For I = 2 To UBound(sArr, 1)
        If Len(sArr(I, 1)) > 0 Then
            Dic.Item(CStr(sArr(I, 1))) = I
        End If
    Next I
End With
For Each ws In Worksheets
    If IsNumeric(ws.Name) Then
        C = Col.Item(Val(ws.Name))
        sArr = ws.Range("B2", ws.Range("B65000").End(xlUp)).Resize(, 17).Value
        For I = 1 To UBound(sArr, 1)
            Tem = sArr(I, 1)
            If Dic.exists(CStr(Tem)) Then
                K = Dic.Item(Tem)
                dArr(K, 1) = Tem
                dArr(K, 2) = sArr(I, 2)
                dArr(K, 3) = sArr(I, 3)
                dArr(K, C) = sArr(I, 17)
            End If
        Next I
    End If
Next ws
Sheets("Tong hop cong").Range("B7").Resize(UBound(dArr) - 1, 34) = dArr
Set Dic = Nothing
Set Col = Nothing
With Application
    .CalculateBeforeSave = True
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = True
    .EnableEvents = True
    .CalculateBeforeSave = True
    .EnableCancelKey = xlInterrupt
End With
End Sub

Cái chỗ:
ReDim dArr(2 To UBound(sArr, 1), 1 To 34)
em viết vậy có ổn không vì nếu em viết là
ReDim dArr(1 To UBound(sArr, 1), 1 To 34)
thì khi chạy kết quả xuất hiện ô trống đầu tiên ở B7. Em sửa lại như vậy thì không bị nữa.

Và chỗ này cũng phải viết lại là
Sheets("Tong hop cong").Range("B7").Resize(UBound(dArr) - 1, 34) = dArr
Nếu không thì dòng cuối luôn là các giá trị #N/A
 
Lần chỉnh sửa cuối:
Upvote 0
Xin nhờ các anh chị sửa giúp đoạn code trong file:
Khi lọc với điều kiện tại sheet AB ở ô J3 = 1 nhưng kết quả lọc chưa chính xác ở cột F ( thay vì chỉ lọc các dòng có điều kiện là 1 ở cột O sheet Data )
Xin cảm ơn.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Từ code của bạn mình viết theo ý giữ nguyên Col như sau:
PHP:
Option Explicit
Private Sub Tong_cong()
Dim Dic As Object, Col As Object, ws As Worksheet, Tem As String, Rws As Long
Dim R As Long, I As Long, J As Long, K As Long, C As Long
Dim sArr As Variant
Set Dic = CreateObject("Scripting.Dictionary")

Set Col = CreateObject("Scripting.Dictionary")
With Application
    .CalculateBeforeSave = False
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
    .EnableEvents = False
    .EnableCancelKey = xlErrorHandler
End With
With Sheets("Tong hop cong")
    If CStr(.Range("C7")) <> "" Then
        .Range("C8:BP7000").ClearContents
    End If
    sArr = .Range("B6", .Range("B65000").End(xlUp)).Resize(, 34).Value
    ReDim dArr(2 To UBound(sArr, 1), 1 To 34)
    For J = 4 To 34
        If sArr(1, J) <> Empty Then
            If IsDate(sArr(1, J)) Then Col.Item(Day(sArr(1, J))) = J
        End If
    Next J
    For I = 2 To UBound(sArr, 1)
        If Len(sArr(I, 1)) > 0 Then
            Dic.Item(CStr(sArr(I, 1))) = I
        End If
    Next I
End With
For Each ws In Worksheets
    If IsNumeric(ws.Name) Then
        C = Col.Item(Val(ws.Name))
        sArr = ws.Range("B2", ws.Range("B65000").End(xlUp)).Resize(, 17).Value
        For I = 1 To UBound(sArr, 1)
            Tem = sArr(I, 1)
            If Dic.exists(CStr(Tem)) Then
                K = Dic.Item(Tem)
                dArr(K, 1) = Tem
                dArr(K, 2) = sArr(I, 2)
                dArr(K, 3) = sArr(I, 3)
                dArr(K, C) = sArr(I, 17)
            End If
        Next I
    End If
Next ws
Sheets("Tong hop cong").Range("B7").Resize(UBound(dArr) - 1, 34) = dArr
Set Dic = Nothing
Set Col = Nothing
With Application
    .CalculateBeforeSave = True
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = True
    .EnableEvents = True
    .CalculateBeforeSave = True
    .EnableCancelKey = xlInterrupt
End With
End Sub

Cái chỗ:
ReDim dArr(2 To UBound(sArr, 1), 1 To 34)
em viết vậy có ổn không vì nếu em viết là
ReDim dArr(1 To UBound(sArr, 1), 1 To 34)
thì khi chạy kết quả xuất hiện ô trống đầu tiên ở B7. Em sửa lại như vậy thì không bị nữa.

Và chỗ này cũng phải viết lại là
Sheets("Tong hop cong").Range("B7").Resize(UBound(dArr) - 1, 34) = dArr
Nếu không thì dòng cuối luôn là các giá trị #N/A
Chỉnh lại dArr cho hợp lý hơn
sArr = .Range("B6", .Range("B65000").End(xlUp)).Resize(, 34).Value
ReDim dArr(1 To UBound(sArr, 1) - 1, 1 To 34)

Dic.Item(CStr(sArr(I, 1))) = I - 1

Sheets("Tong hop cong").Range("B7").Resize(UBound(dArr), 34) = dArr
Mã:
Private Sub Tong_cong1()
Dim Dic As Object, Col As Object, ws As Worksheet, Tem As String, Rws As Long
Dim R As Long, I As Long, J As Long, K As Long, C As Long
Dim sArr As Variant
Set Dic = CreateObject("Scripting.Dictionary")

Set Col = CreateObject("Scripting.Dictionary")
With Application
    .CalculateBeforeSave = False
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
    .EnableEvents = False
    .EnableCancelKey = xlErrorHandler
End With
With Sheets("Tong hop cong")
    If CStr(.Range("C7")) <> "" Then
        .Range("C8:BP7000").ClearContents
    End If
    sArr = .Range("B6", .Range("B65000").End(xlUp)).Resize(, 34).Value
    ReDim dArr(1 To UBound(sArr, 1) - 1, 1 To 34)
    For J = 4 To 34
        If sArr(1, J) <> Empty Then
            If IsDate(sArr(1, J)) Then Col.Item(Day(sArr(1, J))) = J
        End If
    Next J
    For I = 2 To UBound(sArr, 1)
        If Len(sArr(I, 1)) > 0 Then
            Dic.Item(CStr(sArr(I, 1))) = I - 1
        End If
    Next I
End With
For Each ws In Worksheets
    If IsNumeric(ws.Name) Then
        C = Col.Item(Val(ws.Name))
        sArr = ws.Range("B2", ws.Range("B65000").End(xlUp)).Resize(, 17).Value
        For I = 1 To UBound(sArr, 1)
            Tem = sArr(I, 1)
            If Dic.exists(CStr(Tem)) Then
                K = Dic.Item(Tem)
                dArr(K, 1) = Tem
                dArr(K, 2) = sArr(I, 2)
                dArr(K, 3) = sArr(I, 3)
                dArr(K, C) = sArr(I, 17)
            End If
        Next I
    End If
Next ws
Sheets("Tong hop cong").Range("B7").Resize(UBound(dArr), 34) = dArr
Set Dic = Nothing
Set Col = Nothing
With Application
    .CalculateBeforeSave = True
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = True
    .EnableEvents = True
    .CalculateBeforeSave = True
    .EnableCancelKey = xlInterrupt
End With
End Sub
 
Upvote 0
Xin nhờ các anh chị sửa giúp đoạn code trong file:
Khi lọc với điều kiện tại sheet AB ở ô J3 = 1 nhưng kết quả lọc chưa chính xác ở cột F ( thay vì chỉ lọc các dòng có điều kiện là 1 ở cột O sheet Data )
Xin cảm ơn.
 

File đính kèm

Upvote 0
Chỉnh lại dArr cho hợp lý hơn
sArr = .Range("B6", .Range("B65000").End(xlUp)).Resize(, 34).Value
ReDim dArr(1 To UBound(sArr, 1) - 1, 1 To 34)

Dic.Item(CStr(sArr(I, 1))) = I - 1

Sheets("Tong hop cong").Range("B7").Resize(UBound(dArr), 34) = dArr
Mã:
Private Sub Tong_cong1()
Dim Dic As Object, Col As Object, ws As Worksheet, Tem As String, Rws As Long
Dim R As Long, I As Long, J As Long, K As Long, C As Long
Dim sArr As Variant
Set Dic = CreateObject("Scripting.Dictionary")

Set Col = CreateObject("Scripting.Dictionary")
With Application
    .CalculateBeforeSave = False
    .Calculation = xlCalculationManual
    .ScreenUpdating = False
    .EnableEvents = False
    .EnableCancelKey = xlErrorHandler
End With
With Sheets("Tong hop cong")
    If CStr(.Range("C7")) <> "" Then
        .Range("C8:BP7000").ClearContents
    End If
    sArr = .Range("B6", .Range("B65000").End(xlUp)).Resize(, 34).Value
    ReDim dArr(1 To UBound(sArr, 1) - 1, 1 To 34)
    For J = 4 To 34
        If sArr(1, J) <> Empty Then
            If IsDate(sArr(1, J)) Then Col.Item(Day(sArr(1, J))) = J
        End If
    Next J
    For I = 2 To UBound(sArr, 1)
        If Len(sArr(I, 1)) > 0 Then
            Dic.Item(CStr(sArr(I, 1))) = I - 1
        End If
    Next I
End With
For Each ws In Worksheets
    If IsNumeric(ws.Name) Then
        C = Col.Item(Val(ws.Name))
        sArr = ws.Range("B2", ws.Range("B65000").End(xlUp)).Resize(, 17).Value
        For I = 1 To UBound(sArr, 1)
            Tem = sArr(I, 1)
            If Dic.exists(CStr(Tem)) Then
                K = Dic.Item(Tem)
                dArr(K, 1) = Tem
                dArr(K, 2) = sArr(I, 2)
                dArr(K, 3) = sArr(I, 3)
                dArr(K, C) = sArr(I, 17)
            End If
        Next I
    End If
Next ws
Sheets("Tong hop cong").Range("B7").Resize(UBound(dArr), 34) = dArr
Set Dic = Nothing
Set Col = Nothing
With Application
    .CalculateBeforeSave = True
    .Calculation = xlCalculationAutomatic
    .ScreenUpdating = True
    .EnableEvents = True
    .CalculateBeforeSave = True
    .EnableCancelKey = xlInterrupt
End With
End Sub

- Cái chỗ ReDim dArr(1 To UBound(sArr, 1) - 1, 1 To 34)
Chắc là để loại bỏ N/A mà không phải trừ 1 phần tử khi gán mảng dArr phải không anh?

- Vậy thì đoạn này: Dic.Item(CStr(sArr(I, 1))) = I - 1 tại sao phải trừ 1? Code của em không trừ 1 mà nó vẫn chạy đúng nhưng của anh nếu không trừ 1 thì sẽ báo lỗi ngay.
 
Upvote 0
- Cái chỗ ReDim dArr(1 To UBound(sArr, 1) - 1, 1 To 34)
Chắc là để loại bỏ N/A mà không phải trừ 1 phần tử khi gán mảng dArr phải không anh?

- Vậy thì đoạn này: Dic.Item(CStr(sArr(I, 1))) = I - 1 tại sao phải trừ 1? Code của em không trừ 1 mà nó vẫn chạy đúng nhưng của anh nếu không trừ 1 thì sẽ báo lỗi ngay.
sArr lấy từ dòng 6, dArr lấy từ dòng 7,nên số dòng của dArr ít hơn sArr 1 dòng, nên khai báo dArr:
ReDim dArr(1 To UBound(sArr, 1) - 1, 1 To 34)

For I = 2 To UBound(sArr, 1)
If Len(sArr(I, 1)) > 0 Then
Dic.Item(CStr(sArr(I, 1))) = I - 1
End If
Next I

Vòng lặp bắt đầu i=2, dArr bắt đầu từ 1, nên I-1 là thứ tự dòng của dArr

Để tường minh hơn và nhẹ code, bạn chỉnh code lại như sau
Mã:
With Sheets("Tong hop cong")
   If CStr(.Range("C7")) <> "" Then
       .Range("C8:BP7000").ClearContents
   End If
   sArr = .Range("B6").Resize(, 34).Value 'lay cot ngay
   For J = 4 To 34
       If sArr(1, J) <> Empty Then
           If IsDate(sArr(1, J)) Then Col.Item(Day(sArr(1, J))) = J
       End If
   Next J
   sArr = .Range("B7", .Range("B65000").End(xlUp)).Value 'lay dong
   ReDim dArr(1 To UBound(sArr, 1), 1 To 34)
   For I = 1 To UBound(sArr, 1)
       If Len(sArr(I, 1)) > 0 Then
           Dic.Item(CStr(sArr(I, 1))) = I 
       End If
   Next I
End With


 
Upvote 0
Nhờ các bác viết giúp mình 1 code vba.
1. khi click vào nút THVT từ sheet xuatDL thì vật tư ( VL, NC, M) được lọc và xuất sang sheet THVT như ví dụ ở sheet THVT.
A) Vật liệu:
xi măng
.........
B)Nhán công
Nhân công
C)Máy thi công
M:...........
 

File đính kèm

Upvote 0
Nhờ các bác viết giúp mình 1 code vba.
1. khi click vào nút THVT từ sheet xuatDL thì vật tư ( VL, NC, M) được lọc và xuất sang sheet THVT như ví dụ ở sheet THVT.
A) Vật liệu:
xi măng
.........
B)Nhán công
Nhân công
C)Máy thi công
M:...........
Bạn chạy Sub này thử
PHP:
Sub Tonghopvattu()
Application.ScreenUpdating = False
    Dim Dic As Object, Tem As String
    Dim sArr(), dArr(), tArr(), Er As Long
    Dim I As Long, J As Long, N As Long, K As Long, LaMa As Long, Stt As Long, Rws As Long
Set Dic = CreateObject("scripting.Dictionary")
With Sheets("xuatDL")
    sArr = .Range("C7", .Range("C65536").End(3)).Resize(, 5).Value
    tArr = .Range("L1:N1").Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 5)
With Sheets("THVT")
    With .Range("A6:I1000")
        .ClearContents: .Interior.ColorIndex = 0: .Borders.LineStyle = 0: .Font.Bold = False
    End With
    For N = 1 To 3
        Stt = 0:        LaMa = LaMa + 1:        K = K + 1
        dArr(K, 1) = ChrW(LaMa + 64): dArr(K, 2) = tArr(1, N)
        .Range("A" & K + 5).Resize(, 9).Interior.ColorIndex = 20
        .Range("A" & K + 5).Resize(, 9).Font.Bold = True
        For I = 1 To UBound(sArr, 1)
            If sArr(I, 1) <> Empty Then
                If Left(sArr(I, 1), 1) = Left(tArr(1, N), 1) Then
                    Tem = sArr(I, 1)
                    If Not Dic.Exists(Tem) Then
                        K = K + 1: Stt = Stt + 1
                        Dic.Add Tem, K
                        dArr(K, 1) = Stt:           dArr(K, 2) = sArr(I, 1)
                        dArr(K, 3) = sArr(I, 2):    dArr(K, 4) = sArr(I, 3)
                        dArr(K, 5) = sArr(I, 5)
                    Else
                        Rws = Dic.Item(Tem): dArr(Rws, 5) = dArr(Rws, 5) + sArr(I, 5)
                    End If
                End If
            End If
        Next I
    Next N
    .Range("A6").Resize(K, 5) = dArr:
    .Range("A6").Resize(K, 9).Borders.LineStyle = 1
    If Not IsNumeric(.Range("A65536").End(3)) Then .Range("A65536").End(3).EntireRow.Delete
    Er = .Range("A65536").End(3).Row
    For I = Er To 6 Step -1
        If Not IsNumeric(.Range("A" & I)) Then
            .Range("B" & I + 1 & ":I" & Er).Sort Key1:=.Range("C" & I + 1)
            Er = I - 1
        End If
    Next I
End With
Set Dic = Nothing
End Sub
 
Upvote 0
Bạn chạy Sub này thử
PHP:
Sub Tonghopvattu()
Application.ScreenUpdating = False
    Dim Dic As Object, Tem As String
    Dim sArr(), dArr(), tArr(), Er As Long
    Dim I As Long, J As Long, N As Long, K As Long, LaMa As Long, Stt As Long, Rws As Long
Set Dic = CreateObject("scripting.Dictionary")
With Sheets("xuatDL")
    sArr = .Range("C7", .Range("C65536").End(3)).Resize(, 5).Value
    tArr = .Range("L1:N1").Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 5)
With Sheets("THVT")
    With .Range("A6:I1000")
        .ClearContents: .Interior.ColorIndex = 0: .Borders.LineStyle = 0: .Font.Bold = False
    End With
    For N = 1 To 3
        Stt = 0:        LaMa = LaMa + 1:        K = K + 1
        dArr(K, 1) = ChrW(LaMa + 64): dArr(K, 2) = tArr(1, N)
        .Range("A" & K + 5).Resize(, 9).Interior.ColorIndex = 20
        .Range("A" & K + 5).Resize(, 9).Font.Bold = True
        For I = 1 To UBound(sArr, 1)
            If sArr(I, 1) <> Empty Then
                If Left(sArr(I, 1), 1) = Left(tArr(1, N), 1) Then
                    Tem = sArr(I, 1)
                    If Not Dic.Exists(Tem) Then
                        K = K + 1: Stt = Stt + 1
                        Dic.Add Tem, K
                        dArr(K, 1) = Stt:           dArr(K, 2) = sArr(I, 1)
                        dArr(K, 3) = sArr(I, 2):    dArr(K, 4) = sArr(I, 3)
                        dArr(K, 5) = sArr(I, 5)
                    Else
                        Rws = Dic.Item(Tem): dArr(Rws, 5) = dArr(Rws, 5) + sArr(I, 5)
                    End If
                End If
            End If
        Next I
    Next N
    .Range("A6").Resize(K, 5) = dArr:
    .Range("A6").Resize(K, 9).Borders.LineStyle = 1
    If Not IsNumeric(.Range("A65536").End(3)) Then .Range("A65536").End(3).EntireRow.Delete
    Er = .Range("A65536").End(3).Row
    For I = Er To 6 Step -1
        If Not IsNumeric(.Range("A" & I)) Then
            .Range("B" & I + 1 & ":I" & Er).Sort Key1:=.Range("C" & I + 1)
            Er = I - 1
        End If
    Next I
End With
Set Dic = Nothing
End Sub
Cám ơn chị rất nhiều. chị có thể chỉnh sửa bài #1245 giúp e được không?
Chuyên mục xử lý, gỡ rối code VBA
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn chạy Sub này thử
PHP:
Sub Tonghopvattu()
Application.ScreenUpdating = False
    Dim Dic As Object, Tem As String
    Dim sArr(), dArr(), tArr(), Er As Long
    Dim I As Long, J As Long, N As Long, K As Long, LaMa As Long, Stt As Long, Rws As Long
Set Dic = CreateObject("scripting.Dictionary")
With Sheets("xuatDL")
    sArr = .Range("C7", .Range("C65536").End(3)).Resize(, 5).Value
    tArr = .Range("L1:N1").Value
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 5)
With Sheets("THVT")
    With .Range("A6:I1000")
        .ClearContents: .Interior.ColorIndex = 0: .Borders.LineStyle = 0: .Font.Bold = False
    End With
    For N = 1 To 3
        Stt = 0:        LaMa = LaMa + 1:        K = K + 1
        dArr(K, 1) = ChrW(LaMa + 64): dArr(K, 2) = tArr(1, N)
        .Range("A" & K + 5).Resize(, 9).Interior.ColorIndex = 20
        .Range("A" & K + 5).Resize(, 9).Font.Bold = True
        For I = 1 To UBound(sArr, 1)
            If sArr(I, 1) <> Empty Then
                If Left(sArr(I, 1), 1) = Left(tArr(1, N), 1) Then
                    Tem = sArr(I, 1)
                    If Not Dic.Exists(Tem) Then
                        K = K + 1: Stt = Stt + 1
                        Dic.Add Tem, K
                        dArr(K, 1) = Stt:           dArr(K, 2) = sArr(I, 1)
                        dArr(K, 3) = sArr(I, 2):    dArr(K, 4) = sArr(I, 3)
                        dArr(K, 5) = sArr(I, 5)
                    Else
                        Rws = Dic.Item(Tem): dArr(Rws, 5) = dArr(Rws, 5) + sArr(I, 5)
                    End If
                End If
            End If
        Next I
    Next N
    .Range("A6").Resize(K, 5) = dArr:
    .Range("A6").Resize(K, 9).Borders.LineStyle = 1
    If Not IsNumeric(.Range("A65536").End(3)) Then .Range("A65536").End(3).EntireRow.Delete
    Er = .Range("A65536").End(3).Row
    For I = Er To 6 Step -1
        If Not IsNumeric(.Range("A" & I)) Then
            .Range("B" & I + 1 & ":I" & Er).Sort Key1:=.Range("C" & I + 1)
            Er = I - 1
        End If
    Next I
End With
Set Dic = Nothing
End Sub
Các bạn và bạn PacificPR giúp mình thêm code này nữa nhé!
1. khi click nút link thì cột H (đơn giá) của sheet xuatDL được kết nối từ sheet THVT, sau đó sum của VL, NC, máy sẽ được link sang sheet KHOILUONG
2. Từ sheet THVT bạn có thể xuất số liệu của phần vật liệu sang sheet VAT LIEU, mỗi vật liệu cách nhau 5 dòng. Thank!
 

File đính kèm

Upvote 0
Các bạn và bạn PacificPR giúp mình thêm code này nữa nhé!
1. khi click nút link thì cột H (đơn giá) của sheet xuatDL được kết nối từ sheet THVT, sau đó sum của VL, NC, máy sẽ được link sang sheet KHOILUONG
2. Từ sheet THVT bạn có thể xuất số liệu của phần vật liệu sang sheet VAT LIEU, mỗi vật liệu cách nhau 5 dòng. Thank!
Hình như cái File này em đã gặp ở đâu trên diễn đàn mình roài thì phải. (Hình như bài của anh "Sơn thủ bạc"):D
 
Upvote 0
Các bạn và bạn PacificPR giúp mình thêm code này nữa nhé!
1. khi click nút link thì cột H (đơn giá) của sheet xuatDL được kết nối từ sheet THVT, sau đó sum của VL, NC, máy sẽ được link sang sheet KHOILUONG
2. Từ sheet THVT bạn có thể xuất số liệu của phần vật liệu sang sheet VAT LIEU, mỗi vật liệu cách nhau 5 dòng. Thank!
có ai không, giúp mình với đi
 
Upvote 0

File đính kèm

Upvote 0
Nhờ các bạn chỉnh sửa code giúp mình:
1. Mình muốn chuyển cột j trong sheet "xuatDL" thành hàm PRODUCT(G11:I11)
2. Các hàng a) vật liệu, b)NC, C)Máy tại cột J tô đậm được ko?. Thank!
 

File đính kèm

Upvote 0
Chào mọi người,

Mình có 1 file excel như ở dưới. Hiện tại mình đang không biết dùng hàm gì để có thể tính được Doanh Số theo ngày ở Sheet Doanh Số. Về cơ bản thì Doanh Số của một ngày được tính bằng Doanh Số của tất cả các mặt hàng (Khoảng 800 mặt hàng tương đương với khoảng 800 sheets) bán được trong ngày đấy, và Doanh Số của một mặt hàng thì bằng số lượng mỗi nhân viên bán được trong ngày hôm đấy( Hùng, Hiếu, Thắng và Lẻ) nhân với giá của mặt hàng ở một sheet khác. Mình đã thử làm cách thủ công mà không được nên mình đang đọc và tìm hiểu về VBA, mong mọi người giúp mình xem nên dùng giải quyết được vấn đề tìm dữ liệu trong nhiều sheets và vòng lặp như thế nào.

Mình cảm ơn rất nhiều.
Do file nặng quá nên mình up lên googledriver: https://drive.google.com/open?id=1gPoxaJuKrkPth0XEIW1T-7cDFykfrQ5Y
 
Upvote 0
Chào các bạn,
Mình tạo marco này để chuyển dữ liệu từ Sheet3 sang dạng Pivot Table và Tabular Form. Các bước như sau:
- Ctrl + Shift từ cột A tới cột H (số liệu sẽ cập nhật tiếp tục theo dòng) trong Sheet3
- Chọn tab Insert, chọn Pivot Table và tạo Pivot Table sang 1 sheet khác
- Sau khi tạo Pivot Table, ấn vào đó, để hiện lên PivotTable Tools => chọn tab Design => chọn không hiện Subtotals và Grand Totals trên báo cáo, và ấn vào Report Layout, chọn Show in Tabular Form.
- Lưu macro và chạy thử, báo lỗi.

Mình xin gửi file dữ liệu đây. Xin nhờ các chuyên gia chỉ dẫn sửa code VBA để chạy macro này.

Mình xin cảm ơn nhiều! :-)
 

File đính kèm

Upvote 0
Mã:
Private Sub cmdThem_Click()
    Dim Lr As Long, stt As Long
 
    Lr = Sheet7.Cells(Rows.Count, "B").End(3).Row
 
    If Me.cmbMaTS = "" Then
        MsgBox ("Ban chua chon kieu ma tai san")
        Me.cmbMaTS.SetFocus
        Exit Sub
    End If
    If Me.txtMaTS = "" Then
        MsgBox ("Ban chua nhap ma tai san")
        Me.txtMaTS.SetFocus
        Exit Sub
    End If
    With Sheet7
 
 
    stt = Application.WorksheetFunction.CountIf(.Range("$B$2:B" & Lr), Me.cmbMaTS.Value & " * ")
 
    Select Case stt
            Case Is < 10
                .Range("B" & Lr + 1) = StrConv(cmbMaTS.Value & Me.txtMaTS.Value & "00" & stt + 1, vbUpperCase)
            Case Is < 100
                .Range("B" & Lr + 1) = StrConv(cmbMaTS.Value & Me.txtMaTS.Value & "0" & stt + 1, vbUpperCase)
            Case Else
                .Range("B" & Lr + 1) = StrConv(cmbMaTS.Value & Me.txtMaTS.Value & stt + 1, vbUpperCase)
    End Select
    End With
End Sub
Xin chỉ giúp mình đở đoạn code
Mã:
stt = Application.WorksheetFunction.CountIf(.Range("$B$2:B" & Lr), Me.cmbMaTS.Value & " * ")
Stt nó không đánh được số thứ tự theo mã ở cmbMaTS nhỉ.b
Mục đích của mình tạo ra mã hàng theo cmbMaTS & txtMaTS và STT theo cmbMaTS
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Xem giúp em code này ạ

Sub clean()
On Error Resume Next
Dim arr, arr1, res, res1, i As Long, j As Long, k As Long, k1 As Long
With Sheets("Du lieu vao")
arr = .Range(.[A10], .[A65000].End(xlUp)).Resize(, 22).Value
arr1 = .Range(.[X10], .[X65000].End(xlUp)).Resize(, 2).Value
ReDim res(1 To UBound(arr, 1), 1 To 22)
ReDim res1(1 To UBound(arr, 1), 1 To 2)
For i = 1 To UBound(arr, 1)
If DateAdd("m", 13, arr(i, 1)) >= Date Then
k = k + 1
For j = 1 To 22
res(k, j) = arr(i, j)
Next j
End If
Next i
For i = 1 To UBound(arr1, 1)
If DateAdd("m", 13, arr1(i, 1)) >= Date Then
k1 = k1 + 1
res1(k1, 1) = arr1(i, 1)
res1(k1, 2) = arr1(i, 2)
End If
Next i
.Range("A10:Y10000").ClearContents
If k Then .Range("A10").Resize(k, 22).Value = res
If k1 Then .Range("X10").Resize(k1, 2).Value = res1
End With
End Sub

Nếu dữ liệu cột X,Y có số dòng dài hơn dữ liệu cột A:V thì phần dài hơn sẽ bị lỗi N/A. Em cảm ơn
 

File đính kèm

Upvote 0
Xem giúp em code này ạ

Sub clean()
On Error Resume Next
Dim arr, arr1, res, res1, i As Long, j As Long, k As Long, k1 As Long
With Sheets("Du lieu vao")
arr = .Range(.[A10], .[A65000].End(xlUp)).Resize(, 22).Value
arr1 = .Range(.[X10], .[X65000].End(xlUp)).Resize(, 2).Value
ReDim res(1 To UBound(arr, 1), 1 To 22)
ReDim res1(1 To UBound(arr, 1), 1 To 2)
For i = 1 To UBound(arr, 1)
If DateAdd("m", 13, arr(i, 1)) >= Date Then
k = k + 1
For j = 1 To 22
res(k, j) = arr(i, j)
Next j
End If
Next i
For i = 1 To UBound(arr1, 1)
If DateAdd("m", 13, arr1(i, 1)) >= Date Then
k1 = k1 + 1
res1(k1, 1) = arr1(i, 1)
res1(k1, 2) = arr1(i, 2)
End If
Next i
.Range("A10:Y10000").ClearContents
If k Then .Range("A10").Resize(k, 22).Value = res
If k1 Then .Range("X10").Resize(k1, 2).Value = res1
End With
End Sub

Nếu dữ liệu cột X,Y có số dòng dài hơn dữ liệu cột A:V thì phần dài hơn sẽ bị lỗi N/A. Em cảm ơn
Bạn thêm vào 2 dòng lệnh sau, nếu đặt biến ngay từ đầu thì tốt hơn (t = Ubound(...))

Mã:
   For i = 1 To UBound(arr1, 1)
     If i < UBound(arr, 1) + 1 Then '<=== Them vao
     If DateAdd("m", 13, arr1(i, 1)) >= Date Then
        k1 = k1 + 1
        res1(k1, 1) = arr1(i, 1)
        res1(k1, 2) = arr1(i, 2)
     End If
     End If                            '<=== Them vao
   Next i
 
Upvote 0
Bạn thêm vào 2 dòng lệnh sau, nếu đặt biến ngay từ đầu thì tốt hơn (t = Ubound(...))

Mã:
   For i = 1 To UBound(arr1, 1)
     If i < UBound(arr, 1) + 1 Then '<=== Them vao
     If DateAdd("m", 13, arr1(i, 1)) >= Date Then
        k1 = k1 + 1
        res1(k1, 1) = arr1(i, 1)
        res1(k1, 2) = arr1(i, 2)
     End If
     End If                            '<=== Them vao
   Next i
Bác ơi, vậy trong trường hợp i>ubound(arr,1) thì làm thế nào?
 
Upvote 0
Bác ơi, vậy trong trường hợp i>ubound(arr,1) thì làm thế nào?
Như file của bạn thì tôi tạm hiểu rằng bạn sử dụng 2 Array, 1 cho cột A (arr) và 1 cho cột X (arr1)

Nếu số phần tử tại cột A < cột X thì cột X sẽ không hiện ra (Code cũ sẽ là giá trị #NA), nếu lớn hơn thì bạn phải nêu muốn cái gì chứ.
 
Upvote 0
Mã:
Private Sub txtTim_Change()
If Me.txtTim = "" Then
    Me.lsbTim.Visible = False
    ElseIf Me.txtTim.Value = "?" Then
        nhaplieu.Hide        (nhaplieu form hiện hành muốn ẩn)
        nhaptaisan.Show    (nhập tài sản form muốn hiện)
    Else
    Me.lsbTim.Visible = True
Mọi người xem giúp code trên sai ở đâu mà bị lỗi ở đoạn code
nhaplieu.Hide (nhaplieu form hiện hành)
nhaptaisan.Show (nhập tài sản form muốn hiện)
 
Upvote 0
Mình có Record Macro đoạn Code Copy:

Mã:
Sub CopyDulieu()
F.Range("D4:D8,D10:D52,D54:D77,D82:D87").ClearContents
F.Range("I4:I8").Copy
F.Range("D4:D8").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
F.Range("I10:I52").Copy
F.Range("D10:D52").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
F.Range("I54:I77").Copy
F.Range("D54:D77").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
F.Range("I82:I87").Copy
F.Range("D82:D87").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
F.Range("D3").Activate
Application.CutCopyMode = False
End Sub

Khi chạy lệnh thì ok như ý ,Nhưng nó nhẩy nhoáng nhoáng nhìn ko được đẹp mắt và code cũng dài quá...nên nhờ các bạn sửa lại cho nó gọn hơn ,chạy mượt hơn...xin cảm ơn trước.
 
Upvote 0
Như file của bạn thì tôi tạm hiểu rằng bạn sử dụng 2 Array, 1 cho cột A (arr) và 1 cho cột X (arr1)

Nếu số phần tử tại cột A < cột X thì cột X sẽ không hiện ra (Code cũ sẽ là giá trị #NA), nếu lớn hơn thì bạn phải nêu muốn cái gì chứ.
Thì đó là cái em đang bị lỗi, cái em muốn là 2 array đó độc lập với nhau, ngày tháng trên mỗi array >13 tháng thì sẽ bị loại bỏ, vì số liệu bên em nhập liên tục nên nếu không bỏ dữ liệu cũ thì sẽ dài mãi file ngày càng nặng nề.
 
Upvote 0
Thì đó là cái em đang bị lỗi, cái em muốn là 2 array đó độc lập với nhau, ngày tháng trên mỗi array >13 tháng thì sẽ bị loại bỏ, vì số liệu bên em nhập liên tục nên nếu không bỏ dữ liệu cũ thì sẽ dài mãi file ngày càng nặng nề.
Bạn xem lại khai báo Res1 và sửa thành
Mã:
   ReDim res1(1 To UBound(arr1, 1), 1 To 2)
 
Upvote 0
Mình có tạo form tìm kiếm. Khi gõ vào textbox dấu "?" thì form hiện tại ẩn đi, và mở 1 form mới.
Mình viết code như thế này mà bị lỗi nhưng không biết cách khắc phục.
Mã:
Private Sub txtTim_Change()
If Me.txtTim = "" Then
    Me.lsbTim.Visible = False
    ElseIf Me.txtTim.Value = "?" Then
        nhaplieu.Hide
        nhaptaisan.Show
    Else
    Me.lsbTim.Visible = True
Dim arr, sArray

    sArray = Sheet4.Range("A2:E" & Sheet4.[B65000].End(xlUp).Row)
 
    On Error Resume Next

    If Len(Trim(txtTim.Value)) = 0 Then Me.lsbTim.List() = sArray: Exit Sub

    arr = Filter2DArray(sArray, 2, "*" & txtTim.Value & "*", False) 'goc la so 1 "cot tim kiem)

    If Not IsArray(arr) Then
        arr = Filter2DArray(sArray, 3, "*" & txtTim.Value & "*", False)

        If Not IsArray(arr) Then lsbTim.Clear: Exit Sub

    End If

    Me.lsbTim.List() = IIf(Trim(txtTim.Text) = "", sArray, arr)
   
End If


End Sub
Nhờ GPE giúp đỡ. (lỗi lúc đoạn ẩn, hiện form)
 
Upvote 0
Hôm trước mình được bạn befaint trợ giúp code phân bổ theo điều kiện nhưng nó bị lỗi khi dữ liệu không sắp xếp theo trình tự.
Mình có nhờ chỉnh lại nhưng không được. Mình đã tự mò và thử chỉnh lại.
code chạy ra đúng kết quả, nhưng khi dữ liệu mình nên khoảng 3.000 dòng thì code chạy mất khoảng 30s.
Mọi người xem giúp mình xem code mình cần thêm gì để có thể chạy nhanh hơn không
Mã:
Sub Phan_Bo1()
    Dim a(), lRow As Long, sMatch As String, eMatch As String
    Dim Res(), TT As Double, KH As Double, i As Long, j As Long
    
    With Sheet5
        lRow = .Range("A" & Rows.Count).End(xlUp).Row
        a = .Range("A7:S" & lRow).Value
        lRow = UBound(a, 1)
        ReDim Res(1 To lRow, 1 To 1)
        For i = 1 To lRow
          
            sMatch = a(i, 1) & "#" & a(i, 2) & "#" & a(i, 3) & "#" & a(i, 4) & "#" & a(i, 5)
            TT = 0: KH = 0
            'Xac dinh so Tieu_thu
            For j = 1 To lRow
                eMatch = a(j, 1) & "#" & a(j, 2) & "#" & a(j, 3) & "#" & a(j, 4) & "#" & a(j, 5)
                If sMatch = eMatch Then TT = TT + a(j, 18)
              
            Next j
            'Xac dinh so Ke_hoach
            For j = 1 To lRow
                eMatch = a(j, 1) & "#" & a(j, 2) & "#" & a(j, 3) & "#" & a(j, 4) & "#" & a(j, 5)
                If sMatch = eMatch Then KH = KH + a(j, 19)
              
            Next j
            'Tinh Phan_bo
            Res(i, 1) = a(i, 19) * TT / KH
        Next i
        .Range("U7").ClearContents
        .Range("U7").Resize(lRow, 1) = Res
    End With
End Sub
 

File đính kèm

Upvote 0
Hôm trước mình được bạn befaint trợ giúp code phân bổ theo điều kiện nhưng nó bị lỗi khi dữ liệu không sắp xếp theo trình tự.
Mình có nhờ chỉnh lại nhưng không được. Mình đã tự mò và thử chỉnh lại.
code chạy ra đúng kết quả, nhưng khi dữ liệu mình nên khoảng 3.000 dòng thì code chạy mất khoảng 30s.
Mọi người xem giúp mình xem code mình cần thêm gì để có thể chạy nhanh hơn không
Mã:
Sub Phan_Bo1()
    Dim a(), lRow As Long, sMatch As String, eMatch As String
    Dim Res(), TT As Double, KH As Double, i As Long, j As Long
   
    With Sheet5
        lRow = .Range("A" & Rows.Count).End(xlUp).Row
        a = .Range("A7:S" & lRow).Value
        lRow = UBound(a, 1)
        ReDim Res(1 To lRow, 1 To 1)
        For i = 1 To lRow
         
            sMatch = a(i, 1) & "#" & a(i, 2) & "#" & a(i, 3) & "#" & a(i, 4) & "#" & a(i, 5)
            TT = 0: KH = 0
            'Xac dinh so Tieu_thu
            For j = 1 To lRow
                eMatch = a(j, 1) & "#" & a(j, 2) & "#" & a(j, 3) & "#" & a(j, 4) & "#" & a(j, 5)
                If sMatch = eMatch Then TT = TT + a(j, 18)
             
            Next j
            'Xac dinh so Ke_hoach
            For j = 1 To lRow
                eMatch = a(j, 1) & "#" & a(j, 2) & "#" & a(j, 3) & "#" & a(j, 4) & "#" & a(j, 5)
                If sMatch = eMatch Then KH = KH + a(j, 19)
             
            Next j
            'Tinh Phan_bo
            Res(i, 1) = a(i, 19) * TT / KH
        Next i
        .Range("U7").ClearContents
        .Range("U7").Resize(lRow, 1) = Res
    End With
End Sub
Tôi chỉ nhìn công thức cột T để viết thôi nhé, Tốc độ thì không có dữ liệu nênkhông biết được.
PHP:
Public Sub S_GPE()
Dim sArr(), dArr(), tArr(), I As Long, K As Long, R As Long, Tem As String, Rws As Double
sArr = Range("A7", Range("A7").End(xlDown)).Resize(, 19).Value
R = UBound(sArr)
ReDim tArr(1 To R, 1 To 2)
ReDim dArr(1 To R, 1 To 1)
With CreateObject("Scripting.Dictionary")
For I = 1 To R
    Tem = sArr(I, 1) & "#" & sArr(I, 2) & "#" & sArr(I, 4) & "#" & sArr(I, 5)
    If Not .Exists(Tem) Then
        K = K + 1
        .Item(Tem) = K
        tArr(K, 1) = sArr(I, 18)
    End If
        Rws = .Item(Tem)
        tArr(Rws, 2) = tArr(Rws, 2) + sArr(I, 19)
Next I
    For I = 1 To R
        Tem = sArr(I, 1) & "#" & sArr(I, 2) & "#" & sArr(I, 4) & "#" & sArr(I, 5)
        Rws = .Item(Tem)
        dArr(I, 1) = tArr(Rws, 1) / tArr(Rws, 2) * sArr(I, 19)
    Next I
End With
Range("Y7").Resize(R) = dArr
End Sub
 
Upvote 0
Tôi chỉ nhìn công thức cột T để viết thôi nhé, Tốc độ thì không có dữ liệu nênkhông biết được.
PHP:
Public Sub S_GPE()
Dim sArr(), dArr(), tArr(), I As Long, K As Long, R As Long, Tem As String, Rws As Double
sArr = Range("A7", Range("A7").End(xlDown)).Resize(, 19).Value
R = UBound(sArr)
ReDim tArr(1 To R, 1 To 2)
ReDim dArr(1 To R, 1 To 1)
With CreateObject("Scripting.Dictionary")
For I = 1 To R
    Tem = sArr(I, 1) & "#" & sArr(I, 2) & "#" & sArr(I, 4) & "#" & sArr(I, 5)
    If Not .Exists(Tem) Then
        K = K + 1
        .Item(Tem) = K
        tArr(K, 1) = sArr(I, 18)
    End If
        Rws = .Item(Tem)
        tArr(Rws, 2) = tArr(Rws, 2) + sArr(I, 19)
Next I
    For I = 1 To R
        Tem = sArr(I, 1) & "#" & sArr(I, 2) & "#" & sArr(I, 4) & "#" & sArr(I, 5)
        Rws = .Item(Tem)
        dArr(I, 1) = tArr(Rws, 1) / tArr(Rws, 2) * sArr(I, 19)
    Next I
End With
Range("Y7").Resize(R) = dArr
End Sub
Cám ơn bạn nhiều, tốc độ khi dữ liệu lên đến 3000 dòng vẫn rất nhanh
 
Upvote 0
Nhờ ae xem giúp code, khi chạy macro "lấy dutoan" ở file sau bị lỗi runtime error9
 

File đính kèm

Upvote 0
Nhờ ae xem giúp code, khi chạy macro "lấy dutoan" ở file sau bị lỗi runtime error9
With Sheets("KHOILUONG")
Chẳng có sheet nào tên "KHOILUONG".
Kinh nghiệm đặt tên sheet không nên có dấu cách và dấu tiếng Việt. Muốn dễ nhìn thì nên là "KHOI_LUONG"
 
Upvote 0
Nói chung ít người tạo pivot bằng macro. vì việc này tuy quan trọng nhưng ít phải làm mới.
Nếu bạn thêm dòng ở bảng gốc mà pivot không cho thêm vô thì có thể chọn lại vùng dữ liệu.

Khi RUN macro, nó tạo mới pivot và vẫn mang tên cũ nên lỗi
 
Upvote 0
Nhờ các bạn xem cho mình cái Code: Worksheet_Change ,ko biết nó còn thiếu cái gì mà nó ko hoạt động ?
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If [D1] = 0 Then
CommandButton1.Visible = False
Exit Sub
End If
If [D1] >= 0 Then
CommandButton1.Visible = True
Exit Sub
End If
If [G1] = 0 Then
CommandButton2.Visible = False
Exit Sub
End If
If [G1] >= 0 Then
CommandButton2.Visible = True
Exit Sub
End If
End Sub
 
Upvote 0
Thấy bạn befaint có trả lời bằng một dấu ? chắc là bạn ấy ko hiểu câu hỏi của mình hoặc là một lý do nào khác...?
LDo.jpg
Câu hỏi của mình là:
1, Khi tại ô D1 có dữ liệu bằng không ,thì nút CommandButton1 sẽ bị ẨN và ngược lại....Nếu chỉ sử dụng đoạn Code này thì nó hoạt động bình thường.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If [D1] = 0 Then
CommandButton1.Visible = False
Exit Sub
End If
If [D1] >= 0 Then
CommandButton1.Visible = True
Exit Sub
End If
End Sub
2, Mình thêm một điều kiện thứ hai là: Khi tại ô G1 có dữ liệu bằng không ,thì nút CommandButton2 sẽ bị ẨN và ngược lại....Thì Code ko hoạt động.
 
Upvote 0
Thấy bạn befaint có trả lời bằng một dấu ? chắc là bạn ấy ko hiểu câu hỏi của mình hoặc là một lý do nào khác...?
View attachment 187407
Câu hỏi của mình là:
1, Khi tại ô D1 có dữ liệu bằng không ,thì nút CommandButton1 sẽ bị ẨN và ngược lại....Nếu chỉ sử dụng đoạn Code này thì nó hoạt động bình thường.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If [D1] = 0 Then
CommandButton1.Visible = False
Exit Sub
End If
If [D1] >= 0 Then
CommandButton1.Visible = True
Exit Sub
End If
End Sub
2, Mình thêm một điều kiện thứ hai là: Khi tại ô G1 có dữ liệu bằng không ,thì nút CommandButton2 sẽ bị ẨN và ngược lại....Thì Code ko hoạt động.
Vậy sửa lại thế này xem sao.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If [D1] = 0 Then
              CommandButton1.Visible = False
Else
              CommandButton1.Visible = True
End If
If [G1] = 0 Then
             CommandButton2.Visible = False
Else
             CommandButton2.Visible = True
End If
End Sub
 
Upvote 0
Vậy sửa lại thế này xem sao.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If [D1] = 0 Then
              CommandButton1.Visible = False
Else
              CommandButton1.Visible = True
End If
If [G1] = 0 Then
             CommandButton2.Visible = False
Else
             CommandButton2.Visible = True
End If
End Sub

CommandButton1.Visible = CBool([D1]) , hoặc là
CommandButton1.Visible = ([D1] <> 0)
 
Upvote 0
CommandButton1.Visible = CBool([D1]) , hoặc là
CommandButton1.Visible = ([D1] <> 0)
Code của bạn ngắn gọn ,chạy Ok ,Nhưng nếu 2 nút CommandButton mà dùng chung một điều kiện tại D1 ,Tức là khi tại D1 có dữ liệu thì
CommandButton1 sẽ ẨN và CommandButton2 sẽ HIỆN ....Nên sửa Code lại như thế nào ?
 
Upvote 0
Code của bạn ngắn gọn ,chạy Ok ,Nhưng nếu 2 nút CommandButton mà dùng chung một điều kiện tại D1 ,Tức là khi tại D1 có dữ liệu thì
CommandButton1 sẽ ẨN và CommandButton2 sẽ HIỆN ....Nên sửa Code lại như thế nào ?

CommandButton1.Visible = ([D1] <> 0)
CommandButton2.Visible = Not CommandButton1.Visible
 
Upvote 0
Nhờ AE chỉnh sửa hoặc thêm code (code này mình tìm được trên diền đàn)
1. Hiện tại code không lấy được dữ liệu bên sheet CSDL DM ở cột D nếu có dấu = ở trước.
2. Nếu bổ dầu bằng thì lấy được dữ liệu nhưng ở cột G lại thiếu dấu = để chạy công thức. nhờ ae xem giúp.
 

File đính kèm

Upvote 0
Nhờ AE chỉnh sửa hoặc thêm code (code này mình tìm được trên diền đàn)
1. Hiện tại code không lấy được dữ liệu bên sheet CSDL DM ở cột D nếu có dấu = ở trước.
2. Nếu bổ dầu bằng thì lấy được dữ liệu nhưng ở cột G lại thiếu dấu = để chạy công thức. nhờ ae xem giúp.
Bạn lấy dạng Range("xxx").Formula xem sao
Mình thử với ô G9 của Sheets("xuatDL")
PHP:
Sub Thu()
    With Sheets("xuatDL")
        MsgBox .Range("G9").Formula
    End With
End Sub
 
Upvote 0
Anh(chị) cho em hỏi, em có 1000 dòng trong sheet 1 và sheet2 để nhập sang sheet 3, nhưng có một số dữ liệu trùng lặp giữa sheet 1 và sheet 2 em không muốn nhập thì có hàm nào là bỏ qua các dữ liệu trung lặp không ạ. Em cảm ơn.
 
Upvote 0
Anh(chị) cho em hỏi, em có 1000 dòng trong sheet 1 và sheet2 để nhập sang sheet 3, nhưng có một số dữ liệu trùng lặp giữa sheet 1 và sheet 2 em không muốn nhập thì có hàm nào là bỏ qua các dữ liệu trung lặp không ạ. Em cảm ơn.
Xét trùng trong 1 cột hay trùng bao nhiêu cột mới coi là trùng?
Bạn đưa file ví dụ lên, mỗi sheet vài chục dòng có trùng và không trùng, tạo mẫu bảng kết quả muốn có cho mọi người hiểu bạn muốn gì.
 
Upvote 0
Xét trùng trong 1 cột hay trùng bao nhiêu cột mới coi là trùng?
Bạn đưa file ví dụ lên, mỗi sheet vài chục dòng có trùng và không trùng, tạo mẫu bảng kết quả muốn có cho mọi người hiểu bạn muốn gì.
Dữ liệu được thêm vào sheet TonVatTu, lấy dữ liệu từ 3 sheet BTP1, Son_PX1, Son_cty. Dữ liệu trong sheet Son_PX1 trùng mã vật tư với sheet BTP1 và cột Sơn tím thuộc sheet Son_PX1 trùng với cột BTP2.7S1 trong sheet BTP1 thì sẽ lấy dữ liệu trong sheet Son_PX1. Tương tự trong sheet Son_cty nếu trùng như thế thì sẽ lấy dữ liệu trong sheet Son_cty và bỏ qua dữ liệu trong sheet BTP1 ạ.

PHP:
 ' LAY SO LIEU SHEET BTP1
 wsBTP1.Select
    Cells(csHangTieuDe, csCotMaVatTu).End(xlDown).Select
    intSoLuongHang = ActiveCell.Row - csHangTieuDe

    Cells(csHangTieuDe, csCotBatDauChuyen).End(xlToRight).Select
    intSoLuongCot = ActiveCell.Column - csCotBatDauChuyen + 1

    For H = 0 To intSoLuongHang - 1
        For C = 0 To intSoLuongCot - 1

            Set rgDuLieu = Cells(csHangTieuDe + 1 + H, csCotBatDauChuyen + C)

            If (rgDuLieu.Value <> 0) Then
                intCount = intCount + 1

                rgTieuDe_NgayChot.Offset(intCount, 0).Value = NgayChot

                MaBeMat = "_"
                rgTieuDe_MaBeMat.Offset(intCount, 0).Value = MaBeMat

                ' Chuyen doi ma Phoi sang ma chi tiet thuong
                MaVatTu = Cells(rgDuLieu.Row(), csCotMaVatTu)
                MaKho = Cells(csHangTieuDe, rgDuLieu.Column())

                Call DieuChinhMa(MaVatTu, "", MaKho, MaVatTuDC, "", MaKhoDC)
                rgTieuDe_MaVatTu.Offset(intCount, 0).Value = MaVatTuDC
                rgTieuDe_MaKho.Offset(intCount, 0).Value = MaKhoDC

                ' So luong
                DonVi = Cells(rgDuLieu.Row(), csCotDonVi)
                SoLuong = rgDuLieu.Value
                If SoLuong < 0 Then
                    MsgBox ("Bang BTP1, kiem tra lai ma " & MaVatTu & " tai kho " & MaKho & " bi am " & SoLuong)
                End If
                If DonVi <> "kg" Then
                    rgTieuDe_SoLuong.Offset(intCount, 0).Value = SoLuong
                Else
                    'Quy doi so luong
                    rgTieuDe_SoLuong.Offset(intCount, 0).Value = QuyDoiVatTuTuKgSangCai(MaVatTu, SoLuong)
                End If
            End If
NextC1:
    Next C
NextH1:
    Next H

     ' LAY SO LIEU SHEET Son_Cty
         
    wsSonMaCty.Select
    Cells(csHangTieuDe, csCotMaVatTu).End(xlDown).Select
    intSoLuongHang = ActiveCell.Row - csHangTieuDe

    Cells(csHangTieuDe, csCotBatDauChuyen).End(xlToRight).Select
    intSoLuongCot = ActiveCell.Column - csCotBatDauChuyen + 1

    For H = 0 To intSoLuongHang - 1
        For C = 0 To intSoLuongCot - 1

            Set rgDuLieu = Cells(csHangTieuDe + 1 + H, csCotBatDauChuyen + C)

            If (rgDuLieu.Value <> 0) Then
                intCount = intCount + 1

                rgTieuDe_NgayChot.Offset(intCount, 0).Value = NgayChot

                MaVatTu = Cells(rgDuLieu.Row(), csCotMaVatTu)
                ' DOI TEN BE MAT SANG MA BE MAT
                MaBeMat = WorksheetFunction.VLookup(Cells(csHangTieuDe, rgDuLieu.Column()), tblMaBeMatChiTiet, 2, 0)
                MaKho = csMaKhoSonCty

                ' Chuyen doi ma Phoi sang ma chi tiet thuong
                Call DieuChinhMa(MaVatTu, MaBeMat, MaKho, MaVatTuDC, MaBeMatDC, MaKhoDC)
                rgTieuDe_MaVatTu.Offset(intCount, 0).Value = MaVatTuDC
                rgTieuDe_MaBeMat.Offset(intCount, 0).Value = MaBeMatDC
                rgTieuDe_MaKho.Offset(intCount, 0).Value = MaKhoDC

                ' So luong
                DonVi = Cells(rgDuLieu.Row(), csCotDonVi)
                SoLuong = rgDuLieu.Value
                If SoLuong < 0 Then
                    MsgBox ("Bang Son_Cty, kiem tra lai ma " & MaVatTu & "-" & MaBeMat & " tai kho " & MaKho & " bi am " & SoLuong)
                End If
                If DonVi <> "kg" Then
                    rgTieuDe_SoLuong.Offset(intCount, 0).Value = SoLuong
                Else
                    'Quy doi so luong
                    rgTieuDe_SoLuong.Offset(intCount, 0).Value = QuyDoiVatTuTuKgSangCai(MaVatTu, SoLuong)
                End If

            End If
NextC3:
    Next C
NextH3:
    Next H


    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' LAY SO LIEU SHEET Son_PX1   
    wsSonMaPX1.Select
    Cells(csHangTieuDe, csCotMaVatTu).End(xlDown).Select
    intSoLuongHang = ActiveCell.Row - csHangTieuDe

    Cells(csHangTieuDe, csCotBatDauChuyen).End(xlToRight).Select
    intSoLuongCot = ActiveCell.Column - csCotBatDauChuyen + 1

    For H = 0 To intSoLuongHang - 1
        For C = 0 To intSoLuongCot - 1

            Set rgDuLieu = Cells(csHangTieuDe + 1 + H, csCotBatDauChuyen + C)

            If (rgDuLieu.Value <> 0) Then
                intCount = intCount + 1

                rgTieuDe_NgayChot.Offset(intCount, 0).Value = NgayChot

                MaVatTu = Cells(rgDuLieu.Row(), csCotMaVatTu)
                ' DOI TEN BE MAT SANG MA BE MAT
                MaBeMat = WorksheetFunction.VLookup(Cells(csHangTieuDe, rgDuLieu.Column()), tblMaBeMatChiTiet, 2, 0)
                MaKho = csMaKhoSonPX1

                ' Chuyen doi ma Phoi sang ma chi tiet thuong
                Call DieuChinhMa(MaVatTu, MaBeMat, MaKho, MaVatTuDC, MaBeMatDC, MaKhoDC)
                rgTieuDe_MaVatTu.Offset(intCount, 0).Value = MaVatTuDC
                rgTieuDe_MaBeMat.Offset(intCount, 0).Value = MaBeMatDC
                rgTieuDe_MaKho.Offset(intCount, 0).Value = MaKhoDC

                ' So luong
                DonVi = Cells(rgDuLieu.Row(), csCotDonVi)
                SoLuong = rgDuLieu.Value
                If SoLuong < 0 Then
                    MsgBox ("Bang Son_PX1, kiem tra lai ma " & MaVatTu & "-" & MaBeMat & " tai kho " & MaKho & " bi am " & SoLuong)
                End If
                If DonVi <> "kg" Then
                    rgTieuDe_SoLuong.Offset(intCount, 0).Value = SoLuong
                Else
                    'Quy doi so luong
                    rgTieuDe_SoLuong.Offset(intCount, 0).Value = QuyDoiVatTuTuKgSangCai(MaVatTu, SoLuong)
                End If

            End If
NextC4:
    Next C
NextH4:
    Next H
 

File đính kèm

Upvote 0
Status
Không mở trả lời sau này.

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

Back
Top Bottom