Giúp mình viết code VBA cho phiếu nhập, phiếu xuất thay cho hàm Vlookup với. (1 người xem)

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

ninhtom1

Thành viên hoạt động
Tham gia
26/8/10
Bài viết
106
Được thích
4
Giúp mình viết code VBA cho phiếu nhập, phiếu xuất thay cho hàm Vlookup với. Câu hỏi mình viết trong sheet PNHAP, mọi ngoWif giúp mình với nhé. À
 
Lần chỉnh sửa cuối:
Bạn xem trong file

Fiếu xuất mình để bạn thử sức trong tuần; Mình tin là bạn làm được
 

File đính kèm

Upvote 0
Mình phải nói là cảm ơn cảm ơn bạn rất nhiều. Nhưng còn vấn đề chỉ hiện tự ẩn , hiện các dòng có vật tư theo phiếu mà không phải dùng nút Hide và Unhide nữa. bạn giúp mình tiếp nha. À còn vấn đề nữa, bạn viết code dùm mình chỗ Số TT với Họ tên người giao hàng, địa chỉ dưới dòng Họ tên người giao hàng nhé. Số lượng theo chứng từ không hiển thị( số lượng theo chứng từ chính bằng số lượng thực nhập ). Cảm ơn bạn rất nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, [h4]) Is Nothing Then
   Dim Sh As Worksheet, Rng As Range, sRng As Range
   Dim MyAdd As String, Rws As Long
   
   Rws = [A99].End(xlUp).Row
1   [B13:B37].EntireRow.Hidden = False           '<=|'
   [B13].Resize(Rws, 7).ClearContents
   Set Sh = Worksheets("Nhap")
   Set Rng = Sh.Range(Sh.[c4], Sh.[c65500].End(xlUp))
   Set sRng = Rng.Find([h4].Value, , xlFormulas, xlWhole)
   If Not sRng Is Nothing Then
      MyAdd = sRng.Address
      Do
         With [B99].End(xlUp).Offset(1)
            .Resize(, 3).Value = sRng.Offset(, 2).Resize(, 3).Value
            .Offset(, 4).Resize(, 3).Value = sRng.Offset(, 5).Resize(, 3).Value
2            .Offset(, 3).Value = .Offset(, 4).Value              '<=|'
         End With
         [d5].Value = sRng.Offset(, 1).Value
         Set sRng = Rng.FindNext(sRng)
      Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
   End If
3   Rws = [b37].End(xlUp).Row + 0                '<=|'
   Rws = Switch(Rws < 16, 18, Rws < 18, 20, Rws > 17, Rws + 3)
5   Range("B" & Rws & ":B37").EntireRow.Hidden = True        '<=|'
 End If
End Sub

Họ tên & địa chì người giao hàng chưa rõ nơi mô để lấy sất! Đành tiếp tục giao việc đó cho bạn vậy!
 
Upvote 0
Bạn có thể chỉ cho mình đoạn code lấy ngày tháng được không? Loay hoay mãi mà không làm được code cho số thứ tự, tên người nhập và đơn vị nhập. Tiện thể bạn có thể giải thích các câu lệnh của bạn cho mình được không. Cảm ơn bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, [h4]) Is Nothing Then
   Dim Sh As Worksheet, Rng As Range, sRng As Range
   Dim MyAdd As String, Rws As Long
   
   Rws = [A99].End(xlUp).Row
1   [B13:B37].EntireRow.Hidden = False           '<=|'
   [B13].Resize(Rws, 7).ClearContents
   Set Sh = Worksheets("Nhap")
   Set Rng = Sh.Range(Sh.[c4], Sh.[c65500].End(xlUp))
   Set sRng = Rng.Find([h4].Value, , xlFormulas, xlWhole)
   If Not sRng Is Nothing Then
      MyAdd = sRng.Address
      Do
         With [B99].End(xlUp).Offset(1)
            .Resize(, 3).Value = sRng.Offset(, 2).Resize(, 3).Value
            .Offset(, 4).Resize(, 3).Value = sRng.Offset(, 5).Resize(, 3).Value
2            .Offset(, 3).Value = .Offset(, 4).Value              '<=|'
         End With
         [d5].Value = sRng.Offset(, 1).Value
         Set sRng = Rng.FindNext(sRng)
      Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
   End If
3   Rws = [b37].End(xlUp).Row + 0                '<=|'
   Rws = Switch(Rws < 16, 18, Rws < 18, 20, Rws > 17, Rws + 3)
5   Range("B" & Rws & ":B37").EntireRow.Hidden = True        '<=|'
 End If
End Sub
(2) Bạn có thể chỉ cho mình đoạn code lấy ngày tháng được không? Loay hoay mãi mà không làm được code cho số thứ tự, tên người nhập và đơn vị nhập.
(1)bạn có thể giải thích các câu lệnh cho mình được không.
(1) (Hiện tại macro được đánh 3 số & ta coi như đó là các số 10, 20,30;
Hơn nữa, coi dòng lệnh dưới liền kề dòng 10 là dòng 11,. . . & ta bắt đầu:)

Dòng lệnh 00: Đưa ra điều kiện để macro chạy: Hễ thay đổi DL (dữ liệu) trong [H4] thì . . . .

Dòng 01..02: Khai báo các biến cần dùng trong macro

Dòng 03: Lấy chỉ số dòng cuối có DL trong cột 'A' kể từ trước dòng 99 đem gán vô biến Rws DKB (đã khai báo);

Dòng 10: Hiện lại các dòng từ 13..37 (mà trước đó ai đó đã làm ẩn đi)

Dòng 11: Xóa vùng DL kể từ [B13] xưống fía dưới Rws dòng & sang fải 7 cột;

D12: Gán trang tính 'Nhap' vô biến đối tượng Sh DKB;

D13: Đem vùng từ [C4] cho đến hết cột có chứa DL của trang tính Sh gán cho biến Rng DKB;

D14: Tìm trị đang có trong [H4] ở các ô trong biến Rng; nếu có gán vô biến sRng DKB;

D15: Điều kiện nếu tìm thấy ô như vậy (sRng) thì thực hiện các lệnh sau cho đến dòng lệnh số 25

D16: Lấy địa chỉ ô tìm thấy gán vô biến MyAdd DKB;

D17: Thiết lập vòng lặp xử lý DL cho đến trước dòng 25

D18: Sẽ xử lý chép DL cho các ô trống cuối cùng kể từ dòng 99 trở lên trên (thuộc các cột kể từ 'B' qua fải)

. . . 3 dòng tiếp theo trước 21 là chép DL;

D22: Gán trị trong ô fải liền kề với sRng cho [D5];

D23: Thực hiện tìm tiếp trong vùng Rng cho đến cạn kiệt thì nghỉ;

. . . Các dòng tiếp theo có liên quan đến bên trên & đã nêu;

Các dòng lệnh từ 30 đến 50 là ẩn đi 1 số dòng trống tùy thuộc DL nhiều hay ít


(2) Bạn nên trả lời là lấy STT, tên người nhận hàng, đơn vị nhập,. . . ở đâu?
 
Upvote 0
Cảm ơn bạn đã giải thích chi tiết các dòng lệnh cho mình. Mình đã làm được bên PXUAT rồi. Nếu bạn có thời gian bạn có thể viết hộ mình code trong sheet CDNXT được không. Ở các cột nhập trong kỳ, xuất trong kỳ nhìn công thức nó rối mắt quá. Hì mình nhờ vả bạn nhiều quá, ngại thật :d
 
Upvote 0
Đây, macro nhập xuất tồn của bạn, xin mời!

PHP:
Option Explicit
Sub TonCuoiKy()
 Dim jJ As Byte, ShName As String:                          Const Col As Byte = 5
 Dim Cls As Range, Rng As Range, WF As Object, Sh As Worksheet
 
 Set WF = Application.WorksheetFunction:                    Sheets("CDNXT").Select
 For Each Cls In Range([D7], [D65500].End(xlUp))
   For jJ = 1 To 2
      ShName = Choose(jJ, "Nhap", "Xuat"):                  Set Sh = Sheets(ShName)
      Set Rng = Sh.Range(Sh.[G6], Sh.[G65500].End(xlUp))
      Cells(Cls.Row, Col + 2 * jJ).Value = WF.SumIf(Rng, Cls.Value, Rng.Offset(, 1))
      Cells(Cls.Row, 1 + Col + 2 * jJ).Value = WF.SumIf(Rng, Cls.Value, Rng.Offset(, 3))
   Next jJ
 Next Cls
End Sub
Những điều nên làm trước khi chạy macro:

(*) Xóa 1 dòng dư ở 'Xuat' so với 'Nhap'

(*) Sau khi Copy macro vô CS VBE, ta tiến hành gán cho nó 1 tổ hợp fím nóng, như {CTRL}+{SHIFT}+T

Hầu bấm chạy macro khi náo bạn muốn!


Chúc thành công!
 
Upvote 0
Cái này có thể gán trực tiếp vào Sheet CDNXT được không bạn. Mình không muốn mỗi lần chạy lại phải bấm chạy Marco. Cảm ơn bạn ChanhTQ
 
Upvote 0
Bạn này lười quá đó nha!

Cái này có thể gán trực tiếp vào Sheet CDNXT được không bạn. Mình không muốn mỗi lần chạy lại phải bấm chạy Marco.

(*) Thì làm 1 nút lệnh trên trang đó & muốn thì bấm (Cũng là bấm);

(*) Trưng dụng 1 ô nào đó để khi rờ đến nó thì macro sự kiện sẽ réo gọi macro câp nhật dữ liệu cho bạn;

(*) Đừng nói với tôi là gán macro với sự kiện Open trang tính đó nha!


Chúc ngày nghỉ cuối tuần vui vẽ!

--=0 --=0 --=0
 
Upvote 0
Mình muốn khi mở sheet CDNXT nó tự chạy cơ bạn à. Cảm ơn bạn.
 
Upvote 0
Đây là hướng dẫn trong excel 2003

Bạn fải chuột vô thẻ có têm 'CDNXT' & chọn dòng cuối;

Từ cửa sổ Microsoft VB ta, trong ngăn bên trái ta chọn dòng WorkSheet ;
Bên ngăn fải ta chọn dòng Activate
Sẽ xuất hiện 2 dòng lệnh:
PHP:
 Private Sub Worksheet_Activate()

End Sub

Tại con nháy mời gọi ta nhập dòng lệnh MsgBox "Xin Chào Mi!"

& sau đó là chuyện của bạn!
 
Upvote 0
Mọi người giúp em cái code tự động cập nhật số lượng nhập, thành tiền nhập, số lượng xuất, thành tiền xuất trong sheer CDNXT mà không phải dùng hàm sumif với a. Xin cảm ơn mọi người.
 
Upvote 0
Bạn ChanhTQ ơi cho mình hỏi mình chạy đoạn code của bạn rồi sao không thấy nó cập nhật số lượng, thành tiền của cột nhập trong kỳ và xuất trong kỳ nhỉ. Nó chỉ hiện có số 0 thôi.
 
Upvote 0
Bạn xem trong file thêm lần nữa & cho biết còn sai ra sao
 

File đính kèm

Upvote 0
Mình lại làm phiền bạn thêm chút nữa, nếu bạn không phiền thì bạn có thể viết nốt đoạn code cho cột tồn cuối kỳ hộ mình không?
 
Upvote 0
1 câu lệnh: Thêm công thức; 2 câu: Thêm trị số

Nếu bạn không phiền thì bạn có thể viết nốt đoạn code cho cột tồn cuối kỳ hộ mình không?
PHP:
Option Explicit
Sub TonCuoiKy()
 Dim jJ As Byte, ShName As String:                          Const Col As Byte = 5
 Dim Cls As Range, Rng As Range, WF As Object, Sh As Worksheet
 
 Set WF = Application.WorksheetFunction:                    Sheets("CDNXT").Select
 For Each Cls In Range([D7], [D65500].End(xlUp))
   For jJ = 1 To 2
      ShName = Choose(jJ, "Nhap", "Xuat"):                  Set Sh = Sheets(ShName)
      Set Rng = Sh.Range(Sh.[G6], Sh.[G65500].End(xlUp))
      Cells(Cls.Row, Col + 2 * jJ).Value = WF.SumIf(Rng, Cls.Value, Rng.Offset(, 1))
      Cells(Cls.Row, 1 + Col + 2 * jJ).Value = WF.SumIf(Rng, Cls.Value, Rng.Offset(, 3))
' Dòng Lenh De Gán Cong Thúc Vo Tòn Cuo1i Kì:'
      Cells(Cls.Row, 2 * Col + jJ).FormulaR1C1 = "=RC[-6]+RC[-4]-RC[-2]"
   Next jJ
 Next Cls
End Sub

Bạn Copy toàn bộ & chép đè lên macro cũ ở module 1;
Nếu muốn thể hiện trị số thì bạn hãy thử sức trước đi!
 
Upvote 0
Cảm ơn bạn HYen. Cảm ơn tất cả mọi người đã giúp đỡ mình. Cảm ơn các anh chị em trên GPE
 
Upvote 0
Lỗi Marco như thế này phải biết làm sao?

Máy của mình khi mở các Flie có VBA thì nó hiện lên thông báo như thế này. mình không biết cách xử lý, mong các bạn chỉ giúp nhé
 
Upvote 0
Cái này bạn cứ nhấn OK rồi vào Tool->Macro->Securyty->Chon Low->Ok là được
 
Upvote 0
mình chưa học VBA bao jo mà đến lúc làm đồ án thầy bảo phải xuất dc bản vẽ trục vít bánh vít từ VBA trong cad ra.ai pro jup chỉ mình viết bản code với để mình tìm hiểu thêm
 
Upvote 0
Bạn xem trong file thêm lần nữa & cho biết còn sai ra sao
Xin lỗi mọi người vì đã "đào mộ" lại topic cũ.
Gửi ChanhTQ@ và các bạn!
Mình tải file này về xem nhưng cứ mỗi lần vào sh CDNXT thì nó cứ hiện ra thông báo là "Bạn cần tính toán đầu kỳ" và sau đó là lỗi out of memory (mình dùng office 2010).
Mình muốn thay vì thông báo như trên thì mình gán nó vào một nút lệnh chỉ chạy khi cần (nếu được thì nó tự tính toán luôn như công thức vậy) và khắc phục lỗi out of memory trên office 2010?

Cảm ơn các bạn!
 
Upvote 0

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

Back
Top Bottom