Bạn thực hiện các bước:AC viết dùm em code cập nhật dữ liệu từ phiếu Thu - Chi sang Sheet DATA.
(Câu hỏi cụ thể trong file đính kèm)
Sub GhiSo()
Dim i As Long
Sheets("IN_PHIEU").Activate
i = Sheets("DATA").[A65536].End(xlUp).Row + 1
With Sheets("DATA")
.Range("A" & i) = [D5]
.Range("B" & i) = [J6]
.Range("C" & i) = [D5]
.Range("D" & i) = [B8] & " - " & [G11]
.Range("E" & i, "F" & i) = Application.WorksheetFunction.Transpose([J7:J8])
.Range("G" & i, "H" & i) = Application.WorksheetFunction.Transpose([K7:K8])
End With
End Sub
Bạn thực hiện các bước:
1. Chọn cột A và C của sheet DATA và định dạng cho cột này là "dd/MM/yyyy".
2. Chèn 1 Macro như sau:
3. Nháy chuột phải trên nút Ghi sổ và chọn Asign Macro cho nút này là Macro Ghi_So.PHP:Sub GhiSo() Dim i As Long Sheets("IN_PHIEU").Activate i = Sheets("DATA").[A65536].End(xlUp).Row + 1 With Sheets("DATA") .Range("A" & i) = [D5] .Range("B" & i) = [J6] .Range("C" & i) = [D5] .Range("D" & i) = [B8] & " - " & [G11] .Range("E" & i, "F" & i) = Application.WorksheetFunction.Transpose([J7:J8]) .Range("G" & i, "H" & i) = Application.WorksheetFunction.Transpose([K7:K8]) End With End Sub
Vậy thì bạn thay code trên bởi code này nhé:Anh ơi, em muốn cập nhật luôn 2 dòng một cơ ( như ví dụ em tô màu đó). Anh sửa lại code cho em nhé!
(Anh xem lại file đính kèm của em nhé!)
Sub GhiSo()
Dim i As Long, j As Byte, Max As Byte, No, Co
Sheets("IN_PHIEU").Activate
No = Split([J7], "-")
Co = Split([J8], "-")
Max = IIf(UBound(No) > UBound(Co), UBound(No), UBound(Co))
i = Sheets("DATA").[A65536].End(xlUp).Row + 1
With Sheets("DATA")
.Range("A" & i) = [D5]
.Range("B" & i) = [J6]
.Range("C" & i) = [D5]
.Range("D" & i) = [B8] & " - " & [G11]
.Range("E" & i, "F" & i) = Application.WorksheetFunction.Transpose([J7:J8])
.Range("G" & i, "H" & i) = Application.WorksheetFunction.Transpose([K7:K8])
.Range("A" & i).Resize(, 8).Copy .Range("A" & i).Resize(Max + 1)
If UBound(No) > UBound(Co) Then
For j = 0 To UBound(No)
.Range("E" & i + j) = No(j)
Next j
Else
For j = 0 To UBound(Co)
.Range("F" & i + j) = Co(j)
Next j
End If
End With
End Sub
Vậy thì bạn thay code trên bởi code này nhé:
Code này chỉ đúng cho các trường hợp 1 nợ - 1 có, 1 nợ - nhiều có hoặc 1 có - nhiều nợ, còn trường hợp nhiều nợ - nhiều có thì không đúng (mình không phải là kế toán nên không biết có trường hợp cuối không).PHP:Sub GhiSo() Dim i As Long, j As Byte, Max As Byte, No, Co Sheets("IN_PHIEU").Activate No = Split([J7], "-") Co = Split([J8], "-") Max = IIf(UBound(No) > UBound(Co), UBound(No), UBound(Co)) i = Sheets("DATA").[A65536].End(xlUp).Row + 1 With Sheets("DATA") .Range("A" & i) = [D5] .Range("B" & i) = [J6] .Range("C" & i) = [D5] .Range("D" & i) = [B8] & " - " & [G11] .Range("E" & i, "F" & i) = Application.WorksheetFunction.Transpose([J7:J8]) .Range("G" & i, "H" & i) = Application.WorksheetFunction.Transpose([K7:K8]) .Range("A" & i).Resize(, 8).Copy .Range("A" & i).Resize(Max + 1) If UBound(No) > UBound(Co) Then For j = 0 To UBound(No) .Range("E" & i + j) = No(j) Next j Else For j = 0 To UBound(Co) .Range("F" & i + j) = Co(j) Next j End If End With End Sub
Max = IIf(UBound(No) > UBound(Co), UBound(No), UBound(Co))
Hàm xác định thông số của mảng:Cám ơn anh nghiaphuc nhiều lắm! Anh làm như vậy đúng ý em rùi. Nhưng có chỗ này em hỏi thêm anh nhé!
Em thấy anh dùng
Ubound có ý nghĩa như thế nào? Em không biết cách dùng. Anh tư vấn thêm cho em chút nha!!PHP:Max = IIf(UBound(No) > UBound(Co), UBound(No), UBound(Co))
UBound(No) là chỉ số của phần tử cuối cùng trong mảng No. VD: mảng No có 2 phần tử thì 2 phần tử này sẽ là No(0) và No(1), như vậy, UBound(No)=1. Trong code trên, mình chia TK nợ, TK có thành 2 mảng (No và Co) và so sánh số phần tử của 2 mảng này để quyết định 2 việc: Sẽ copy dữ liệu thành mấy dòng và sẽ gán giá trị khác nhau cho cột TK nợ hay cột TK có. Trong file của bạn có 2 TK nợ là 6422 và 1331, như vậy sẽ copy dữ liệu sang 2 hàng và gán TK nợ cho 2 hàng này lần lượt là 6422 và 1331.Cám ơn anh nghiaphuc nhiều lắm! Anh làm như vậy đúng ý em rùi. Nhưng có chỗ này em hỏi thêm anh nhé!
Em thấy anh dùng
Ubound có ý nghĩa như thế nào? Em không biết cách dùng. Anh tư vấn thêm cho em chút nha!!PHP:Max = IIf(UBound(No) > UBound(Co), UBound(No), UBound(Co))
Bạn sửa lại code như sau nhé (thú thật là đây không phải là nghiệp vụ của mình nên mình không hiểu việc ghi sổ ra sao cả => "mò mẫm"):Khi trước em không xem kỹ. Giờ em mới để ý kỹ thì em thấy có chỗ cột cập nhật tiền chưa đúng. Anh nghiaphuc xem và sửa lại code dùm em nhé!
(Câu hỏi cụ thể trong file đính kèm nhé!)
Sub GhiSo()
Dim i As Long, j As Byte, Max As Byte, No, Co
Sheets("IN_PHIEU").Activate
No = Split([J7], "-")
Co = Split([J8], "-")
Max = IIf(UBound(No) > UBound(Co), UBound(No), UBound(Co))
i = Sheets("DATA").[A65536].End(xlUp).Row + 1
With Sheets("DATA")
.Range("A" & i) = [D5]
.Range("B" & i) = [J6]
.Range("C" & i) = [D5]
.Range("D" & i) = [B8] & " - " & [G11]
.Range("E" & i, "F" & i) = Application.WorksheetFunction.Transpose([J7:J8])
.Range("A" & i).Resize(, 8).Copy .Range("A" & i).Resize(Max + 1)
If UBound(No) > UBound(Co) Then
For j = 0 To UBound(No)
.Range("E" & i + j) = No(j)
.Range("G" & i + j).Resize(, 2) = [K7].Offset(j)
Next j
Else
For j = 0 To UBound(Co)
.Range("F" & i + j) = Co(j)
.Range("G" & i + j).Resize(, 2) = [K7].Offset(j)
Next j
End If
End With
End Sub
Bạn sửa lại code như sau nhé (thú thật là đây không phải là nghiệp vụ của mình nên mình không hiểu việc ghi sổ ra sao cả => "mò mẫm"):
PHP:Sub GhiSo() Dim i As Long, j As Byte, Max As Byte, No, Co Sheets("IN_PHIEU").Activate No = Split([J7], "-") Co = Split([J8], "-") Max = IIf(UBound(No) > UBound(Co), UBound(No), UBound(Co)) i = Sheets("DATA").[A65536].End(xlUp).Row + 1 With Sheets("DATA") .Range("A" & i) = [D5] .Range("B" & i) = [J6] .Range("C" & i) = [D5] .Range("D" & i) = [B8] & " - " & [G11] .Range("E" & i, "F" & i) = Application.WorksheetFunction.Transpose([J7:J8]) .Range("A" & i).Resize(, 8).Copy .Range("A" & i).Resize(Max + 1) If UBound(No) > UBound(Co) Then For j = 0 To UBound(No) .Range("E" & i + j) = No(j) .Range("G" & i + j).Resize(, 2) = [K7].Offset(j) Next j Else For j = 0 To UBound(Co) .Range("F" & i + j) = Co(j) .Range("G" & i + j).Resize(, 2) = [K7].Offset(j) Next j End If End With End Sub
Nếu vậy thì bạn dùng code sau (chú ý phần màu đỏ):Anh nghiaphuc cho em hỏi thêm 1 chút nữa nhé: Nếu phát sinh cho có 1 No - 1 Co thì số tiền nó sẽ cập nhật luôn = B9? Vì nếu PS như vậy thì không có % thuế GTGT nữa anh ah. Anh sửa thêm cho em nhé!
Cám ơn anh nhiều!
Sub GhiSo()
Dim i As Long, j As Byte, Max As Byte, No, Co
Sheets("IN_PHIEU").Activate
No = Split([J7], "-")
Co = Split([J8], "-")
Max = IIf(UBound(No) > UBound(Co), UBound(No), UBound(Co))
i = Sheets("DATA").[A65536].End(xlUp).Row + 1
With Sheets("DATA")
.Range("A" & i) = [D5]
.Range("B" & i) = [J6]
.Range("C" & i) = [D5]
.Range("D" & i) = [B8] & " - " & [G11]
.Range("E" & i, "F" & i) = Application.WorksheetFunction.Transpose([J7:J8])
.Range("A" & i).Resize(, 8).Copy .Range("A" & i).Resize(Max + 1)
If UBound(No) > UBound(Co) Then
For j = 0 To UBound(No)
.Range("E" & i + j) = No(j)
.Range("G" & i + j).Resize(, 2) = [K7].Offset(j)
Next j
Else
For j = 0 To UBound(Co)
.Range("F" & i + j) = Co(j)
.Range("G" & i + j).Resize(, 2) = [B][COLOR=red]IIf(Max = 0, [B9], [K7].Offset(j))[/COLOR][/B]
Next j
End If
End With
End Sub
Mà sao có vụ làm ngược vậy. Dữ liệu để tạo PT, PC là gì hay là nhập thủ công.Code chạy mà bạn. Bạn kiểm tra lại nhé!