Hỏi đáp về VBA (các vấn đề căn bản nhất)

Liên hệ QC

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

  • baitap1.xls
    28 KB · Đọc: 244
Lần chỉnh sửa cuối:
Thấy mấy bạn trên diễn đàn này xôn xao, chạy theo vba để lập trình. Bây giờ cho em chạy theo với, bắt đầu xuất phát theo bản năng, mình cũng không biết sẽ bắt đầu từ đâu và học bao lâu mới biết chút ít. Em có 1 bài thí dụ như vầy (file kèm theo). Vậy lập trình trong vba làm sao cho ô B2 giống kết quả ở cell b2. Cảm ơn
bạn thử xem cái này xem sao?
Sub t()
Range("b2").Value = IIf(Range("a2").Value = 1, "No", "yes")
End Sub
 
Upvote 0
Hihi. Tuyệt vời anh ơi. Cho em hỏi Value là cái gì vậy anh. Giải thích dùm em luôn thể. Cảm ơn
 
Upvote 0
Anh chị cho em hỏi đoank code VBA này với

Private Sub CommandButton1_Click()

Range("C1").Value = Range("A1").Value + Range("B1").Value

End Sub

Đoạn code trên em biết là khi em click vào button thì ô C1 sẽ tự cộng ô A1 và B1 trên cùng một sheet trong excel.

Nhưng bây giờ em muốn ô C1 là ở sheet1 còn ô A1 là ở sheet 2, ô B1 là ở Sheet 3 thì viết code như thế nào anh chị nhỉ?

Cám ơn anh chị nhiều, em mới chập chững làm quen với VBA 4 Excel, mong anh chị chỉ bảo thêm.

Thanks Anh chị nhiều
 
Upvote 0
Private Sub CommandButton1_Click()

Range("C1").Value = Range("A1").Value + Range("B1").Value

End Sub

Đoạn code trên em biết là khi em click vào button thì ô C1 sẽ tự cộng ô A1 và B1 trên cùng một sheet trong excel.

Nhưng bây giờ em muốn ô C1 là ở sheet1 còn ô A1 là ở sheet 2, ô B1 là ở Sheet 3 thì viết code như thế nào anh chị nhỉ?

Cám ơn anh chị nhiều, em mới chập chững làm quen với VBA 4 Excel, mong anh chị chỉ bảo thêm.

Thanks Anh chị nhiều

Bạn thử code này xem nhé:
PHP:
Private Sub CommandButton1_Click()
    Range("C1").Value = Sheets("Sheet2").Range("A1").Value + Sheets("Sheet3").Range("B1").Value
End Sub
 
Upvote 0
Mã:
Private Sub CommandButton1_Click()
Range("IV65536").value = sheets("sheet2").Range("A1").value
Range("IV65535").Value = sheets("sheet3").Range("C1").value
Range("C1").Value = Range("IV65536").Value + Range("IV65535").Value
Range("IV65535").ClearContents
Range("IV65536").ClearContents
 
End Sub
 
Upvote 0
Anh chị cho em hỏi một vài ý nghĩa trong câu lệnh VBA này với

Private Sub CommandButton1_Click()
Dim mark As Integer
Dim grade As String
Randomize Timer
mark = Int(Rnd * 100)
Cells(1, 1).Value = mark
If mark < 20 And mark >= 0 Then
grade = "F"
Cells(2, 1).Value = grade
ElseIf mark < 30 And mark >= 20 Then
grade = "E"
Cells(2, 1).Value = grade
ElseIf mark < 40 And mark >= 30 Then
grade = "D"
Cells(2, 1).Value = grade
ElseIf mark < 50 And mark >= 40 Then
grade = "C-"

Cells(2, 1).Value = grade
ElseIf mark < 60 And mark >= 50 Then
grade = "C"
Cells(2, 1).Value = grade
ElseIf mark < 70 And mark >= 60 Then
grade = "C+"
Cells(2, 1).Value = grade
ElseIf mark < 80 And mark >= 70 Then
grade = "B"
Cells(2, 1).Value = grade
ElseIf mark <= 100 And mark > -80 Then
grade = "A"
Cells(2, 1).Value = grade
End If
End Sub



Anh chị có thể cho em hỏi " ý nghĩa của Randomize Timer và Int(Rnd*100) được không ah,

Thanks các anh chị nhiều
 
Upvote 0
Randomize: Khởi dộng bộ tạo số ngẫu nhiên;

(Sau khi được khởi động) hàm Rnd() sẽ cho ta số ngẫu tứ 0 cho đến dưới 1 kiểu Double; Nếu đem số này nhân với 100 & lấy fần nguyên của tích (dòng lệnh 2) ta sẽ được 1 số ngẫu nhiên từ 0 cho đến 99.
 
Upvote 0
Em đang thử nghiệm chèn sheet với đoạn code này với 1 workbook mới toanh
PHP:
Sub insersheet()
Sheets.Add , Sheets(3), 3
End Sub
Nếu ta chạy code Lần đầu thì nó sẽ chèn 3 sheet mới vào sau sheet3 nhưng nếu ta chạy lần sao thì nó sẽ chèn tiếp 3 sheet mới vào sau sheet3 nữa. Vậy làm sao để khi ta chạy đoạn code này vào lần sau nó sẽ chèn 3 sheet mới vào sau sheet6 được. Em không biết làm sao đổi chỗ sheets(3) được. Thanks
 
Upvote 0
Sửa Sheets(3) thành Sheets(Sheets.Count) thử xem
 
Upvote 0
Vậy nếu em muốn đổi tên 3 sheet mới chèn vào mà tiếp theo các tên sheet đã tồn tại trong workbook thì em dùng code này
PHP:
Sub insertchange()
Dim i As Long
Sheets.Add , Sheets(Sheets.Count), 3
For i = 1 To Sheets.Count
Sheets(i).Name = "Data" & i
Next i
End Sub
Mà cái này thì em thấy dùng phí quá tại mình chỉ muốn đổi 3 tên sheet tiếp theo thôi mà đâu cần chạy hết các sheet đâu?? Em không biết giải quyết thế nào? Mong ACE giúp đỡ. Thanks
 
Upvote 0
Vậy nếu em muốn đổi tên 3 sheet mới chèn vào mà tiếp theo các tên sheet đã tồn tại trong workbook thì em dùng code này
PHP:
Sub insertchange()
Dim i As Long
Sheets.Add , Sheets(Sheets.Count), 3
For i = 1 To Sheets.Count
Sheets(i).Name = "Data" & i
Next i
End Sub
Mà cái này thì em thấy dùng phí quá tại mình chỉ muốn đổi 3 tên sheet tiếp theo thôi mà đâu cần chạy hết các sheet đâu?? Em không biết giải quyết thế nào? Mong ACE giúp đỡ. Thanks
Thì đúng là phí rồi còn gì! Add sheet nào thì đổi tên ngay lập tức cho nó khỏe
PHP:
Sub insertchange()
  Dim i As Long
  For i = 1 To 3
    Sheets.Add(, Sheets(Sheets.Count)).Name = "Data" & i
  Next i
End Sub
Lưu ý: Còn phải qua 1 công đoạn kiểm tra sự tồn tại của sheet trước khi Add, nếu không sẽ báo lỗi trùng tên
Vậy ta làm cho hoàn chỉnh thế này:
PHP:
Function SheetExist(WorkSheetName As String) As Boolean
  On Error Resume Next
  SheetExist = Not ThisWorkbook.Sheets(WorkSheetName) Is Nothing
End Function
PHP:
Sub insertchange()
  Dim i As Long
  For i = 1 To 3
    If Not SheetExist("Data" & i) Then
      Sheets.Add(, Sheets(Sheets.Count)).Name = "Data" & i
    End If
  Next i
End Sub
 
Upvote 0
PHP:
Sub insertchange()
  Dim i As Long
  For i = 1 To 3
    If Not SheetExist("Data" & i) Then
      Sheets.Add(, Sheets(Sheets.Count)).Name = "Data" & i
    End If
  Next i
End Sub
Code này chỉ có hiệu lực khi mình chạy lần đầu thôi, mà với 1 workbook mới thì 3 sheet mặc định của nó đâu có đổi tên đâu vẫn giữ nguyên sheet1,sheet2,sheet3 mới chết chứ. Ý em muốn là khi chạy code thì sheet1, sheet2,sheet3,sheet4,sheet5,sheet6 được đổi tên là lược là Data1,....Data6. Nếu mình add thềm 3 sheet nữa thì được nối tiếp tên là Data7,8,9 cứ như vậy tiếp tục đó anh. Thanks
 
Upvote 0
Code này chỉ có hiệu lực khi mình chạy lần đầu thôi, mà với 1 workbook mới thì 3 sheet mặc định của nó đâu có đổi tên đâu vẫn giữ nguyên sheet1,sheet2,sheet3 mới chết chứ. Ý em muốn là khi chạy code thì sheet1, sheet2,sheet3,sheet4,sheet5,sheet6 được đổi tên là lược là Data1,....Data6. Nếu mình add thềm 3 sheet nữa thì được nối tiếp tên là Data7,8,9 cứ như vậy tiếp tục đó anh. Thanks
Thế sao không nói sớm:
PHP:
Function SheetExist(WorkSheetName As String) As Boolean
  On Error Resume Next
  SheetExist = Not ThisWorkbook.Sheets(WorkSheetName) Is Nothing
End Function
PHP:
Sub insertchange()
  Dim i As Long
  Sheets.Add , Sheets(Sheets.Count)
  Do
    i = i + 1
    If Not SheetExist("Data" & i) Then Sheets(i).Name = "Data" & i
  Loop Until i = Sheets.Count
End Sub
 
Upvote 0
Thế sao không nói sớm:
PHP:
Sub insertchange()
  Dim i As Long
  Sheets.Add , Sheets(Sheets.Count)
  Do
    i = i + 1
    If Not SheetExist("Data" & i) Then Sheets(i).Name = "Data" & i
  Loop Until i = Sheets.Count
End Sub
Vậy nó cũng giống lệnh For next phải không anh NDU vì em thấy nó cũng duyệt quá hết các sheet không biết có phải không???
 
Upvote 0
Vậy nó cũng giống lệnh For next phải không anh NDU vì em thấy nó cũng duyệt quá hết các sheet không biết có phải không???
Cũng là vòng lập nhưng code của tôi không hẳn là duyệt qua các sheet đâu
- Đầu tiên tăng i lên 1 (ban đâu chưa có gì thì i = 0)
- Tiếp theo xem cái tên Data & i có tồn tại không
- Nếu không tồn tại thì đặt tên
(nếu tồn tại thì chẳng làm gì và... đi tiếp)
Chính vì lẽ đó, tuy duyệt qua các sheet nhưng thực thi công việc chỉ 1 lần duy nhất khi nó phát hiện tên Data & i không tồn tai ---> Khác với cách của bạn là duyệt qua các sheet và sheet nào cũng đặt tên ---> Đây chính là giải thuật để tăng tốc (không làm chuyện thừa)
 
Upvote 0
Chính vì lẽ đó, tuy duyệt qua các sheet nhưng thực thi công việc chỉ 1 lần duy nhất khi nó phát hiện tên Data & i không tồn tai ---> Khác với cách của bạn là duyệt qua các sheet và sheet nào cũng đặt tên ---> Đây chính là giải thuật để tăng tốc (không làm chuyện thừa)
Dạ nhờ anh giải thích em mới hiểu, em thích nhứt là cái function đó, mà mình có thể "chơi" trực tiếp cái function vào đây không anh? Mà em nghĩ nó không hay hen???
 
Upvote 0
Dạ nhờ anh giải thích em mới hiểu, em thích nhứt là cái function đó, mà mình có thể "chơi" trực tiếp cái function vào đây không anh? Mà em nghĩ nó không hay hen???
Đừng tưởng cái Function ấy ngắn chỉ 2 dòng rồi nghĩ mang nó gộp vào code chính là ngon đâu nha! Sẽ rắc rối cho bạn dài dài vì phải bẩy lỗi, trong khi chỉ cần bẩy lỗi duy nhất 1 lần trong Function là đủ (tức giao việc "nặng nhọc" cho 1 thằng lãnh)
Cứ thử xem là biết chứ gì
 
Upvote 0
Xin chào đại gia đinh GPE! Đầu tiên xin gửi lời cảm ơn Chân thành tới tất cả mọi người.Tôi cũng mới tìm hiểu về VBA để nhằm mục đích phục vụ tốt hơn cho công việc của mình.Vì không học lập trình nên rất mong được mọi người giúp đỡ. Xin chân thành cảm ơn!
 
Upvote 0
Web KT
Back
Top Bottom