Chữa lỗi macro chương trình.

Liên hệ QC

MicrosoftExcel

Thành viên chính thức
Tham gia
21/8/08
Bài viết
97
Được thích
30
Xin chào tất cả.
Tôi có một chương trình viết trong VBA, nó lien quan đến nhiều sheet và dữ liệu được lấy so sánh trong các sheet khác nhau. Trong quá trình chạy tôi gặp phải một vài lỗi mà chưa biết cách khắc phục, tôi đã hỏi bro Voda rồi nhưng vẫn còn lỗi mà chưa tìm cách khắc phục được, tôi đã lên mạng tìm rồi nhưng vẫn không giải quyết được. Bro nào biết xin chỉ dùm với.
Khi chạy đến dòng này là báo lỗi, không hiểu lỗi gì?
Mã:
[/FONT][FONT=Verdana] If Application.WorksheetFunction.Index((Qgh), Cells(7 + i, 13)) < Cells(7 + i, 11) Then

Link file nguồn

http://www.mediafire.com/?9ynndg4jb9c
 
Lần chỉnh sửa cuối:
Xin chào tất cả.
Tôi có một chương trình viết trong VBA, nó lien quan đến nhiều sheet và dữ liệu được lấy so sánh trong các sheet khác nhau. Trong quá trình chạy tôi gặp phải một vài lỗi mà chưa biết cách khắc phục, tôi đã hỏi bro Voda rồi nhưng vẫn còn lỗi mà chưa tìm cách khắc phục được, tôi đã lên mạng tìm rồi nhưng vẫn không giải quyết được. Bro nào biết xin chỉ dùm với.
Khi chạy đến dòng này là báo lỗi, không hiểu lỗi gì?
Mã:
[FONT=Verdana] If Application.WorksheetFunction.Index((Qgh), Cells(7 + i, 13)) < Cells(7 + i, 11) Then[/FONT]


Link file nguồn

http://www.mediafire.com/?9ynndg4jb9c
nếu
dim Qgh as range
Thì phải có
Set
Qgh=Sheet1.Range("B22:E22")
Còn nếu
Qgh là range thì Index((Qgh), Cells(7 + i, 13)) phải sửa là
Index(range("Qgh"), Cells(7 + i, 13))

Nhòn code chóng mặt thật.
 
Upvote 0
nếu
dim Qgh as range
Thì phải có
Set
Qgh=Sheet1.Range("B22:E22")
Còn nếu
Qgh là range thì Index((Qgh), Cells(7 + i, 13)) phải sửa là
Index(range("Qgh"), Cells(7 + i, 13))

Nhòn code chóng mặt thật.
Nhưng mà trong sheet đã khai báo mảng theo tên rồi cơ mà nhi? Có cần phải set lại vùng không? Và phần match thi khai báo thế nào là đúng nhất? Xin check và chỉ lỗi dùm với! Xin cảm ơn bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu khai báo theo tên như là
Sheet1.rang(...).name="Qgh" (bạn khai rồi.
Thì phải dùng
Index(Range("Qgh"),...) nó mới hiểu.
 
Upvote 0
Nếu khai báo theo tên như là
Sheet1.rang(...).name="Qgh" (bạn khai rồi.
Thì phải dùng
Index(Range("Qgh"),...) nó mới hiểu.
Mình không khai báo tên như vậy, mà mình đặt tên vùng trong sheet luôn, tức là mình chọn vùng trong sheet và đặt tên trong Name box cơ mà, thế có cần phải dùng Index(Range("Qgh") nữa ko?
 
Upvote 0
Mình không khai báo tên như vậy, mà mình đặt tên vùng trong sheet luôn, tức là mình chọn vùng trong sheet và đặt tên trong Name box cơ mà, thế có cần phải dùng Index(Range("Qgh") nữa ko?
Đương nhiên là vậy rồi... vì VBA hỏng có biết bạn đang nói Qgh là cái gì (dù trong công thức Excel thì nó biết)
E rằng file này còn phải sửa lại rất nhiều... như 1 mớ bòng bong
 
Upvote 0
Đương nhiên là vậy rồi... vì VBA hỏng có biết bạn đang nói Qgh là cái gì (dù trong công thức Excel thì nó biết)
E rằng file này còn phải sửa lại rất nhiều... như 1 mớ bòng bong
Đúng vậy, tôi đã sửa xong gần hết rồi chỉ còn mắc có một lỗi trong khi chay đến bước thứ 125 thì gặp lỗi. Chưa tìm ra bạn ạ, không hiểu sao nó lại gán cái Qd là một ô trống :=\+.

Bạn có thể giúp mình kiểm tra được không? Xin cảm ơn nhiều!

Đây là link down file đã sửa gần hết lỗi /-*+/

http://www.mediafire.com/?9boo9ntw0n5
 
Upvote 0
Khi i =126 thì Cells(6 + i, 9)=139.697 mà Range("MNCL") là 215, 220, 230 ,240 thì không có số đó
Nccl = Application.WorksheetFunction.Match(Cells(6 + i, 9), Range("MNCL")) 'Cap chong lu
Có khi vậy nên nó không hiểu.

Nccl = Application.WorksheetFunction.Match(Cells(6 + i, 9), Range("MNCL")) 'Cap chong lu
Đã khai set
Dim Fn As WorksheetFunction
Set Fn = Application.WorksheetFunction
thì viết như sau cho ngắn.
Nccl = Fn.Match(Cells(6 + i, 9), Range("MNCL")) 'Cap chong lu
Có nhiều range thấy chỉ có 4 số thì cần thiết phải index, match không.
Ví dụ:
Set XXX as range
XXX=sh.range("A1:A10")
Vậy muốn lấy dòng i thì chỉ cần
XXX(i)
1/ Bạn cũng nên thêm vào đầu code
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
Và cuối
With Application
.ScreenUpdating = True
.EnableEvents = True
End With
2/ Dim i, NN, Nzw, Nqd, Nqz, CL, CCL As Integer
Thì chỉ có CCL là Integer, vậy nên là
Dim i As Integer, NN As Integer, Nzw As Integer, ...., CCL As Integer
Ước gì tôi hiểu bạn muốn cái gì thì có thể giúp.
 
Upvote 0
Nếu bạn có yahoo hay skype thì mình sẽ nói chuyện với bạn, thì bạn sẽ hiểu ngay. Nếu không thì bạn có thể down bản mới nhất mà mình đã sửa rồi về kiểm tra lại hộ mình với. Cái lỗi mà bạn nêu là :
Mã:
Khi i =126 thì Cells(6 + i, 9)=139.697 mà Range("MNCL") là 215, 220, 230 ,240 thì không có số đó
Nccl = Application.WorksheetFunction.Match(Cells(6 + i, 9), Range("MNCL")) 'Cap chong lu
Hay lặt vặt khác mình kiểm tra hết rồi.
Chương trình này hơi phức tạp một chút.
Bây giờ mình gặp lỗi ở chỗ bước tính i=202
- Khi giá trị ở cột 9 (tức là Z) nhỏ hơn MNTL (215) thì tính toán lại bước thời gian T ở cột 3, để sao cho Z =215 => Qd=>Qx=>W
- Ở bước tiếp theo khi Z tiếp tục xuống nhỏ hơn 215 thì Qx=Qd =>Delta W =0

Nhưng không hiểu sao ở đây lại xuất hiện lỗi.

Chương trình dài quá không thể post lên được, cảm phiền bạn dload về xem giùm mình với nhé.

Link donw: http://www.mediafire.com/?ndwo2ydwcxj
 
Upvote 0
Bạn ThuNghi à!
Mình đưa đoạn code
Mã:
Khi i =126 thì Cells(6 + i, 9)=215.03 'mà Range("MNCL") là 215, 220, 230 ,240 thì không có số đó
Nccl = Application.WorksheetFunction.Match(Cells(6 + i, 9), Range("MNCL")) 'Cap chong lu
Và một số Cells() khác vào Watches để kiểm tra thì dù khi match giá trị Cells(6 + i, 9)=215.03 không có trong range thì nó sẽ vẫn nhận giá trị gần nhất và lúc ấy Nccl =1
Thế nên cái chỗ này vẫn không gây lỗi bạn à.
 
Upvote 0
Vẽ biểu đồ trong VBA

Cảm ơn mọi người đã giúp đỡ, tôi đã xử được hết các lỗi trong phần code trước đây. Bây giờ đến đoạn vẽ biểu đồ này khó làm quá, chưa làm kiểu này bao giờ. Ai biết xin chỉ giúp mình với, làm thế nào để vẽ được biểu đồ trong VBA kiểu như file mình đính kèm dưới đây không, chỉ giúp mình với? Trong sheet DothiWZ.
Với 3 cột giá trị, trong đấy một cột làm giá trị chung theo trục Y, còn 2 cột còn lại sẽ biểu thị theo giá trị trong trục X, với hai chiều vẽ ngược nhau, một cái vẽ từ gốc 0,0 đi, một cái vẽ từ Max(X) vẽ ngược về trục 0,0, sau đó scan tỉ lệ để lưới gióng theo của trục X cho hai cột giá trị ấy trùng nhau. Sau đó gắn nhãn tên loại đường cho từng đường theo đúng vị trí.
Mình gắn kèm file dữ liệu các cột vẽ biểu đồ nhé.

30005799@N06
WFZ.bmp.jpg
QTZ.bmp.jpg


http://www.mediafire.com/?4tl5ujhjx2d
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Các bạn cho tôi hỏi thêm với!

Nếu trong sheet đã khai báo mảng ở Define Nam rồi, thì trong VBA có cần phải khai báo lại là như sau không?

Mã:
 Zw=Sheet!("Dauvao").Range("G9:G25")

Và nếu đã khai báo trong một sub rồi thì các sub khác ở modul khác trong cùng một file excel có cần phải khai báo lại ko?
 
Upvote 0
Web KT

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

Back
Top Bottom