Đổi Adv sang vòng lặp lấy dữ liệu. (2 người xem)

  • Thread starter Thread starter Thien
  • Ngày gửi Ngày gửi
Liên hệ QC

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

Thien

Thành viên thường trực
Tham gia
23/6/06
Bài viết
352
Được thích
113
Dear All.

Các bạn giúp Tôi nha:
1/ Chuyển code trong file đính kèm từ Adv sang vòng lặp lấy dữ liệu. (code đơn giản, dễ hiểu để ứng dụng vào việc khác, Mình học VBA từ nóc xuống mà).
2/ Viết macro in ra từng sheet theo từng mã vật tư.
3/ Viết macro in ra giấy theo từng mã vật tư.

Thông cảm nha. Làm hoài chẳng được gì, nên nhờ giúp.

Thân chào.
 

File đính kèm

Lần chỉnh sửa cuối:
Tạo cho bạn code TaoSoCT, gần giống như tạo sổ cái
Mã:
Sub TaoSoCT()
  With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
    End With
    Dim i, HC,M As Long, ST As Long
    Dim MH As Range
    Dim MHi As String
    MHi = Left$(S01.Range("D6"), 10)
    M = Len(S01.Range("D6"))
    HC = S00.Range("E877").End(xlUp).Row
    i = 12
    S01.Range("A12:K1006").ClearContents ' Xoa temp
    S01.Range("A12:K1006").EntireRow.Hidden = False
     For Each MH In S00.Range("J5:J" & HC)
        'If MH.Offset(0, -2) <= S01.Range("D4").Value And Len(MH) > 2 Then
            If Left$(MH, M) = MHi Then ' MH =MHi
                    With S01
                        .Range("A" & i).Value = i - 11
                        .Range("B" & i & ":C" & i).Value = Range(MH.Offset(0, -9), MH.Offset(0, -8)).Value
                        .Range("D" & i & ":E" & i).Value = Range(MH.Offset(0, 1), MH.Offset(0, 2)).Value
                    End With
                    'sotien - MHiDU
                    With S01
                            If Left$(MH.Offset(0, -9).Value, 2) = "PN" Then
                                .Range("F" & i) = MH.Offset(0, 4)
                                .Range("H" & i) = MH.Offset(0, 5)
                             Else
                                .Range("G" & i) = MH.Offset(0, 4)
                                .Range("I" & i) = MH.Offset(0, 5)
                            End If
                    End With
                'End If
                    i = i + 1
            End If
        'End If
    Next
    If i > 11 Then
        S01.Range("F1007").Value = WorksheetFunction.Sum(S01.Range("F12:F" & i))
        S01.Range("G1007").Value = WorksheetFunction.Sum(S01.Range("G12:G" & i))
        S01.Range("H1007").Value = WorksheetFunction.Sum(S01.Range("H12:H" & i))
        S01.Range("I1007").Value = WorksheetFunction.Sum(S01.Range("I12:I" & i))
    End If
    If i < 20 Then i = 20
    S01.Range("A" & i + 1 & ":A1006").EntireRow.Hidden = True
    Set MH = Nothing
    With Application
        .Calculation = xlCalculationAutomatic
        .ScreenUpdating = True
    End With
End Sub
S01: CoCTVT
S00: NhatKyNX
Bạn vận dụng tạo Code in sổ Vật tư, còn tạo từng sh thì không nên, nếu nhiều hơn 256 mà VT thì thua.
 
Lần chỉnh sửa cuối:
Dear Thunghi.

Chắc bạn chưa tét rùi.
Báo lỗi tùm lum luôn. Sao bạn không gửi file luôn. Bạn tạo code in ra giấy dùm với. Mình làm hoài không được.(VT chỉ giới hạn trong 20 mình mới in ra từng sheet).

Thân chào.


PS: Chán nhỉ, đề tài mình đưa ra dễ quá hay sao mà không ai màn đến giúp mình nhỉ. Down thì nhiều, hướng dẫn làm thì ít. Chán quá đi ngủ thui.
 
Thien đã viết:
Dear Thunghi.

Chắc bạn chưa tét rùi.
Báo lỗi tùm lum luôn. Sao bạn không gửi file luôn. Bạn tạo code in ra giấy dùm với. Mình làm hoài không được.(VT chỉ giới hạn trong 20 mình mới in ra từng sheet).

Thân chào.


PS: Chán nhỉ, đề tài mình đưa ra dễ quá hay sao mà không ai màn đến giúp mình nhỉ. Down thì nhiều, hướng dẫn làm thì ít. Chán quá đi ngủ thui.

Có cần thêm lựa chọn từ ngày . . đến ngày . . không ???

Xem qua nhé (Nhìn File của cậu thấy . . . khiếp quá)

Thân!
 

File đính kèm

To Thien
1/ File up lên nên bỏ link, xóa bớt name sai
2/ File của bạn thế nào, nên bỏ bớt công thức mảng không cần thiết, theo tôi trong file này chỉ có số CT là cần công thức {} thôi.
Tôi đã thay một số ct nhưng mà sợ sai vì không nắm Your ý đồ.
Nên có DM Hàng hóa,thêm vào TK kho theo MH => TongHopNX lấy mã từ DM, các mã hàng phải duy nhất, công thức sum(if()) trong bảng TongHopNX nên dùng sumproduct. Tôi thay một số.
3/ Do ngày CT bạn có bỏ trống một số => no hiểu để sort => Giá trị tồn ???
Bạn xem file up lên nhé.
Từ thuật tóan đó bạn có thể vận dụng ra nhiều cách nữa. Nên chịu khó hơn.
Chúc thành công! Đừng giận nhé!
Code hôm qua do tôi đang test, tìm PP hay mà đang lu bu nên lỡ copy mà chưa bỏ. Đúng ra bạn nên tự bỏ phần sai. Chỉ cần bỏ câu lệnh đó xem chạy tiếp thế nào.
 

File đính kèm

Dear MrHiếu & Thunghi
He He vui quá.
Rất cảm ơn 2 bạn quan tâm hướng dẫn. Xem sơ qua thấy 2 code gần giống nhau. Mình nghiên cứu có gì không hiểu nhờ giải thích hộ.

Thân chào.

PS: Bác Hiếu hay thay đổi cấu trúc file của mình quá nhỉ. Như vậy sẽ làm mình khó học & ứng dụng lắm đấy.

From ThuNghi:
Sao lại o Thanks nhỉ, lại forget rồi.
Code giống nhau là tôi đang học từ Mr Hiếu vòng lặp For each ...cũng cám ơn bạn là nhờ bạn hỏi, tôi học thêm 1 điều.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Nhân đây cũng nhắc các bác rằng : Khi tạo lập 1 báo cáo (ở đây là sổ chi tiết VT) thì phải đặc biệt chú ý đến thông tin mà nó thể hiện. Không dư mà cũng không thừa.

VD : Cột tên hàng hóa, ĐVT là không cần thiết. Vì ở trên đã thể hiện rồi. Mỗi sổ là 1 mã vật tư đi kèm với các chỉ tiêu phụ như TÊN, ĐƠN VỊ TÍNH, XUẤT XỨ. . . ., vậy thì việc lặp lại là vô nghĩa
Trong khi đó, nội dung của nghiệp vụ đó lại không hề có (cái này rất quan trọng), và nếu cần thiết thì sẽ cần cả tên đơn vị Xuất nhập nữa.

Có làm như thế thì một báo cáo mới trở thành "Pro" được.
--------------------------------------------------------------

To Thien :

- MaVT là phải lấy từ 1 nguồn, có thể qua nhiều tầng nấc nhưng phải lấy từ một nguồn.
VD : Nhật ký NX, Sổ chi tiết, Bảng tổng hợp : Tất cả mã vật tư phải lấy cùng ở 1 nguồn và không trùng lắp, chứ không thể lấy lung tung được.
ở VD trên thì mình không có nguồn nên đành trích ra từ NKNX.
Chứ ai lại Validation mà không sắp xếp, lặp lại, có hàng trống . . .

-TH mã ở Sổ chi tiết không nên dùng validation mà nên dùng Combobox, vừa đẹp lại vừa dễ chọn lựa (vì có cả tên, chữ to). Hơn nữa khi dùng CB thì có thể lợi dụng sự kiện CB-Change để tính ngay ra : TÊN VT; ĐVT; SỐ DƯ ĐẦU KỲ. Như vậy trên sổ chỉ toàn con số, không có công thức --->> Tốc độ nhanh hơn, dung lượng giảm.

- Trong bảng NKNX không nên để quá nhiều hàng trống, quá nhiều công thức "khủng bố" như vậy. Vì các công thức là tương đồng, vì vậy chỉ cần tạo ra 1 sub chạy từ trên xuống là OK. Như vậy File sẽ nhẹ hơn rất nhiều

-Ngày tháng trong bảng rất lung tung, có khi lại để trống(tối kỵ). Thử xem qua File của mình xem, khi làm sổ xong, sort theo ngày tháng thì số tồn bị âm rất nhiều.

- Thien thường làm 1 tháng 1 File. Đây là điều không hợp lý. Một người rất khá về excel như cậu không nên lãng phí như vậy. Ta có thể làm cả 1 năm (hoặc nhiều) trên 1 File. Chính vì vậy các báo cáo của mình thường có thêm chỉ tiêu : Từ ngày . .. . đến ngày .. . . . Như vậy dòng dữ liệu là liên tục. Khi một số thay đổi là tất cả các số liệu khác sẽ thay đổi theo, nhịp nhàng và ăn khớp.

- Còn rất nhiều nữa, nhưng có lẽ cậu nên bắt đầu từ : Cấu trúc dữ liệu


----------------------------------------------------
To ThuNghi : Đã lỡ sửa Bảng tổng hợp rồi thì dùng VBA luôn, ai lại để quá trời công thức như vậy (Đơn giản như : Copy Formula->Paste Value)


Thân!

Thien đã viết:
Dear MrHiếu & Thunghi
He He vui quá.
Rất cảm ơn 2 bạn quan tâm hướng dẫn. Xem sơ qua thấy 2 code gần giống nhau. Mình nghiên cứu có gì không hiểu nhờ giải thích hộ.

Thân chào.

PS: Bác Hiếu hay thay đổi cấu trúc file của mình quá nhỉ. Như vậy sẽ làm mình khó học & ứng dụng lắm đấy.

Nếu chỉ để học code không thôi thì có lẽ mình cũng chẳng bận tâm lắm về đề tài này, vì các bác ở trên đây đều có thể giúp Thien các code về vòng lặp thôi.

Cái mà mình muốn Thien nhìn xa hơn, cao hơn, cái mà cần quan tâm trước khi viết code đó là tính chuyên nghiệp của 1 báo cáo, sự tối ưu (trong chừng mực có thể) của 1 CSDL.

Có được cái đó thì mới viết code tốt được (bởi vì code đổi hởi sự tối ưu rất cao), vì code chẳng qua là để phục vụ các báo cáo, và báo cáo để phục vụ chúng ta.
Chính điều này mới làm chúng ta nhanh tiến bộ.

Đây mới chính là cái mà mình muốn truyền đạt lại cho bạn.

Hãy xem lại mẫu sổ của mình, mặc dù nó chưa phải là tối ưu, nhưng ít nhất nó cũng thể hiện được những thông tin cơ bản nhất vầ XN chi tiết của Vật tư đó mà không có thông tin nào bị thừa, bị trùng lắp cả.

Thân!
 
Dear MrHiếu.
Cảm ơn những chỉ dẫn của bạn. Mình sẽ cố gắng khắc phục các nhược điểm.

Dear All.
Các bạn cho mình lời giải ý nghĩa & công dụng của các code sau (Đáng lẽ phải post bài vào box trung tâm giải thích code, nhưng đây là code của vấn đề mình hỏi nên các bạn thông cảm):
1/
Mã:
M = Len(S02.Range("D6"))

2/
Mã:
If Left$(MH, M) = MHi Then ' MH =MHi
With S02
.Range("A" & i).Value = i - 11
.Range("B" & i).Value = MH.Offset(0, -9).Value
.Range("C" & i).Value = IIf(MH.Offset(0, -8).Value = "", 0,MH.Offset(0, -8).Value)
.Range("D" & i & ":E" & i).Value = Range(MH.Offset(0, 1), MH.Offset(0, 2)).Value
Tại sao -9, khi nào -8, Tìm trong help của excel không có giải thích. Vui lòng giải thích từng dòng trong code (chủ yếu là Offset(a,b) có nghĩa gì).

3/ tương tự
Mã:
If Left$(MH.Offset(0, -9).Value, 2) = "PN" Then
                                .Range("F" & i) = MH.Offset(0, 4)
                                .Range("H" & i) = MH.Offset(0, 5)
                             Else
                                .Range("G" & i) = MH.Offset(0, 4)
                                .Range("I" & i) = MH.Offset(0, 5)
                            End If
Ngó tới ngó lui đây là phần quan trọng nhất trong cả đoạn code mà mình chưa hiểu. Mong giải thích chi tiết dùm nhen. Nếu hiểu được chỗ này thì có thể ứng dụng vòng lặp này vòng nhiều việc khác.

Thân chào
 
Lần chỉnh sửa cuối:
Thien đã viết:
Dear MrHiếu.
Cảm ơn những chỉ dẫn của bạn. Mình sẽ cố gắng khắc phục các nhược điểm.

Dear All.
Các bạn cho mình lời giải ý nghĩa & công dụng của các code sau (Đáng lẽ phải post bài vào box trung tâm giải thích code, nhưng đây là code của vấn đề mình hỏi nên các bạn thông cảm):
1/
Mã:
.Range("A" & i).Value = i - 11
           .Range("B" & i).Value = MH.Offset(0, -9).Value
           .Range("C" & i).Value = IIf(MH.Offset(0, -8).Value = "", 0, _
                      MH.Offset(0, -8).Value)
          .Range("D" & i & ":E" & i).Value = Range(MH.Offset(0, 1), MH.Offset(0, 2)).Value
Tại sao -9, khi nào -8, Tìm trong help của excel không có giải thích. Vui lòng giải thích từng dòng trong code.

2/ tương tự
Mã:
If Left$(MH.Offset(0, -9).Value, 2) = "PN" Then
       .Range("F" & i) = MH.Offset(0, 4)
       .Range("H" & i) = MH.Offset(0, 5)
   Else
       .Range("G" & i) = MH.Offset(0, 4)
       .Range("I" & i) = MH.Offset(0, 5)
   End If
Ngó tới ngó lui đây là phần quan trọng nhất trong cả đoạn code mà mình chưa hiểu. Mong giải thích chi tiết dùm nhen. Nếu hiểu được chỗ này thì có thể ứng dụng vòng lặp này vòng nhiều việc khác.

Thân chào

Cảm ơn sao không chịu THANK nhỉ ???????????? Chán thật !!!

Về Offset(r,c) : Đây chỉ là cách chuyển vị trí của ô hiện hành. Dịch chuyển r hàng, c cột
Ở đây là đang xét MAHH(Cột J), muốn lấy các chỉ số khác thì sẽ lệch sang bao nhiêu hàng bao nhiêu cột thôi.
Nếu là âm thì nghĩa là lùi lại

VD : Range("B2").Offset(0,1).Select = Range("C2").Select

Cái quan trọng ở đây bạn phải hiểu được vòng lặp, nó chạy như thế nào (bạn hiểu theo nghĩa thông thường sau đó mới áp dụng vào code)

Thân!

From Thien:

Đau đầu quá không hiểu rùi.
Giải thích từng dòng trong code mình hỏi nhen.

TC.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Web KT

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

Back
Top Bottom