Cách duyệt qua các cell khi dùng lệnh For each .... Next (1 người xem)

Liên hệ QC

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

khuongvietphong

Be all you can be !
Tham gia
6/7/14
Bài viết
2,069
Được thích
1,444
Nghề nghiệp
Ăn không ngồi rồi ^.^
Mọi người cho em hỏi khi ta dùng câu lệnh For each...Next ví dụ: For each cll in rng ....Next cll với rng ở đây thí dụ là A1 : C5 thì VBA sẽ duyệt từ

trái qua phải trước rôi sau đó mới từ trên xuống dưới đúng không ạ, tức là nó sẽ duyệt từ ô A1 --> B1 --> C1 sau đó mới xuống ô A2

rồi tiếp tục.Bây giờ em muốn cho nó duyệt từ trên xuống dưới trước rồi mới từ trái qua phải tức là A1 --> A2 -->...--->A5 rồi mới sang B1 ... thì có

được không ạ.
 
Lần chỉnh sửa cuối:
Mọi người cho em hỏi khi ta dùng câu lệnh For each...Next ví dụ: For each cll in rng ....Next cll với rng ở đây thí dụ là A1 : C5 thì VBA sẽ duyệt từ

trái qua phải trước rôi sau đó mới từ trên xuống dưới đúng không ạ, tức là nó sẽ duyệt từ ô A1 --> B1 --> C1 sau đó mới xuống ô A2

rồi tiếp tục.Bây giờ em muốn cho nó duyệt từ trên xuống dưới trước rồi mới từ trái qua phải tức là A1 --> A2 -->...--->A5 rồi mới sang B1 ... thì có

được không ạ.
Chính xác nó duyệt từ A 1 đến B1 trong For each. Anh thử với Union trong For each vẫn duyệt như vậy, còn về 2 anh chưa thử với vòng lặp khác nên cũng ko rõ lắm là có làm được ko?
 
Upvote 0
Thì duyệt theo 2 vòng lặp (hàng hay cột)
Cái nào muốn duyệt trước thì để bên trong cái kia.
 
Upvote 0
Khi nào mà hơi nghi thì làm thí nghiệm. Bôi một vùng đen hình chữ nhậtm chạy đoạn code kiểu thế này:
[GPECODE=vb]Sub TestForNext
I=0
For Each Cell in Selection
I=I+1
Cell.Value=I
Next
End Sub[/GPECODE]
 
Upvote 0
Mọi người cho em hỏi khi ta dùng câu lệnh For each...Next ví dụ: For each cll in rng ....Next cll với rng ở đây thí dụ là A1 : C5 thì VBA sẽ duyệt từ

trái qua phải trước rôi sau đó mới từ trên xuống dưới đúng không ạ, tức là nó sẽ duyệt từ ô A1 --> B1 --> C1 sau đó mới xuống ô A2

rồi tiếp tục.Bây giờ em muốn cho nó duyệt từ trên xuống dưới trước rồi mới từ trái qua phải tức là A1 --> A2 -->...--->A5 rồi mới sang B1 ... thì có

được không ạ.
Bạn xem thử file sau .
 

File đính kèm

Upvote 0
Bạn cần duyệt như vậy để làm gì?
Nếu chỉ dùng 1 lần thì theo cách mọi người đã chỉ, dùng 2 vòng lặp.
Nếu chỉ muốn 1 vòng lặp thì dùng mọt con toán chuyển dổi chỉ số

Mã:
Sub tt()
Set rg = Range("a1:c5")
For i = 1 To rg.Cells.Count
rg.Cells(((i - 1) Mod rg.Rows.Count) + 1, (i - 1) \ rg.Rows.Count + 1) = i
Next i
End Sub

Con toán thứ nhất chuyển chỉ số i thành chỉ số dòng. Con táon thứ 2 chuyển i thành chỉ số cột.
 
Upvote 0
Chú thích cho lời giải trên:
Nếu muốn dùng for each cũng được, nhưng con táon chuyển chỉ số phức tạp hơn một chút
 
Upvote 0
Bạn cần duyệt như vậy để làm gì?
Nếu chỉ dùng 1 lần thì theo cách mọi người đã chỉ, dùng 2 vòng lặp.
Nếu chỉ muốn 1 vòng lặp thì dùng mọt con toán chuyển dổi chỉ số

Mã:
Sub tt()
Set rg = Range("a1:c5")
For i = 1 To rg.Cells.Count
rg.Cells(((i - 1) Mod rg.Rows.Count) + 1, (i - 1) \ rg.Rows.Count + 1) = i
Next i
End Sub

Con toán thứ nhất chuyển chỉ số i thành chỉ số dòng. Con táon thứ 2 chuyển i thành chỉ số cột.
Cảm ơn anh, em nghĩ đây mới là cái tác giả cần hỏi, chứ ko phải cách dùng 2 vòng lặp
P/s: cũng là cái em muốn hỏi khi Phong đưa đề tài ra, có thể hỏi để chơi xem có làm được ko. Trên em ghi sai chính tả, vế 2 (em ko biết) chứ em ko muốn nói đến cách dùng về 2 vòng lặp
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh, em nghĩ đây mới là cái tác giả cần hỏi, chứ ko phải cách dùng 2 vòng lặp

Dù là 2 vòng lập hay 1 vòng lập thì SỐ LẦN LẬP là như nhau. Vậy cứ dùng 2 vòng lập đi cho nó đơn giản. Cố "ép" cho thành 1 vòng lập rồi cộng trừ nhân chia tùm lum cho nó tồn tài nguyên chứ chẳng ngon lành gì đâu mà ham --=0
 
Upvote 0
Dù là 2 vòng lập hay 1 vòng lập thì SỐ LẦN LẬP là như nhau. Vậy cứ dùng 2 vòng lập đi cho nó đơn giản. Cố "ép" cho thành 1 vòng lập rồi cộng trừ nhân chia tùm lum cho nó tồn tài nguyên chứ chẳng ngon lành gì đâu mà ham --=0

Cậu Phong nhiều lúc hỏi có vẻ hỏi hơi "tùm lùm" nhưng nhờ cái tùm lùm đó mà tiến bộ Nhanh thư thần gió vậy đó Thầy NDU ah,@#!^%
 
Upvote 0
Cậu Phong nhiều lúc hỏi có vẻ hỏi hơi "tùm lùm" nhưng nhờ cái tùm lùm đó mà tiến bộ Nhanh thư thần gió vậy đó Thầy NDU ah,@#!^%

Mình thì đang nghĩ có khi bạn ấy chưa biết cách dùng 2 vòng lập ấy chứ
(bị lúc trước mới học VBA mình cũng như vậy)
 
Upvote 0
Mình thì đang nghĩ có khi bạn ấy chưa biết cách dùng 2 vòng lập ấy chứ
(bị lúc trước mới học VBA mình cũng như vậy)
Vào chém gió cho sôi nổi tý Thầy ah, hôm qua em vừa gửi cho Phong về 2 cái vòng lặp tô màu. Đợi anh Chàng lên phản hồi là biết thôi ah:-=
 
Upvote 0
Đây mới là For Each . . . Next nè, mại zô!

PHP:
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
Sub ToMàu()
 Dim Rng As Range, Cls As Range, Cll As Range
 Dim Col As Byte, Rws As Long, J As Byte, MyColor As Byte
 
 Sheet2.Select:                             Randomize
 Rws = 5 + 9 * Rnd() \ 1
 Col = 3 + 9 * Rnd() \ 1
 Set Rng = Range([B2], Cells(Rws, Col))
 [B2].Resize(15, 13).Interior.ColorIndex = 2
 For Each Cls In Range(Rng(1), Rng(1).Resize(, Col))
    MyColor = 34 + 9 * Rnd() \ 1
    For Each Cll In Range(Cls, Cls.Resize(Rws))
        Cells(Cll.Row, Cls.Column).Interior.ColorIndex = MyColor
        Sleep 35
    Next Cll
 Next Cls
End Sub
 
Upvote 0
Em xin cảm ơn tất cả các thầy (cô), anh (chị) đã tham gia trả lời đề tài này của em. Một lần nữa xin cảm ơn mọi người ! :-=:-=
 
Upvote 0
PHP:
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
Sub ToMàu()
 Dim Rng As Range, Cls As Range, Cll As Range
 Dim Col As Byte, Rws As Long, J As Byte, MyColor As Byte
 
 Sheet2.Select:                             Randomize
 Rws = 5 + 9 * Rnd() \ 1
 Col = 3 + 9 * Rnd() \ 1
 Set Rng = Range([B2], Cells(Rws, Col))
 [B2].Resize(15, 13).Interior.ColorIndex = 2
 For Each Cls In Range(Rng(1), Rng(1).Resize(, Col))
    MyColor = 34 + 9 * Rnd() \ 1
    For Each Cll In Range(Cls, Cls.Resize(Rws))
        Cells(Cll.Row, Cls.Column).Interior.ColorIndex = MyColor
        Sleep 35
    Next Cll
 Next Cls
End Sub

Bạn dùng resize để chuyển cả vùng thành 1 dòng. Sau đó lại dùng resize để chuyên mỗi ô thành 1 cột. Như vậy code giản dị hơn.

Mã:
#If VBA7 Then
    Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) [COLOR=#008000]'For 64 Bit Systems[/COLOR]
#Else
    Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds as Long)[COLOR=#008000] 'For 32 Bit Systems[/COLOR]
#End If

Sub t()
Set rg = [a1:c5]
For Each cCol In rg.Resize(1)
    MyColor = 34 + 9 * Rnd() \ 1
    For Each cRow In cCol.Resize(rg.Rows.Count)
        cRow.Interior.ColorIndex = MyColor
        Sleep 200
    Next cRow
 Next cCol
End Sub
 
Upvote 0
Web KT

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

Back
Top Bottom