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:
Hỏi .value = .value ????

Có một đoạn code
PHP:
ActiveSheet.Select
   With Range("a2:r" & [a65000].End(xlUp).Row) 
.Value = .Value
   End With

Vậy quá trình .value = .value nó có giống hàm Text() trong excel không?
Quá trình này nó làm biến đổi những gì?

Cám ơn Anh/CHị
 
Upvote 0
Mình bày cho bạn cách tự học nè!

Nhập từ [A2] đến [A10] các trị tăng dần;
Bắt đầu từ [B2] (đến [B9]) ta lập công thức =[A2]*[A3] & copy xuống cuối;

Sau đó chạy macro sau
PHP:
Sub gpeTuHoc()
 With [A2:B14]
   .Value = .Value
 End With
End Sub

(húc thành công & chớ ỉ lại quá vô GPE.COM nghe bạn!
 
Upvote 0
Có một đoạn code
PHP:
ActiveSheet.Select
   With Range("a2:r" & [a65000].End(xlUp).Row) 
.Value = .Value
   End With

Vậy quá trình .value = .value nó có giống hàm Text() trong excel không?
Quá trình này nó làm biến đổi những gì?

Cám ơn Anh/CHị

Được hiểu như thế này: Với Range("a2:r" & [a65000].End(xlUp).Row) có thể có chứa công thức hay không, thì sau khi chạy thủ tục trên, tất cả range trong địa chỉ trên chỉ còn là giá trị, không chứa công thức nữa (nó tương đương với Copy/ Paste Special Value).

Bạn có thể tự làm và kiểm chứng.
 
Upvote 0
Có một đoạn code
PHP:
ActiveSheet.Select
   With Range("a2:r" & [a65000].End(xlUp).Row) 
.Value = .Value
   End With

Vậy quá trình .value = .value nó có giống hàm Text() trong excel không?
Quá trình này nó làm biến đổi những gì?

Cám ơn Anh/CHị
Nó giống như PasteSpecial\Values ấy ---> Tóm lại, nếu cell có công thức thì code trên sẽ lấy giá tri, bỏ luôn công thức
Vậy code trên sẽ tương đương:
PHP:
ActiveSheet.Select
With Range("a2:r" & [a65000].End(xlUp).Row) 
  .Copy
  .PasteSpecial xlPasteValues
 End With
 
Lần chỉnh sửa cuối:
Upvote 0
mong anh chỉ dẫn giúp, xin dc biết ơn . làm thế nào tôi có thể vô hiệu hóa 1 macro hoặc 1 form vào một ngày định sẵn
 
Upvote 0
mong anh chỉ dẫn giúp, xin dc biết ơn . làm thế nào tôi có thể vô hiệu hóa 1 macro hoặc 1 form vào một ngày định sẵn

Giả sử đến ngày 24/12/2011 trở về sau không cho chạy thủ tục nữa, Bạn làm như sau:

Mã:
Sub RunUntilDate()
    If Date >= [COLOR=#ff0000]#12/24/2011#[/COLOR] Then Exit Sub
    [COLOR=#006400]'Your code here[/COLOR]
End Sub
 
Upvote 0
Nó giống như PasteSpecial\Values ấy ---> Tóm lại, nếu cell có công thức thì code trên sẽ lấy giá tri, bỏ luôn công thức
Vậy code trên sẽ tương đương:
PHP:
ActiveSheet.Select
With Range("a2:r" & [a65000].End(xlUp).Row) 
  .Copy
  .PasteSpecial xlPasteValues
 End With

Ngoài ý nghĩa trên thì .value = .value còn ý nghĩa nào khác không.Em có một form e-xport từ trong phần mềm ra. Tất cả dữ liệu đều không có công thức nhưng đều set ở dạng GÊN Eral từchuộtko hiểu sao em gõ x toàn bị lỗi dấu và con chuot chạy mất khi dùng UNICODE)

Phải có câu này thì file chế biến số liệu mới đúng
 
Upvote 0
Ngoài ý nghĩa trên thì .value = .value còn ý nghĩa nào khác không.Em có một form e-xport từ trong phần mềm ra. Tất cả dữ liệu đều không có công thức nhưng đều set ở dạng GÊN Eral từchuộtko hiểu sao em gõ x toàn bị lỗi dấu và con chuot chạy mất khi dùng UNICODE)

Phải có câu này thì file chế biến số liệu mới đúng
Tôi chưa hiểu công việc của bạn lắm nên không thể trợ giúp
Tuy nhiên, tôi xin giải thích thêm phần .Value = .Value
Như đã nói ở trên, nó gần giống với PasteSpecial\Values nhưng thực chất sẽ có khác... Điểm khác biệt căn bản là cái thằng .Value = .Value nó xử lý theo kiểu mảng nên tốc độ nhanh hơn
Nếu viết cho rõ ra thì code trên phải thế này
PHP:
Sub Test()
  Dim Arr
  Arr = Range("a2:r" & [a65000].End(xlUp).Row).Value
  Range("a2:r" & [a65000].End(xlUp).Row) = Arr
End Sub
Arr = Range("a2:r" & [a65000].End(xlUp).Row).Value ---> Gán giá trị (chỉ lấy giá trị) vào mảng Arr
Range("a2:r" & [a65000].End(xlUp).Row) = Arr ---> Gán nguyên mảng Arr vào vùng dữ liệu (như vậy, cell chỉ còn giá trị, mất công thức)
 
Upvote 0
Sheet & worksheet khác gì nhau?

Em hỏi có câu
For each sheet in sheets và
For each sheet in worksheet

có gì khác nhau không?

worksheet em hình dung giống như 1 file excel phải không?
 
Upvote 0
Hỏi về code

Mình đang học VBA nên cố chuyển những bài tập excel về đạng dùng VBA, mình chưa biết dùng hàm intmode trong VBA như thế nào. Mong các bạn giải quyết giúp mình.Thanks
 

File đính kèm

Upvote 0
Mình đang học VBA nên cố chuyển những bài tập excel về đạng dùng VBA, mình chưa biết dùng hàm intmode trong VBA như thế nào. Mong các bạn giải quyết giúp mình.Thanks
- Tương ứng với hàm INT(a/b) trong Excel thì trong VBA cũng là hàm INT(a/b) hoặc biểu thức a \ b
- Tương ứng với hàm MOD(a,b) trong Excel (không phải là hàm MODE chứ, vì còn có một hàm MODE trong nhóm hàm thống kê nữa) thì trong VBA là biểu thức a mod b
Còn nếu bạn muốn dùng FormulaR1C1 thì bạn cứ Record macro là biết nó ra cái gì ngay thôi mà.
 
Upvote 0
Em hỏi có câu
For each sheet in sheets và
For each sheet in worksheet

có gì khác nhau không?

worksheet em hình dung giống như 1 file excel phải không?

Không hẳn như vậy đâu bạn ạ. 1 Workbook mới là 1 File. Trong 1 File gồm có Worksheet, Chart, Macro, Dialog.
 
Upvote 0
Thanks bạn, mình có gửi kèm file, bạn xem cách dùng của mình không biết sao báo lỗi.
 
Upvote 0
Ban tham khảo file xem sheets nó gồm những gì và Worksheets nó gồm những gì nha.
Từ đó bạn thấy thằng nào là tổ hợp con của thằng nào
Nói tóm lại cái tên của nó đã nói nên điều đó:
-Sheets là toàn bộ các trang có trong Workbook. Nháy chuột phải vào Sheet tabs---Insert : Trong đó có bao nhiêu loại Sheet mà bạn có thể thêm vào Workbook.
-Worksheet là 1 loại Sheet mà User có thể tạo bảng tính và làm việc trực tiếp trên đó. (Nôm na là các sheet bình thường)
-Workbook mới là 1 file. Còn Worksheets là tổ hợp các sheet làm việc trực tiếp trong file.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Thanks bạn, mình có gửi kèm file, bạn xem cách dùng của mình không biết sao báo lỗi.
Code của bạn bị lỗi tại câu: Set z = (x - y) / 7. Muốn sử dụng câu lệnh Set z = Cái gì đó thì Cái gì đó phải là một đối tượng (Sheet, Range, Control, UserForm,...), còn biểu thức (x - z) / 7 thì bản thân nó đã phát sinh lỗi rồi, bởi vì không thể lấy 2 Range trừ cho nhau theo cách này được.
Sử dụng Record Macro và sửa lại một xíu thì ta được code sau:
PHP:
Sub GPE9()
    With Sheet37
        .Range("F5:F18").FormulaR1C1 = "=INT((RC[-1]-RC[-2])/7)"
        .Range("G5:G18").FormulaR1C1 = "=VLOOKUP(RC[-4],R21C1:R31C3,2,0)"
        .Range("H5:H18").FormulaR1C1 = "=MOD(RC[-3]-RC[-4],7)"
        .Range("I5:I18").FormulaR1C1 = "=VLOOKUP(RC[-6],R21C1:R31C3,3,0)"
        .Range("J5:J18").FormulaR1C1 = "=RC[-4]*RC[-3]+RC[-2]*RC[-1]"
    End With
End Sub
Nếu chỉ muốn lấy kết quả mà không cần lưu công thức thì bạn thêm một câu lệnh này trước dòng End With là được: .Range("F5:J18").Value = .Range("F5:J18").Value
 
Upvote 0
Cứ tưởng đơn giản mà ko để ý. nhưng xem ra dùng excel nhiều năm nhưng khái niệm về sheets và workshéet giờ em mới phân biệt đựoc

Thảm nào em Dim sh toàn bị sai, code không chạy vì hay nhầm với Sheets với worksheet

Cám ơn Anh Sealand nhiều nhé
 
Upvote 0
Em tập viết một ví dụ để kiểm tra một range, Nếu
- Range <> "" và
-Có chiều dài < 5 Thì

Nối "HP/TM/V/C/" vào arr

Em test thấy báo lỗi dòng này

Sheet3.Range("H3:H" & K).Value = "HP/TM/V/C/" & arr

XIn chỉ giúp em
PHP:
Sub add()
Dim sArr, arr
Dim dg As Long
Dim cells As Range
dg = Sheet3.[A65000].End(xlUp).Row
    sArr = Sheet3.Range("H3:H" & dg)
    ReDim arr(1 To UBound(sArr), 1)
    For i = 1 To UBound(sArr, 1)
            If sArr(i, 1) <> "" And Len(sArr(i, 1)) < 5 Then
                sArr = arr
                K = K + 1
                Sheet3.Range("H3:H" & K).Value = "HP/TM/V/C/" & arr
                
             End If
    Next
    
    
End Sub
 
Upvote 0
Em tập viết một ví dụ để kiểm tra một range, Nếu
- Range <> "" và
-Có chiều dài < 5 Thì

Nối "HP/TM/V/C/" vào arr

Em test thấy báo lỗi dòng này

Sheet3.Range("H3:H" & K).Value = "HP/TM/V/C/" & arr

XIn chỉ giúp em
PHP:
Sub add()
Dim sArr, arr
Dim dg As Long
Dim cells As Range
dg = Sheet3.[A65000].End(xlUp).Row
    sArr = Sheet3.Range("H3:H" & dg)
    ReDim arr(1 To UBound(sArr), 1)
    For i = 1 To UBound(sArr, 1)
            If sArr(i, 1) <> "" And Len(sArr(i, 1)) < 5 Then
                sArr = arr
                K = K + 1
                Sheet3.Range("H3:H" & K).Value = "HP/TM/V/C/" & arr
             End If
    Next
 End Sub
sArr = arr : Arr đang empty, nên sArr cũng empty luôn.
Sheet3.Range("H3:H" & K).Value = "HP/TM/V/C/" & arr: Mảng arr có nhiều phần tử. Bạn muốn nối chuỗi trên vào phần tử nào? Phép nối trên mắc lỗi Type mismatch. Nghĩa là không phù hợp.
 
Upvote 0
Web KT

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

Back
Top Bottom