Xử lý số liệu

Liên hệ QC

ThuNghi

Hãy cho rồi sẽ nhận!
Thành viên đã mất
Tham gia
16/8/06
Bài viết
3,808
Được thích
4,449
Bạn nvson và bạn Cường chỉ hộ
Vd2: ta có Sh(chitiet) như sau (Sh này đựơc tạo từ Sh(CT))
sp makh sotien
ct01 001 xxxx

và Sh(DMKH)
makh tenkh dc kv
001 NVY Hà Nội MB
002 NVS Hải Phòng MB
003 TNG TP. HCM MN

Vậy khi thống kê sotien theo KV
ta phải thêm một field KV và Vlookup sau đó thống kê như sau
sp makh sotien kv
ct01 001 xxxx MB

hay là ta khi ta cập nhật dữ liệu thì ta tạo luôn field KV luôn và update luôn

VD2: Trong Sh(chitiet) ta phải copy sh(CT) vào dòng cuối của Sh(chitiet)
- cách 1: có một cell(X1) là count chitiet và ta sẽ dán từ dòng + cell(X1).value
- cách 2: Range(a1) ... end => hang = x
Bạn xem cách nào thì tốt hơn
Xin cám ơn!
 
VD1:
Mình đồng ý với bạn cách sử dụng thêm một trường KV vào nữa, sau đó dùng công thức VLookup để tìm KV theo mã KH.
Lúc đó công việc tính tổng số tiền theo KV sẽ đơn giản đi rất nhiều.

VD2:
Mình nghĩ bạn tạo một macro để tự động copy vùng chọn vào đúng dòng cuối (+1) luôn (đỡ mất công di chuyển).
Đây là macro di chuyển đến dòng cuối. Bạn có thể xử lý thêm để hoàn thiện theo ý bạn.
Mã:
Sub GotoEnd()
    Range("A1").Select
    Do
        Selection.End(xlDown).Select
    Loop While Not ActiveCell.Row = 65536
    Selection.End(xlUp).Select
    ActiveCell = Selection.Offset(1, 0)
End Sub
 
Upvote 0
Và cũng vd trên nếu liệt kê sotien theo kv (đã dùng vlo..)
Nếu dùng VBA thì tôi sẽ sort theo kv, sp (add sh)
sau đó tìm dòng đầu tiên có kv thõa dk (match) + số dòng thõa (coutif)
và copy số dòng này, xóa hết sh và paste.
Theo bạn như vậy có nhanh hơn for i=xZ to ...
Tôi dùng VBA theo kiểu amater lắm
 
Upvote 0
Bây giờ ở sheet "Chi tiết" có định dạng như sau:
sp makh sotien kv
ct01 001 xxxx MB

Bạn muốn tính tổng số tiền theo từng khu vực: dùng hàm SumIf
Mã:
Miền Bắc:
=SUMIF($D$2:$D$12,"MB",$C$2:$C$12)
Miền Nam:
=SUMIF($D$2:$D$12,"MN",$C$2:$C$12)
.........

Nếu dùng VBA thì tôi sẽ sort theo kv, sp (add sh)
sau đó tìm dòng đầu tiên có kv thõa dk (match) + số dòng thõa (coutif)
và copy số dòng này, xóa hết sh và paste.
Theo bạn như vậy có nhanh hơn for i=xZ to ...

Theo mình nghĩ bạn sử dụng chức năng Data/Filter sẽ nhanh hơn rất nhiều. (Kể cả trong VBA cũng dùng được chức năng này).
 
Upvote 0
Have nice "Thứ bảy"!

Nhờ các bạn chỉ hộ:
1/Sh(CT)
Sp mh sotien makh
ct01 nn01 123 001

2/Sh(DMKH)
makh tenkh dc kv
001 NVY Hà Nội MB
002 NVS Hải Phòng MB
003 TNG TP. HCM MN

3/ Sh(DMHH)
mh tenhang nhomhang
nn01 abc nn
mm01 bcf nm
*** linh tinh nkh (hàng khác)

Tại Sh(CT) tôi tạo 1 sub để chuyển vào Sh(chitiet) như sau
sp makh sotien tenkh KV nhomhang
ct01 001 123

With sh(chitiet)
.range(...).value = range(...).value
phần sp, makh, sotien thì tôi vận dụng được.
Nhưng phần tenkh, kv (phải dùng Vlookup với DMKH) và phần nhomhang (nếu không nhomhang thì cho nhóm hàng nmk, tôi dùng countif) nhưng đưa vào sub thì nó không chạy.
Cụ thể câu lệnh như sau:
' .Range("R" & hang + i - 9).Value = if(countif(dmnh,Mid(Range("B" & i + 1).Value, 2, 2)>0,Mid(Range("B" & i + 1).Value, 2, 2),"mk)
' .Range("S" & hang + i - 9).Value = VLookup(Range("d5").Value, dmkh, 11)
Nó báo lỗi tại dòng trên
Nhờ anh Nvson,anh Cường và các bạn giúp đỡ gấp để hòan thiện
Xin cám ơn!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
' .Range("R" & hang + i - 9).Value = if(countif(dmnh,Mid(Range("B" & i + 1).Value, 2, 2)>0,Mid(Range("B" & i + 1).Value, 2, 2),"mk)
' .Range("S" & hang + i - 9).Value = VLookup(Range("d5").Value, dmkh, 11)

Mình nghĩ thay vì bạn dùng thuộc tính Range(....).Value, bạn nên thau bằng thuộc tính Range(....).Formula

Tại ô R mấy đấy, bạn đánh công thức trên (vẫn dùng if, countif thao đúng cú pháp của Excel), sau đó copy nó vào trong thủ tục của bạn, rồi thay đổi những thứ cần thiết (dòng thay đổi theo vòng lặp...)

VD:
Mã:
Cells(hang+i-9, "R").Formula = "=If(CountIf(dmkh," & "Mid(B" & i + 1 & ",2,2)>0)," & "Mid(B" & i + 1 & ",2,2)" & ")"
Nếu bạn làm việc trên từng ô thì nên thay Range(...) bằng Cells(...)
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn bạn nhiều, giờ mới biết dùng VBA mà các dòng lệng phải có " "
"=If(CountIf(dmkh," & "Mid(B" & i + 1 & ",2,2)>0)," & "Mid(B" & i + 1 & ",2,2)" & ")"

Bạn chỉ giúp lúc nào thêm dấu ", mò mẫm cũng ra mà không hiểu sâu
 
Upvote 0
Rõ ràng trong VBA không có hàm if(logical_test, value_if_true, value_if_false) (nhưng nó có hàm IIf cũng có cú pháp tương tự).
Khi bạn muốn dùng các hàm của Excel để đặt vào một ô nào đó thì bạn dùng thuộc tính .Fomula. Khi đó vế bên phải là công thức nhưng ở dạng Text (do đó nó phải được bao trong dấu nháy kép ("...")).
Nhưng do có những thông số thay đổi nên bạn phải dùng phép nối (&) để liên kết lại thành một công thức hoàn chỉnh.
VD:
Tại 1 ô A1 trong Excel bạn đánh công thức = Sum(B1:B5)
thì nếu viết trong VBA bạn có thể viết Range("A1").Formula= "=sum(B1:B5)"
Giả sử bạn tính tổng từ ô B1 đên ô Bi nào đó (i thay đổi trong chương trình, lúc đó bạn viết:
Range("A1").Formula= "=sum(B1:B" & i & ")"

Khi đó nếu i =100 thì vế bên phải sẽ là "=sum(A1:B100)"
......
 
Upvote 0
Web KT
Back
Top Bottom