Hỏi đáp về VBA (các vấn đề căn bản nhất) (2 người xem)

Liên hệ QC

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

havietchuong

Thành viên tiêu biểu
Tham gia
16/6/09
Bài viết
490
Được thích
570
Giới tính
Nam
Nghề nghiệp
Giáo viên tiểu học.
Tôi không biết đặt đặt câu hỏi này nơi nào cho đúng, xin gởi vào đây. Nếu có sai xin thông cảm cho người mới học VBA.
Trong 1 cửa sổ Module có thể ghi nhiều nhiều Macro và mỗi macro có thể ứng với 1 tổ hợp phím nào đó được không?
Tôi thử nhiều lần thì khi được khi không. Không biết nó thế nào? Trong tập tin sau có lỗi gì không trong cách ghi Macro? Cám ơn.
 

File đính kèm

Lần chỉnh sửa cuối:
Anh ơi cho em hỏi đoạn code này, em đã copy 1 folder DQT2011 chuyển thành DQT2012 mà sao trong listbox em không thấy nó hiển thị năm 2012 mà chỉ có năm 2011 anh nhỉ. em thấy trong folder này có tập tin excel .xls mà ko có tên. anh hướng dẫn em với.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu viết code trên nền tảng Excel VBA thì thôi khỏi nghĩ đến vụ bảo mật chỉ cho mệt! Dù bạn có làm gì thì người ta vẫn mở được file trong vòng 10 giây mà thôi

Anh ơi cho em hỏi đoạn code này, em đã copy 1 folder chuyển thành mà sao trong listbox em không thấy nó hiển thị năm 2012 mà chỉ có năm 2011 anh nhỉ. Cái này có 1 cái listbox trong đó có sẵn năm để mình chọn. em lục tìm hết tất cả các file đều không thấy " hình như cái này dùng để tạo 1 file mới trong excel phải không anh.
Em sửa trong excel nơi có chứa một dãy số em sửa 1 số thì được còn thêm mới thì không được anh ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Anh ơi cho em hỏi đoạn code này, em đã copy 1 folder DQT2011 chuyển thành DQT2012 mà sao trong listbox em không thấy nó hiển thị năm 2012 mà chỉ có năm 2011 anh nhỉ. em thấy trong folder này có tập tin excel .xls mà ko có tên. anh hướng dẫn em với.
Frmylamv.Show
ofile = InputBox("Xin chao ban hay nhap tap tin can tao:", "Xay lap CT")
ofile = "D:\DQT_XLCT\" & "DQT" & namlv & "\dutoan\" & ofile & ".xls"
If Len(Dir(ofile)) > 1 Then
ofile = InputBox("TËp tin <" & ofile & "> ®· cã trong hÖ thèng. B¹n h·y nhËp mét tªn kh¸c", "X©y l¾p CT - Vò NghÜa")
ofile = "D:\DQT_XLCT\" & "DQT" & namlv & "\dutoan\" & ofile & ".xls"
End If

Đây là code trong phần chọn năm để lưu tập tin.
Private Sub lg_ok_Click()
Frmylamv.Hide
End Sub
Private Sub Lst_nam_Click()
namlv = Lst_nam.Text
lg_ok.SetFocus
End Sub
Private Sub UserForm_Activate()
lcp = "[" & bodm & ".xls]ncong!"
Lst_nam.RowSource = lcp & "dsnam"
End Sub

Cái này có 1 cái listbox trong đó có sẵn năm để mình chọn. em lục tìm hết tất cả các file đều không thấy "bodm" hay "dsnam" hình như cái này dùng để tạo 1 file mới trong excel phải không anh.
Em sửa trong excel nơi có chứa một dãy số em sửa 1 số thì được còn thêm mới thì không được anh ạ
Hình như bạn hỏi đã mấy lần rồi thì phải? Vậy mà cái điều đơn giản nhất: CHO FILE LÊN ĐÂY bạn lại không làm
Ai biết gì mà giúp
(có hỏi đến tết cũng chẳng ai trả lời)
 
Upvote 0
Hình như bạn hỏi đã mấy lần rồi thì phải? Vậy mà cái điều đơn giản nhất: CHO FILE LÊN ĐÂY bạn lại không làm
Ai biết gì mà giúp
(có hỏi đến tết cũng chẳng ai trả lời)

hic cái máy của em nó bị tắt hoài do điện yếu quá nên em tưởng không gửi được
 
Lần chỉnh sửa cuối:
Upvote 0
hic cái máy của em nó bị tắt hoài do điện yếu quá nên em tưởng không gửi được
Tốt nhất là Bạn tự mày mò hoặc hỏi trực tiếp tác giả (Vũ_Nghĩa), tất cả các đoạn code bạn vừa hỏi là bản quyền của tác giả này về chương trình dự toán XD, mặc dù mình thấy code này rất dở (xin lỗi nếu đụng chạm tác giả), có lẽ viết từ thuở sơ khai nhưng để vậy dùng đến bây giờ (trong đó có những thủ tục dài đến hàng ngàn dòng), nhưng nếu Bạn muốn nghiên cứu hoặc ... thì cũng không nên hỏi lộ liễu như vậy.
 
Lần chỉnh sửa cuối:
Upvote 0
THầy cô & anh chị cho em hỏi
Thông số (1,1) màu đỏ có tác dụng hay ý nghĩa như thế nào?

Mã:
With Range([B9], [B200].End(xlUp))
.Offset(.Rows.Count, 1)[COLOR=#ff0000](1, 1)[/COLOR].Value
.Offset(.Rows.Count, 2)[COLOR=#ff0000](1, 1)[/COLOR].Value
Em cảm ơn
 
Upvote 0
THầy cô & anh chị cho em hỏi
Thông số (1,1) màu đỏ có tác dụng hay ý nghĩa như thế nào?

Mã:
With Range([B9], [B200].End(xlUp))
.Offset(.Rows.Count, 1)[COLOR=#ff0000](1, 1)[/COLOR].Value
.Offset(.Rows.Count, 2)[COLOR=#ff0000](1, 1)[/COLOR].Value
Em cảm ơn
Sau khi Offset (dịch chuyển xong) người ta chỉ muốn lấy 1 cell duy nhất thôi nên có cái thằng (1,1) ấy mà ---> Nếu hổng có nó thì tham chiếu nhận được sẽ là nguyên 1 khối cell (chứ không phải 1 cell)
Thằng (1,1) gần tương đương với hàm INDEX trong Excel, lấy tham chiếu tại dòng 1, cột 1 của khối cell
 
Upvote 0
Thầy cô & anh chị cho em hỏi có thể rút gọn code này không ?

Mã:
    .Offset(.Rows.Count, 1)(1, 1).Value = "=SUM(C10,C43,C65,C89,C97,C105,C151,C153,C157)"
    .Offset(.Rows.Count, 2)(1, 1).Value = "=SUM(D10,D43,D65,D89,D97,D105,D151,D153,D157)"
    .Offset(.Rows.Count, 3)(1, 1).Value = "=SUM(E10,E43,E65,E89,E97,E105,E151,E153,E157)"
    .Offset(.Rows.Count, 4)(1, 1).Value = "=SUM(F10,F43,F65,F89,F97,F105,F151,F153,F157)"
    .Offset(.Rows.Count, 5)(1, 1).Value = "=SUM(G10,G43,G65,G89,G97,G105,G151,G153,G157)"
    .Offset(.Rows.Count, 6)(1, 1).Value = "=SUM(H10,H43,H65,H89,H97,H105,H151,H153,H157)"
Em cảm ơn!
 
Upvote 0
Thầy cô & anh chị cho em hỏi có thể rút gọn code này không ?

Mã:
    .Offset(.Rows.Count, 1)(1, 1).Value = "=SUM(C10,C43,C65,C89,C97,C105,C151,C153,C157)"
    .Offset(.Rows.Count, 2)(1, 1).Value = "=SUM(D10,D43,D65,D89,D97,D105,D151,D153,D157)"
    .Offset(.Rows.Count, 3)(1, 1).Value = "=SUM(E10,E43,E65,E89,E97,E105,E151,E153,E157)"
    .Offset(.Rows.Count, 4)(1, 1).Value = "=SUM(F10,F43,F65,F89,F97,F105,F151,F153,F157)"
    .Offset(.Rows.Count, 5)(1, 1).Value = "=SUM(G10,G43,G65,G89,G97,G105,G151,G153,G157)"
    .Offset(.Rows.Count, 6)(1, 1).Value = "=SUM(H10,H43,H65,H89,H97,H105,H151,H153,H157)"
Em cảm ơn!

Vầy chắc được:
Mã:
.Offset(.Rows.Count, 1).Resize(1, 6).Value = "=SUM(R10C,R43C,R65C, R89C,R97C,R105C,R151C,R153C,R157C)"
 
Upvote 0
Sư phụ có thể nói thêm dùm cái hàng chữ màu đỏ trên. Cảm ơn trước.

Mã:
With Range([B9], [B200].End(xlUp))  
    .Offset(.Rows.[COLOR=#ff0000][B]Count, 1).Resize(1, 6).[/B][/COLOR]Value = "=SUM(R10C,R43C,R65C, R89C,R97C,R105C,R151C,R153C,R157C)"

    MsgBox .Rows.Count,,.Ofset(.Rows.Cout,1).Address
    Msgbox  .Offset(.Rows.[COLOR=#ff0000][B]Count, 1).Resize(1, 6)[/B][/COLOR].Address
    MsgBox "Hieu Khong?" ,, "!!!"

End With
 
Upvote 0
Giúp em với, nó báo lỗi Run-time error 1004
Mã:
Sub TTT()
With ActiveSheet
.Range("E157").Resize(0, 4).Value = "=SUM(R158C)"
MsgBox .Range("E157").Resize(0, 4).Address
End With
End Sub
em cảm ơn!
 
Upvote 0
Giúp em với, nó báo lỗi Run-time error 1004
Mã:
Sub TTT()
With ActiveSheet
.Range("E157").[B]Resize([COLOR=#ff0000]0[/COLOR], 4).Valu[/B]e = "=SUM(R158C)"
MsgBox .Range("E157").Resize(0, 4).Address
End With
End Sub
em cảm ơn!
Resize(Số dòng, Số cột) ---> Vậy làm quái gì có cái chuyện Số dòng (hoặc số cột) = 0 hả Diễm?
 
Upvote 0
Cho em hỏi, Em giả sử vòng lặp For i=3 to 10 ( Nghĩa là i liên tục từ 3 đến 10) ...... Next


Còn trường hợp của em là i từ 3 đến 6 (bỏ 7) và từ 8 đến 10. Như vậy em có dùng For Next được không?
Em cảm ơn.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Cho em hỏi, Em giả sử vòng lặp For i=3 to 10 ( Nghĩa là i liên tục từ 3 đến 10) ...... Next


Còn trường hợp của em là i từ 3 đến 6 (bỏ 7) và từ 8 đến 10. Như vậy em có dùng For Next được không?
Em cảm ơn.

Đương nhiên là được và muốn nhảy qua giá trị nào của i thì bạn thêm If vào ngay dưới câu lệnh For

Ví dụ nhảy qua 7 thì câu lệnh là: if i = 7 then i = 8
 
Upvote 0
Cho em hỏi, Em giả sử vòng lặp For i=3 to 10 ( Nghĩa là i liên tục từ 3 đến 10) ...... Next
Còn trường hợp của em là i từ 3 đến 6 (bỏ 7) và từ 8 đến 10. Như vậy em có dùng For Next được không?
Em cảm ơn.

nếu các trường hợp loại trừ ít (trong trường hợp này chỉ loại trừ 7)

PHP:
For i = 3 to 10
If i = 7 then i = 8
...
Next
 
Upvote 0
Đương nhiên là được và muốn nhảy qua giá trị nào của i thì bạn thêm If vào ngay dưới câu lệnh For

Ví dụ nhảy qua 7 thì câu lệnh là: if i = 7 then i = 8

Anh cho em ví dụ cụ thể được khộng! em cảm ơn.
Thôi đã có bài của thầy ptm0412, Thầy ptm0412 nói nếu loại trừ ít, như vậy nếu loại trừ nhiều thì giải quyết như thế nào ạ!
 
Lần chỉnh sửa cuối:
Upvote 0
Hồi trước có học lập trình cơ bản (Turbo Pascal 3.0) thầy dặn không nên thay đổi giá trị của biến điều khiển trong vòng lặp For To/Downto Do, vì thói quen này có thể dẫn đến các trường hợp bất thường.
Tôi vẫn quen dùng cách "cổ điển" khi phải nhảy băng qua các giá trị:
If i<>7 then (hoặc một điều kiện nào đó về i chẳng hạn)
... xử lý
End If
mặc dầu nó chậm hơn nhưng câu lệnh rõ ràng hơn.
 
Upvote 0
Anh cho em ví dụ cụ thể được khộng! em cảm ơn.
Thôi đã có bài của thầy ptm0412, Thầy ptm0412 nói nếu loại trừ ít, như vậy nếu loại trừ nhiều thì giải quyết như thế nào ạ!

Loại trừ hơi nhiều thì làm như hoangvuluan:

PHP:
For i = 3 to 10
If i <> 5 Or i <> 7 Or i <> 8 Then
..
End If
Next

Loại trừ nhiều hơn tí nữa thì dùng If với phủ định

Loại trừ nhiều hơn nữa, thì bỏ vòng For mà dùng If đơn thuần.
 
Upvote 0
Web KT

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

Back
Top Bottom