Nhờ các thày dạy VBA bằng ví dụ đơn giản nhất

Liên hệ QC

Dauthivan

Thành viên tiêu biểu
Tham gia
15/8/08
Bài viết
565
Được thích
327
Em muốn tiếp cận VBA từ những ví dụ đơn giản nhất. Do em chưa biết gì, xin mọi người chỉ giúp em với ah
Bài toán của em là em có dữ liệu 2 cột A và B.
Yêu cầu đặt ra là nếu dòng nào mà thoả mãn giá trị cả 2 cột A và B đều dương (>0) thì VBA sẽ tự động điền công thức cho 2 cột đó nhân với nhau.

Em xin làm mẫu ô C7 để mọi người dễ hình dung
 

File đính kèm

Thật ngại, khi đưa ra bài trả lời này!

PHP:
Option Explicit
Sub Macro1()
 Dim Dd As Long, Dc As Long, Dg As Long, Rng As Range, Cls As Range
     
 If [a1].Value <> "" Or [b1].Value <> "" Then
   Dd = 1
 Else
   If [a1].End(xlDown).Row <= [b1].End(xlDown).Row Then
      Dd = [a1].End(xlDown).Row
   Else
      Dd = [b1].End(xlDown).Row
   End If
 End If
 Dg = Cells.Rows.Count
 If Cells(Dg, "A").End(xlUp).Row >= Cells(Dg, "B").End(xlUp).Row Then
   Dc = Cells(Dg, "A").End(xlUp).Row
 Else
   Dc = Cells(Dg, "B").End(xlUp).Row
 End If
 For Each Cls In Range(Cells(Dd, "A"), Cells(Dc, "A"))
   If Cls.Value > 0 And Cls.Offset(, 1).Value > 0 Then
      Cls.Offset(, 2).FormulaR1C1 = "=RC[-2]*RC[-1]"
   End If
 Next Cls
End Sub
 
Upvote 0
Mình không rõ bạn muốn tiếp cận thế nào nên mình chỉ làm đơn giản như thế này thôi. Mình nghĩ bạn nên mua sách VBA về học sẽ hiểu rõ hơn

Mã:
Sub thunghiem()
Dim i As Integer, a As Integer, b As Integer
For i = 7 To 12
    a = Sheet1.Range("A" & i).Value
    b = Sheet1.Range("B" & i).Value
    If a > 0 And b > 0 Then Sheet1.Range("c" & i).Value = a * b
Next i
End Sub
 
Upvote 0
Em muốn tiếp cận VBA từ những ví dụ đơn giản nhất. Do em chưa biết gì, xin mọi người chỉ giúp em với ah
Bài toán của em là em có dữ liệu 2 cột A và B.
Yêu cầu đặt ra là nếu dòng nào mà thoả mãn giá trị cả 2 cột A và B đều dương (>0) thì VBA sẽ tự động điền công thức cho 2 cột đó nhân với nhau.


Em xin làm mẫu ô C7 để mọi người dễ hình dung
Thử một Sub đơn giản này coi:
PHP:
Sub DonGian()
Dim Clls As Range
For Each Clls In [A7:A12]
    If Clls.Value > 0 And Clls.Offset(, 1).Value > 0 Then
    Clls.Offset(, 2).FormulaR1C1 = "=RC[-2]*RC[-1]"
    End If
Next
End Sub
 
Upvote 0
Em lại hay làm thế này:
Sub tinh()
Dim rng As Range
For Each rng In Range("a7", Range("a1000").End(xlUp))
If rng.Value > 0 And rng.Offset(, 1).Value > 0 Then
rng.Offset(, 2).Value = rng.Value * rng.Offset(, 1).Value
Else
End If
Next
End Sub
Em nghĩ Anh nên thay lại tiêu đề một chút, như vậy bọn em xem nếu giải quyết được thì đỡ ngại hơn ạ. Vừa học vừa trao đổi.
 
Lần chỉnh sửa cuối:
Upvote 0
Code không dùng vòng lặp
Mã:
Sub TinhNhan()
 [a:a].SpecialCells(2).Offset(, 1).SpecialCells(2).Offset(, 1) = "=RC[-2]*RC[-1]"
End Sub
 
Upvote 0
PHP:
Option Explicit
Sub Macro1()
 Dim Dd As Long, Dc As Long, Dg As Long, Rng As Range, Cls As Range
     
 If [a1].Value <> "" Or [b1].Value <> "" Then
   Dd = 1
 Else
   If [a1].End(xlDown).Row <= [b1].End(xlDown).Row Then
      Dd = [a1].End(xlDown).Row
   Else
      Dd = [b1].End(xlDown).Row
   End If
 End If
 Dg = Cells.Rows.Count
 If Cells(Dg, "A").End(xlUp).Row >= Cells(Dg, "B").End(xlUp).Row Then
   Dc = Cells(Dg, "A").End(xlUp).Row
 Else
   Dc = Cells(Dg, "B").End(xlUp).Row
 End If
 For Each Cls In Range(Cells(Dd, "A"), Cells(Dc, "A"))
   If Cls.Value > 0 And Cls.Offset(, 1).Value > 0 Then
      Cls.Offset(, 2).FormulaR1C1 = "=RC[-2]*RC[-1]"
   End If
 Next Cls
End Sub

Thưa thày, phải chăng tình huống em đưa ra quá dễ hay là không thực tế lắm.
Vì em chưa thạo nên chưa biết phải bắt đầu từ đâu, đành thử nghiên cứu ví dụ này xem thế nào.
 
Upvote 0
Thưa thày, phải chăng tình huống em đưa ra quá dễ hay là không thực tế lắm.
Vì em chưa thạo nên chưa biết phải bắt đầu từ đâu, đành thử nghiên cứu ví dụ này xem thế nào.
Bạn cứ suy nghĩ xem nếu phải làm bằng tay, tự gõ công thức vào bảng tính thì bạn sẽ gõ công thức gì?
Nếu bạn làm được bằng tay thì cứ record macro quá trình là ra ngay code thôi
 
Upvote 0
Bạn cứ suy nghĩ xem nếu phải làm bằng tay, tự gõ công thức vào bảng tính thì bạn sẽ gõ công thức gì?
Nếu bạn làm được bằng tay thì cứ record macro quá trình là ra ngay code thôi
Em cũng đã ghi thử, nhưng Macro thì không thể nào thực hiện được các thao tác em cần làm quen như If..then và For...next nên em mới phải gửi bài lên.
 
Upvote 0
Em cũng đã ghi thử, nhưng Macro thì không thể nào thực hiện được các thao tác em cần làm quen như If..then và For...next nên em mới phải gửi bài lên.
Rốt lại chẳng biết bạn muốn gì, hơn 6 bài trả lời bạn trong topic này không biết bạn đã "học" được điều gì với topic bạn đã tạo ra. Bao nhiêu ý kiến "gợi ý" cho bạn mà Bạn chẳng có "đáp từ" gì cho mỗi bài trả lời, bài nào đúng ý, bài nào không đúng ý... cũng chả biết, như vậy thì học tập được cái g?
Tiêu đề là "Nhờ các thày..." đã hơi bị ngại, liều mạng có một ý kiến thì chẳng biết người nghe có "đáp từ" gì về "tâm huyết" của mình hay không, chỉ thấy những bài bài phát biểu chung chung.
Hình như chỉ có bài của HYen17Ndu... là có chút "lưu luyến"...
Híc! Kyo, Khoavu87, TrungChinhs...
Chắc phải "Bye!" topic này thôi.
Hic nữa... Cò ơi!
 
Lần chỉnh sửa cuối:
Upvote 0
Rốt lại chẳng biết bạn muốn gì, hơn 6 bài trả lời bạn trong topic này không biết bạn đã "học" được điều gì với topic bạn đã tạo ra. Bao nhiêu ý kiến "gợi ý" cho bạn mà Bạn chẳng có "đáp từ" gì cho mỗi bài trả lời, bài nào đúng ý, bài nào không đúng ý... cũng chả biết, như vậy thì học tập được cái g?
Tiêu đề là "Nhờ các thày..." đã hơi bị ngại, liều mạng có một ý kiến thì chẳng biết người nghe có "đáp từ" gì về "tâm huyết" của mình hay không, chỉ thấy những bài bài phát biểu chung chung.
Hình như chỉ có bài của HYen17Ndu... là có chút "lưu luyến"...
Híc! Kyo, Khoavu87, TrungChinhs...
Chắc phải "Bye!" topic này thôi.
Hic nữa... Cò ơi!
Khả năng là bạn í muốn thực tập vòng lặp For....Next & Gán công tức vào cột C (gán công thức và tính chứ không phải chỉ tính ra kết quả thôi)
Nếu trúng thì làm thế này, còn trật thì mình lại.....Híc zí Ba Tê
Public Sub ToTiTe()
Dim Cll As Range
For Each Cll In [A7:A12]
If Cll > 0 And Cll.Offset(, 1) > 0 Then
Cll.Offset(, 2).Formula = "=" & Cll.Address & "*" & Cll.Offset(, 1).Address
End If
Next Cll
End Sub
Trong bài sử dụng For Each...Next, nếu muốn sử dụng For....Next thì viết thế này:
Public Sub TeTiTo()
Dim I As Long, Vung As Range
Set Vung = Range([A7], [A1000].End(xlUp))
For I = 1 To Vung.Rows.Count
If Vung(I) > 0 And Vung(I).Offset(, 1) > 0 Then
Vung(I).Offset(, 2).Formula = "=" & Vung(I).Address & "*" & Vung(I).Offset(, 1).Address
End If
Next I
End Sub
Thân
 

File đính kèm

Upvote 0
Em cũng đã ghi thử, nhưng Macro thì không thể nào thực hiện được các thao tác em cần làm quen như If..then và For...next nên em mới phải gửi bài lên.
Cái gì làm được bằng tay thì có thể ghi lại bằng record macro
Cái gì không thể làm bằng tay, chẳng hạn For... Next thì.. HỌC
Để hiểu về For.. Next, đã có 1 topic cơ bản rồi còn gì, nó là cái này:
http://www.giaiphapexcel.com/forum/showthread.php?6354-Giới-thiệu-Cơ-bản-về-vòng-lặp-For-.-.-.-next
 
Upvote 0
Rốt lại chẳng biết bạn muốn gì, hơn 6 bài trả lời bạn trong topic này không biết bạn đã "học" được điều gì với topic bạn đã tạo ra. Bao nhiêu ý kiến "gợi ý" cho bạn mà Bạn chẳng có "đáp từ" gì cho mỗi bài trả lời, bài nào đúng ý, bài nào không đúng ý... cũng chả biết, như vậy thì học tập được cái g?
Tiêu đề là "Nhờ các thày..." đã hơi bị ngại, liều mạng có một ý kiến thì chẳng biết người nghe có "đáp từ" gì về "tâm huyết" của mình hay không, chỉ thấy những bài bài phát biểu chung chung.
Hình như chỉ có bài của HYen17Ndu... là có chút "lưu luyến"...
Híc! Kyo, Khoavu87, TrungChinhs...
Chắc phải "Bye!" topic này thôi.
Hic nữa... Cò ơi!

Em cảm ơn các thày, bởi do em chưa bao giờ tiếp cận với VBA nên em có lúng túng khi tiếp cận vấn đề. Các bài toán các thày giúp em, bản thân em chưa hỉểu được ngay lúc ấy; em đã tải về nghiên cứu kết hợp với các tài liệu lý thuyết em mới có thể hiểu được. Mục đích của em là em đang cần hình dung mấy cái trò nó nhảy ra sao tức là câu lệnh Next... For mà Macro không thể hiện được.

Em rất biết ơn các thày đã giúp em, chỉ bởi tại em chưa hiểu ngay được nên em chưa hồi âm được ah.
Cũng bởi do sư phụ HYến có nói ngại khi trả lời bài này nên em nghĩ rằng hay là bài toán của em đặt ra tình huống buồn cười quá chăng? Lần sau em sẽ rút kinh nghiệm khi hỏi phải rõ ràng hơn.
Một lần nữa em xin cảm ơn tấm lòng của các thày rất nhiều, có gì em không hiểu được em xin mong được các thày chỉ bảo.
 
Upvote 0
Theo tôi nghĩ thì "sư phụ HYen" nói ngại, là ngại cái tiêu đề. Bác ấy sẵn lòng trả lời mọi câu hỏi từ căn bản nhất đến khó khăn nhất. Nhưng lại ngại cái tiêu đề.

Tiêu đề là "nhờ các thày". Một số người ngại trả lời vì bản thân mình không phải là "thày" đúng nghĩa. Họ sợ rằng khi trả lời 1 câu hỏi gởi rõ ràng cho "các thày", mà mình trả lời, té ra mình tự nhận là thày sao? Cá nhân tôi không trả lời topic này cũng vì lý do đó.

Các bạn có thể nói là phải "tôn sư trọng đạo", là "nhất tự vi sư", ... nhưng không ai để ý đến chuyện người "bị" gọi là thầy đó có ý kiến thế nào.

Ý kiến của bản thân tôi thì như sau:

Một khi đã nhận làm thầy 1 người nào, tôi tự thấy có trách nhiệm hướng dẫn, giải thích, theo dõi từng bước sự tiến bộ của người đó.
Mỗi khi có bài viết hay, phù hợp trình độ của họ, tôi sẽ đưa link cho họ đọc
Tôi sẽ truyền lại những kinh nghiệm, thủ thuật, giải thích cả phương pháp tư duy logic của tôi cho họ, phân tích các phương pháp tư duy khác nhau của các cao thủ khác cho họ.
Ngoài ra, trong cuộc sống hàng ngày, tôi có thể chia sẻ, động viên họ về cuộc sống, tình cảm, nghề nghiệp, cả cách đối nhân xử thế (kiểu chết tiệt)

Ngược lại, nếu tôi cảm thấy không thể làm tròn cái trách nhiệm đó, tôi sẽ không dám tự nhận là thày. Tôi cho rằng đó cũng là lý do mà Bác HYen ngại khi trả lời topic này.
 
Upvote 0
Thử một Sub đơn giản này coi:
PHP:
Sub DonGian()
Dim Clls As Range
For Each Clls In [A7:A12]
    If Clls.Value > 0 And Clls.Offset(, 1).Value > 0 Then
    Clls.Offset(, 2).FormulaR1C1 = "=RC[-2]*RC[-1]"
    End If
Next
End Sub
Em thắc mắc là nếu bỏ từ Value đi trong đoạn trên thì vấn đề có khác không, vì em thấy bỏ đi kết quả vẫn được mà, cụ thể nếu bỏ đi thì code sẽ như sau ah:
PHP:
Sub DonGian()
Dim Clls As Range
For Each Clls In [A7:A12]
    If Clls > 0 And Clls.Offset(, 1) > 0 Then
    Clls.Offset(, 2).FormulaR1C1 = "=RC[-2]*RC[-1]"
    End If
Next
End Sub
 
Upvote 0
Public Sub TeTiTo()
Dim I As Long, Vung As Range
Set Vung = Range([A7], [A1000].End(xlUp))
For I = 1 To Vung.Rows.Count
If Vung(I) > 0 And Vung(I).Offset(, 1) > 0 Then
Vung(I).Offset(, 2).Formula = "=" & Vung(I).Address & "*" & Vung(I).Offset(, 1).Address
End If
Next I
End Sub
Trong Code trên thày dùng Address nó ra tham chiếu tuyệt đối, nay em muốn tham chiếu tương đối thì phải làm thế nào ah.
 
Upvote 0
/-)ương nhiên là khác rồi, không ít thì nhiều

Bạn xem 2 câu này nha:

Ê, Lấy cái xe đạp mà đi cho lẹ! (trường hợp có Value)
& câu

Hãy lấy cái xe trong góc nhà mà đi cho lẹ! (Trường hợp kia)
(Khi đang trong góc nhà là cái xe đạp, còn giữa nhà là cái xe máy.)
 
Lần chỉnh sửa cuối:
Upvote 0
Theo tôi nghĩ thì "sư phụ HYen" nói ngại, là ngại cái tiêu đề. Bác ấy sẵn lòng trả lời mọi câu hỏi từ căn bản nhất đến khó khăn nhất. Nhưng lại ngại cái tiêu đề.

Tiêu đề là "nhờ các thày". Một số người ngại trả lời vì bản thân mình không phải là "thày" đúng nghĩa. Họ sợ rằng khi trả lời 1 câu hỏi gởi rõ ràng cho "các thày", mà mình trả lời, té ra mình tự nhận là thày sao? Cá nhân tôi không trả lời topic này cũng vì lý do đó.

Các bạn có thể nói là phải "tôn sư trọng đạo", là "nhất tự vi sư", ... nhưng không ai để ý đến chuyện người "bị" gọi là thầy đó có ý kiến thế nào.

Ý kiến của bản thân tôi thì như sau:

Một khi đã nhận làm thầy 1 người nào, tôi tự thấy có trách nhiệm hướng dẫn, giải thích, theo dõi từng bước sự tiến bộ của người đó.
Mỗi khi có bài viết hay, phù hợp trình độ của họ, tôi sẽ đưa link cho họ đọc
Tôi sẽ truyền lại những kinh nghiệm, thủ thuật, giải thích cả phương pháp tư duy logic của tôi cho họ, phân tích các phương pháp tư duy khác nhau của các cao thủ khác cho họ.
Ngoài ra, trong cuộc sống hàng ngày, tôi có thể chia sẻ, động viên họ về cuộc sống, tình cảm, nghề nghiệp, cả cách đối nhân xử thế (kiểu chết tiệt)

Ngược lại, nếu tôi cảm thấy không thể làm tròn cái trách nhiệm đó, tôi sẽ không dám tự nhận là thày. Tôi cho rằng đó cũng là lý do mà Bác HYen ngại khi trả lời topic này.
Em rất ngưỡng mộ những lời tâm sự bày tỏ xâu sắc của Thầy!
Đâu cứ phải là gặp nhau ở Trường lớp thì mới gọi là Thầy trò. Tuy em và Thầy chưa gặp nhau và không biết là em có duyên được gặp Thầy hay không nhưng em vẫn gọi Thầy và một số vị khác là thầy đặc biệt là thầy ndu96081631,Nguyễn Duy Tuân,Trần Thanh Phong... hì. Bời vì trong lĩnh vực Tin học nói chung và nhất là trong lĩnh vực Exel nói riêng các Thầy luôn thể hiện được sự vượt trội của mình về sự hiểu biết và sự truyền đạt một cách nhiệt tình.
Càng đọc những bài viết của các thầy em có cảm giác mình càng bị lôi cuốn vào vấn đề.Có thể nói những gì các thầy thể hiện trên GPE này khác hẳn những vị thầy khác mà em đã từng được học ở trường lớp.
Đến với GPE em không thể ngờ được mọi cái đều có thể. Thật sự là vượt quá sự tưởng tượng của em.Trên cả tuyệt vời,... có thể nói không có một ngòi bút nào có thể viết lên một bài báo thể hiện được toàn bộ được những gì đang diễn ra ở GPE: sức lôi cuốn,sự nhiệt tình, những giải pháp hay,các tuyệt chiêu bất hủ và những sự khó khăn thầm lặng....
Cầu chúc cho diễn đàn mình ngày một phát triển xuất hiện thêm nhiều hiền tài không dám như mà chỉ gần được như các Thầy.
Chúc các Thầy mọi việc tốt đẹp.
Xin trân thành cám Ơn GPE...Em không bao giờ quên được nơi này.

Àh nhân đây em cũng xin hỏi luôn vấn đề này vậy:
Hiện giờ công việc của em hàng ngày luôn phải tiếp xúc với Exel.
Thật sự Em thấy rất mệt mỏi đau đầu vì chưa biết gì về Exel cả.
Có thầy nào đang mở lớp kèm cặp học sinh hoặc biết địa chỉ nào tin cậy thì chỉ giúp em với.
Em sẽ có gắng thu xếp thời gian đến học...
Em ở Hà Nội-Cầu Thăng Long.
Một lần nữa xin cảm ơn.
 
Upvote 0
Em thắc mắc là nếu bỏ từ Value đi trong đoạn trên thì vấn đề có khác không, vì em thấy bỏ đi kết quả vẫn được mà, cụ thể nếu bỏ đi thì code sẽ như sau ah:
PHP:
Sub DonGian()
Dim Clls As Range
For Each Clls In [A7:A12]
    If Clls > 0 And Clls.Offset(, 1) > 0 Then
    Clls.Offset(, 2).FormulaR1C1 = "=RC[-2]*RC[-1]"
    End If
Next
End Sub
Với 1 cell đơn, nếu không nói Value thì cũng ngầm định là Value, vì thế bỏ cũng không có vấn đề. Tuy nhiên khuyên bạn nên học cách viết cho rõ ràng (vì ngoài .Value còn có .Text, 2 cái khác nhau)
Với 1 vùng nhiều hơn 1 cell, nếu không có .Value thì.. coi chừng
Ví dụ
PHP:
Sub Test()
  Range("C5:C15") = Range("A1:A11")
End Sub
Code trên nó... cóc chạy vì sẽ không hiểu bạn đang nói cái gì (là gán Range("A1:A11") vào Range("C5:C15") hay ý muốn so sánh)
Nên phải sửa thành vầy mới chạy:
PHP:
Sub Test()
  Range("C5:C15").Value = Range("A1:A11").Value
End Sub
--------------------------
Trong Code trên thày dùng Address nó ra tham chiếu tuyệt đối, nay em muốn tham chiếu tương đối thì phải làm thế nào ah.
Thí nghiệm với Address(0, 0) hoặc Address(0, 1)hoặc Address(1, 0) xem có khác gì nhau
Hoặc thí nghiệm với đoạn code đơn giản
PHP:
Sub Test()
  MsgBox Range("A1").Address
  MsgBox Range("A1").Address(0, 0)
  MsgBox Range("A1").Address(1, 0)
  MsgBox Range("A1").Address(0, 1)
End Sub
Lý ra bạn chỉ cần bôi đen chữ Address rồi bấm F1 sẽ có ngay câu trả lời rồi
 
Upvote 0
Ý kiến của bản thân tôi thì như sau:

Một khi đã nhận làm thầy 1 người nào, tôi tự thấy có trách nhiệm hướng dẫn, giải thích, theo dõi từng bước sự tiến bộ của người đó.
Mỗi khi có bài viết hay, phù hợp trình độ của họ, tôi sẽ đưa link cho họ đọc
Tôi sẽ truyền lại những kinh nghiệm, thủ thuật, giải thích cả phương pháp tư duy logic của tôi cho họ, phân tích các phương pháp tư duy khác nhau của các cao thủ khác cho họ.
Ngoài ra, trong cuộc sống hàng ngày, tôi có thể chia sẻ, động viên họ về cuộc sống, tình cảm, nghề nghiệp, cả cách đối nhân xử thế (kiểu chết tiệt)

Ngược lại, nếu tôi cảm thấy không thể làm tròn cái trách nhiệm đó, tôi sẽ không dám tự nhận là thày. Tôi cho rằng đó cũng là lý do mà Bác HYen ngại khi trả lời topic này.
---
Cảm ơn anh về bài viết tâm can và thấu đáo này (đúng là chêt tiệt -0-/.)
 
Upvote 0
Web KT

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

Back
Top Bottom