Bài tập về vòng lặp và Msgbox VBA???

  • Thread starter Thread starter Quy Vu
  • Ngày gửi Ngày gửi
Liên hệ QC

Quy Vu

Thành viên chính thức
Tham gia
4/8/17
Bài viết
65
Được thích
4
Giới tính
Nam
Xin chào các anh chị!
Em lại có một bài tập nữa mà mò mẫm hơn một tiếng rồi vẫn chưa ra, lên mang lên đây hỏi các anh/chị
Trước khi vào bài, em muốn hỏi một vài câu hỏi như sau
1. a = range("A2") và Set a = range("A2") có gì khác nhau ạ ?? a= range("A2") có thể sử dụng như nào ( giống như kiểu a=range("A2") thì sẽ gán giá trị trong ô A2 với a)
2. range("A2").value liệu có giống set a=range("A2") ???
Đề bài như sau:
Cho một bảng như hình, yêu cầu như sau:
1545123101449.png
Chọn ô A2, dùng vòng lặp để hiện thị các giá trị trong cột A nếu giá trị tương ứng ở dòng cột C là Wood
kết quả thu được như ảnh
1545123167331.png
Em có code như sau nhưng k thể thỏa mãn được yêu cầu bài ra, không tim được ô ở cột A tương ứng sang ô cột C có giá trị "Wood"
Mã:
Sub baitap14()
Dim firstcell As Object
Dim nextcell As Object
Range("A2").Select
Set firstcell = Range("A2")
Do Until IsEmpty(Selection.Value)
If Selection.Offset(0, 3).Value = "Wood" Then
MsgBox "The only wooden rollercoasters in the list are:" & Selection.Value
Else
Selection.Offset(1, 0).Select
End If
Loop

End Sub
 

File đính kèm

anh chị nào biết giải giúp em với ạ? :(
 
Upvote 0
dùng vòng lặp để hiện thị các giá trị trong cột A nếu giá trị tương ứng ở dòng cột C là Wood
kết quả thu được như ảnh
PHP:
Public Sub s_Gpe()
Dim sArr(), I As Long, R As Long, Txt As String
sArr = Range("A2", Range("A2").End(xlDown)).Resize(, 3).Value
R = UBound(sArr)
For I = 1 To R
    If sArr(I, 3) = "Wood" Then Txt = Txt & sArr(I, 1) & ChrW(10)
Next I
MsgBox "xxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyy:" & ChrW(10) & ChrW(10) & Txt, , "GiaiphapExcel.com"
End Sub
 
Upvote 0
Trong lập trình hướng đối tượng của VB có khái niệm Default property (cũng mười mấy năm rồi nên không nhớ rõ lắm).
Có thể hiểu là default property là cái thuộc tính mặc nhiên của object khi mà object dùng ở vị trí không phải class của nó.
Ví dụ:
Class Range có default property là Value

a = Range("A2") ' [1] Viết đầy đủ a = Range("A2").Value
Range("A2") = 8 ' [2] Viết đầy đủ Range("A2").Value = a
Range("A2")= Range("C2")' [3] Viết đầy đủ Range("A2").Value = Range("C2").Value

Default property được dùng cho một property hay dùng nhất của class và giúp tiết kiệm công viết code. Có lẽ đây là điểm độc đáo duy nhất có trên lập trình hướng đối tượng VB so với các ngôn ngữ phổ biến khác.

Tuy nhiên nó cũng phát sinh vấn đề là có khi chúng ta muốn nói đến cả object chứ không phải cái "default property" của object đó thì sẽ như thế nào? Lúc này chúng ta cần đến từ khóa Set.

Range("C2") = 2 ' Gán Value là 2
Dim rr As Range
Set rr = Range("C2") ' khẳng định muốn lấy object từ Range("C2") chứ không phải Value (default value).
MsgBox rr ' Kết quả hiện thì là 2

Việc có hoặc thiếu Set có thể cho ra 2 kết quả khác nhau và lúc này "default property" có thể là cái bẫy debug.

Trình độ nửa mùa nên cũng chỉ có mấý ý như vậy.
 
Lần chỉnh sửa cuối:
Upvote 0
Kiểu Object trong VBA là loại chiếu, khác với các kiểu căn bản khác là loại trị.
VBA xác định rằng gán kiểu chiếu cho biến thì dùng lệnh Set.
Khi dùng cho range thì Set là lệnh gán range, không có Set thì là gán trị của range.
(thực ra hòi xưa BASIC có lệnh Let là lệnh gán trị. Nhưng về sau này ngừoi ta bỏ nó đi vì thấy không cần)
 
Upvote 0
Trong lập trình hướng đối tượng của VB có khái niệm Default property (cũng mười mấy năm rồi nên không nhớ rõ lắm).
Có thể hiểu là default property là cái thuộc tính mặc nhiên của object khi mà object dùng ở vị trí không phải class của nó.
Ví dụ:
Class Range có default property là Value

a = Range("A2") ' [1] Viết đầy đủ a = Range("A2").Value
Range("A2") = 8 ' [2] Viết đầy đủ Range("A2").Value = a
Range("A2")= Range("C2")' [3] Viết đầy đủ Range("A2").Value = Range("C2").Value

Default property được dùng cho một property hay dùng nhất của class và giúp tiết kiệm công viết code. Có lẽ đây là điểm độc đáo duy nhất có trên lập trình hướng đối tượng VB so với các ngôn ngữ phổ biến khác.

Tuy nhiên nó cũng phát sinh vấn đề là có khi chúng ta muốn nói đến cả object chứ không phải cái "default property" của object đó thì sẽ như thế nào? Lúc này chúng ta cần đến từ khóa Set.

Range("C2") = 2 ' Gán Value là 2
Dim rr As Range
Set rr = Range("C2") ' khẳng định muốn lấy object từ Range("C2") chứ không phải Value (default value).
MsgBox rr ' Kết quả hiện thì là 2

Việc có hoặc thiếu Set có thể cho ra 2 kết quả khác nhau và lúc này "default property" có thể là cái bẫy debug.

Trình độ nửa mùa nên cũng chỉ có mấý ý như vậy.
Cám ơn bác, e đã hiểu được một phần r ạ, nhưng mà nếu lấy có Set thì sẽ lấy cả Object thì sẽ lấy những gì ạ?
Ở trên e thấy một bác viết dòng code như này:
Mã:
ublic Sub s_Gpe()
Dim sArr(), I As Long, R As Long, Txt As String
sArr = Range("A2", Range("A2").End(xlDown)).Resize(, 3).Value
R = UBound(sArr)
For I = 1 To R
    If sArr(I, 3) = "Wood" Then Txt = Txt & sArr(I, 1) & ChrW(10)
Next I
MsgBox "xxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyy:" & ChrW(10) & ChrW(10) & Txt, , "GiaiphapExcel.com"
End Sub
Thì cái chỗ sArr = Range("A2", Range("A2").End(xlDown)).Resize(, 3).Value thì tức là sArr là một mảng đúng k ạ, mảng này có n dòng và 3 cột phải k ạ, muốn xác định vị tri trong mảng thì dùng sArr(i,j)??
 
Upvote 0
Cám ơn bác, e đã hiểu được một phần r ạ, nhưng mà nếu lấy có Set thì sẽ lấy cả Object thì sẽ lấy những gì ạ?
Ở trên e thấy một bác viết dòng code như này:
Mã:
ublic Sub s_Gpe()
Dim sArr(), I As Long, R As Long, Txt As String
sArr = Range("A2", Range("A2").End(xlDown)).Resize(, 3).Value
R = UBound(sArr)
For I = 1 To R
    If sArr(I, 3) = "Wood" Then Txt = Txt & sArr(I, 1) & ChrW(10)
Next I
MsgBox "xxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyy:" & ChrW(10) & ChrW(10) & Txt, , "GiaiphapExcel.com"
End Sub
Thì cái chỗ sArr = Range("A2", Range("A2").End(xlDown)).Resize(, 3).Value thì tức là sArr là một mảng đúng k ạ, mảng này có n dòng và 3 cột phải k ạ, muốn xác định vị tri trong mảng thì dùng sArr(i,j)??
Mảng nó xác định bằng chiều của mảng nhé bạn.
 
Upvote 0
Nói chuyện lập trình với tôi thì chừa hẳn ba cái mới e k r ra.
Những từ đó trong lập trình là các biến dùng để đếm.
 
Upvote 0
Chủ bài đăng thử chạy macro này & kiểm tra ên đi nha:
PHP:
Sub BaiTapHienThiTriCotATuongUng()
 Dim Rws As Long
 Dim Rng As Range, sRng As Range
 Dim MyAdd As String
 
 Rws = [C1].CurrentRegion.Rows.Count
 Set Rng = [C1].Resize(Rws)
 Set sRng = Rng.Find("Wood", , xlFormulas, xlWhole)
 If sRng Is Nothing Then
    MsgBox "Nothing"
 Else
    MyAdd = sRng.Address
    Do
        MsgBox sRng.Offset(, -2).Value, , "Dòng: " & sRng.Row
        Set sRng = Rng.FindNext(sRng)
    Loop While sRng.Address <> MyAdd
 End If
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom