dùng vòng do...while....loop với sheet (1 người xem)

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

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

giaosy

Thành viên thường trực
Tham gia
6/12/06
Bài viết
205
Được thích
144
Các bác giúp em cách sử dụng vòng:
do....while.....loop
để hiển thị tên của các sheet. giả sử em có một workbook (bao gồm 20 sheet). em muốn sử dụng vòng lặp để hiện tên của các sheet từ sheet 2 đến sheet 20.

cách sử dụng tên sheet theo kiểu sheet.name và sheet1, sheet2 có gì khác nhau không các bác, em đã làm thủ như thế này nhưng không được:

Sub duyet_sheet ()
Dim i As Integer
Dim wsh As Worksheet
Application.ScreenUpdating = False
Do While i < ThisWorkbook.Worksheets.Count + 1
i = i + 1
mgsbox (wsh & i.name)
Loop
Application.ScreenUpdating = True
End Sub

cái này cũng không được

Sub tim_sh()
Dim i As Integer
Dim wsh As Worksheet
For i = 2 To ThisWorkbook.Worksheets.Count
MsgBox (wsh&""&i.Name)
Next
End Sub

nó báo lỗi ở dòng in đậm

mong các bác chỉ giúp
Rất cảm ơn các bác !
 
Lần chỉnh sửa cuối:
Các bác giúp em cách sử dụng vòng:
do....while.....loop
để hiển thị tên của các sheet. giả sử em có một workbook (bao gồm 20 sheet). em muốn sử dụng vòng lặp để hiện tên của các sheet từ sheet 2 đến sheet 20.

cách sử dụng tên sheet theo kiểu sheet.name và sheet1, sheet2 có gì khác nhau không các bác, em đã làm thủ như thế này nhưng không được:

Sub duyet_sheet ()
Dim i As Integer
Dim wsh As Worksheet
Application.ScreenUpdating = False
Do While i < ThisWorkbook.Worksheets.Count + 1
i = i + 1
mgsbox (wsh & i.name)
Loop
Application.ScreenUpdating = True
End Sub

cái này cũng không được

Sub tim_sh()
Dim i As Integer
Dim wsh As Worksheet
For i = 2 To ThisWorkbook.Worksheets.Count
MsgBox (wsh&""&i.Name)
Next
End Sub

nó báo lỗi ở dòng in đậm

mong các bác chỉ giúp
Rất cảm ơn các bác !

Bạn thử nhé:

PHP:
Sub tim_sh()
    Dim i As Integer, Temp As String
    Dim Sh As Worksheet
    For Each Sh In ThisWorkbook.Worksheets
        i = i + 1
        If i > 1 And i <= 20 Then Temp = Temp & Chr(13) & " -" & Sh.Name
    Next
    MsgBox Temp, vbInformation, "Welcome"
End Sub

Thân!
 
Upvote 0
Bạn chỉnh lại như sau:
Mã:
Sub duyet_sheet()
Dim i As Integer
Dim ten As String
i = 1
     Do While i < ThisWorkbook.Worksheets.Count + 1
           ten = ten & vbNewLine & Worksheets(i).Name
           i = i + 1
     Loop
MsgBox ten, , "Ten cac sheet la"
End Sub
Code này sẽ lấy tên toàn bộ sheet. Muốn lấy tên từ sheet 2, bạn chỉnh lại nhé. ( i = 2)
 
Upvote 0
Nếu đối tượng đã biết số phần tử thì dùng trình duyệt For each ... Next như anh Bắp là hợp lý nhất.
 
Upvote 0
Bạn thử nhé:

PHP:
Sub tim_sh()
    Dim i As Integer, Temp As String
    Dim Sh As Worksheet
    For Each Sh In ThisWorkbook.Worksheets
        i = i + 1
        If i > 1 And i <= 20 Then Temp = Temp & Chr(13) & " -" & Sh.Name
    Next
    MsgBox Temp, vbInformation, "Welcome"
End Sub

Thân!
Bác ơi sao em dùng code của bác thì bị mất đi sheet1 (Không thấy hiện trong Msgbox). Rồi khi cho i=i+2 thì lại thấy.
Vậy em thay đổi như vậy thì đúng sai thế nào ạ?
Mong bác giải đáp giúp em với!
PHP:
Sub tim_sh()
    Dim i As Integer, Temp As String
    Dim Sh As Worksheet
    For Each Sh In ThisWorkbook.Worksheets
        i = i + 2
        If i > 1 And i <= 20 Then Temp = Temp & Chr(13) & " -" & Sh.Name
    Next
    MsgBox Temp, vbInformation, "Welcome"
End Sub
 
Upvote 0
Nguyên văn bởi PhanTuHuong
Nếu đối tượng đã biết số phần tử thì dùng trình duyệt For each ... Next như anh Bắp là hợp lý nhất.
Theo mình hiểu, nếu đối tượng đã biết số phần tử thì dùng For...Next là hợp lý nhất. For Each...Next gần giống như For...Next nhưng dùng trong trường hợp ta chưa biết chính xác bao nhiêu phần tử trong tập hợp hoặc của đối tượng.
 
Upvote 0
Bác ơi sao em dùng code của bác thì bị mất đi sheet1 (Không thấy hiện trong Msgbox). Rồi khi cho i=i+2 thì lại thấy.
Vậy em thay đổi như vậy thì đúng sai thế nào ạ?
Mong bác giải đáp giúp em với!
PHP:
Sub tim_sh()
    Dim i As Integer, Temp As String
    Dim Sh As Worksheet
    For Each Sh In ThisWorkbook.Worksheets
        i = i + 2
        If i > 1 And i <= 20 Then Temp = Temp & Chr(13) & " -" & Sh.Name
    Next
    MsgBox Temp, vbInformation, "Welcome"
End Sub

Đề bài của bạn : Giải thích giùm tớ nhé ????

Các bác giúp em cách sử dụng vòng:
do....while.....loop
để hiển thị tên của các sheet. giả sử em có một workbook (bao gồm 20 sheet). em muốn sử dụng vòng lặp để hiện tên của các sheet từ sheet 2 đến sheet 20.
Còn nếu muốn hiện thị tất cả :
PHP:
Sub tim_sh()
    Dim Temp As String
    Dim Sh As Worksheet
    For Each Sh In ThisWorkbook.Worksheets
      Temp = Temp & Chr(13) & " -" & Sh.Name
    Next
    MsgBox Temp, vbInformation, "Welcome"
End Sub
!!!!!!!!!!!!!!!!!!!!!!!
 
Upvote 0
Các bác giúp em cách sử dụng vòng:
do....while.....loop
để hiển thị tên của các sheet. giả sử em có một workbook (bao gồm 20 sheet). em muốn sử dụng vòng lặp để hiện tên của các sheet từ sheet 2 đến sheet 20.

cách sử dụng tên sheet theo kiểu sheet.name và sheet1, sheet2 có gì khác nhau không các bác, em đã làm thủ như thế này nhưng không được:

Sub duyet_sheet ()
Dim i As Integer
Dim wsh As Worksheet
Application.ScreenUpdating = False
Do While i < ThisWorkbook.Worksheets.Count + 1
i = i + 1
mgsbox (wsh & i.name)
Loop
Application.ScreenUpdating = True
End Sub

cái này cũng không được

Sub tim_sh()
Dim i As Integer
Dim wsh As Worksheet
For i = 2 To ThisWorkbook.Worksheets.Count
MsgBox (wsh&""&i.Name)
Next
End Sub

nó báo lỗi ở dòng in đậm

mong các bác chỉ giúp
Rất cảm ơn các bác !
Sửa lại theo đúng với những gì bạn đang có:
PHP:
Sub duyet_sheet()
  Dim i As Integer
  Dim wsh As Worksheet
  Application.ScreenUpdating = False
  i = 0
  Do While i < ThisWorkbook.Worksheets.Count
     i = i + 1
     Set wsh = Sheets(i)
     MsgBox wsh.Name
  Loop
  Application.ScreenUpdating = True
End Sub
PHP:
Sub tim_sh()
  Dim i As Integer
  Dim wsh As Worksheet
  For i = 1 To ThisWorkbook.Worksheets.Count
    Set wsh = Sheets(i)
    MsgBox wsh.Name
  Next
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Theo mình hiểu, nếu đối tượng đã biết số phần tử thì dùng For...Next là hợp lý nhất. For Each...Next gần giống như For...Next nhưng dùng trong trường hợp ta chưa biết chính xác bao nhiêu phần tử trong tập hợp hoặc của đối tượng.

Gửi bác Voda!

Theo ý kiến của em, vòng For Each...Next để duyệt qua từng đối tượng trong 1 tập hợp đối tượng (Ví dụ này là quyệt qua từng worksheet trong tập hợp worksheets).
Còn For ... Next hiểu 1 cách đơn giản duyệt qua từng giá trị một cho hết vòng lặp (có thể tuỳ biến bước nhảy giá trị), phạm vi ứng dụng rộng hơn.
 
Upvote 0
các bác cho em hỏi thêm một chút về vấn đề này với: dường như các lệnh trong vòng lặp không có tác dụng gì với việc xử lý sheet. Cũng với đoạn code các bác hướng dẫn trên, em thay lệnh "msgbox wsh.name" bằng lệnh wsh.active ( hoặc wsh.select ) range("A1").value = 1. nhưng khi chạy thì vùng a1 không hề có kết quả như mình mong muốn.
Các bác giải thích hộ em với
Cảm ơn các bác

y em là như thế này này:

code:
Sub tim_sh()
Dim i As Integer
Dim wsh As Worksheet
For i = 1 To ThisWorkbook.Worksheets.Count
Set wsh = Sheets(i)
MsgBox wsh.Name

wsh.active
range("A1").value = 1
Next
End Sub

nhưng sao no không gán value cho ô A1 của các sheet đã duyệt qua là 1
các bác giải thích giúp em với
nếu đoạn code này sai thì code đúng phải là như thế nào ?
thanks
 
Upvote 0
Bạn nó gì mà mình không hiểu lắm!
Bạn có thể đem đoạn code đó lên và cả kết quả ứng ý của bạn để mình xem lại cho.
 
Upvote 0
Phải là: wsh.Activate
 
Upvote 0
to bác voda:
em đánh sai chính tả
nhưng em dùng cả Activate lẫn select rồi nhưng đề không được:.,
 
Lần chỉnh sửa cuối:
Upvote 0
y em là như thế này này:

code:
Sub tim_sh()
Dim i As Integer
Dim wsh As Worksheet
For i = 1 To ThisWorkbook.Worksheets.Count
Set wsh = Sheets(i)
MsgBox wsh.Name

wsh.active
range("A1").value = 1
Next
End Sub

nhưng sao no không gán value cho ô A1 của các sheet đã duyệt qua là 1
các bác giải thích giúp em với
nếu đoạn code này sai thì code đúng phải là như thế nào ?
thanks

Đoạn code trên bạn để trong module hay sheet? Nếu để trong sheet thì chuyển qua module nhé và sửa lỗi chữ wsh.active thành wsh.activate. Bạn gửi file chứa code lên cho tiện việc kiểm tra lỗi!

TP.
 
Lần chỉnh sửa cuối:
Upvote 0
y em là như thế này này:

code:
Sub tim_sh()
Dim i As Integer
Dim wsh As Worksheet
For i = 1 To ThisWorkbook.Worksheets.Count
Set wsh = Sheets(i)
MsgBox wsh.Name

wsh.active
range("A1").value = 1
Next
End Sub

nhưng sao no không gán value cho ô A1 của các sheet đã duyệt qua là 1
các bác giải thích giúp em với
nếu đoạn code này sai thì code đúng phải là như thế nào ?
thanks
Sửa lại:
PHP:
Sub tim_sh()
  Dim i As Byte
  Dim wsh As Worksheet
  For i = 1 To ThisWorkbook.Worksheets.Count
    Set wsh = Sheets(i)
    MsgBox wsh.Name
    wsh.Activate
    [A1] = 1
  Next i
End Sub
1> i chạy từ 1 đến 256 (Excel2007 thì tôi không biết) nên không cần Dim nó là Integer (Byte là đủ)
2> Nếu bạn đã Dim wsh As Worksheet thì ngay khi gõ wsh và gõ thêm dấu chấm thì bạn sẽ thấy các gợi ý về thuộc tính nằm trong 1 list, vì thế ta cứ chọn cái phù hợp (đâu thể gõ sai được)... Đây là 1 cái lợi nữa nếu định nghĩa đầy đủ cho các biến
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Sub xu_ly_data()
Dim i, j, x As Integer
Dim dc, SR
Dim wsh As Worksheet
Set SR = Sheets("DATA").Range("A1:AE160")
dc = Range("B11").End(xlDown).Row
MsgBox (dc)
i = 12
j = 2
Application.ScreenUpdating = False
For x = 3 To ThisWorkbook.Worksheets.Count
Set wsh = Sheets(x)
wsh.Activate
MsgBox dc & " " & wsh.Name
If Cells(i, j).Value = "" Then
For j = 2 To 31
Cells(i, j).Value = WorksheetFunction.VLookup(wsh.Name, SR, j, 0)
Next j
Else
For j = 2 To 31
Cells(dc, j).Offset(1).Value = WorksheetFunction.VLookup(wsh.Name, SR, j, 0)
Next j
End If
Next
Application.ScreenUpdating = True
End Sub

đây là nguyên đoạn code em sử dụng, nhưng khi chạy thì nó chỉ thực hiện ở sheet đầu tiên còn những sheet sau mặc dù báo dòng và sheet đều đúng nhưng không điền số liệu vào.
Các bác lại chỉ giúp em xem đoạn code này sai ở đâu với
Cảm ơn các bác nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
Gửi bác Voda!

Theo ý kiến của em, vòng For Each...Next để duyệt qua từng đối tượng trong 1 tập hợp đối tượng (Ví dụ này là quyệt qua từng worksheet trong tập hợp worksheets).
Còn For ... Next hiểu 1 cách đơn giản duyệt qua từng giá trị một cho hết vòng lặp (có thể tuỳ biến bước nhảy giá trị), phạm vi ứng dụng rộng hơn.

Em bổ sung thêm: Nếu dùng For ... Next thì vẫn phải dùng thuộc tính Count để xác định số phần tử của đối tượng hay tập hợp. Từ đó mới xác định số vòng lặp ---> dễ dẫn đến sai sót do không duyệt hết các đối tượng.
Nhưng For Each ... Next thì không cần, mặc định duyệt qua từng phần tử cho đến khi hết thì thoát ---> nhàn thân hơn nhiều :-=
 
Upvote 0
Nguyên văn bởi PhanTuHuong
Em bổ sung thêm: Nếu dùng For ... Next thì vẫn phải dùng thuộc tính Count để xác định số phần tử của đối tượng hay tập hợp. Từ đó mới xác định số vòng lặp ---> dễ dẫn đến sai sót do không duyệt hết các đối tượng.
Nhưng For Each ... Next thì không cần, mặc định duyệt qua từng phần tử cho đến khi hết thì thoát ---> nhàn thân hơn nhiều
Từ những ý trên, có thể rút ra kết luận:
-Dùng For...Next khi đã xác định hoặc phải xác định được số phần tử của đối tượng hoặc tập hợp.
-Dùng For each...Next khi chưa hoặc không thể xác định được số phần tử của đối tượng hoặc tập hợp.
Và:
-Khi đã xác định được số phần tử của đối tượng hoặc tập hợp, dùng For...Next hoặc For each...Next.
-Khi chưa xác định được số phần tử của đối tượng hoặc tập hợp, chỉ được dùng For each...Next.
Trở lại trường hợp trên, ta biết rõ số sheet là 20, nên dùng For...Next hoặc For each...Next đều tốt.
 
Upvote 0
trời ơi! các bác ơi, em đang hỏi là cái vòng lặp này thực sự nó tác động thế nào đến từng sheet trong nhóm đối tượng (các sheet) mà nó duyệt qua cơ.
em thấy nó cứ chỉ tác động đến sheet đầu tiên còn lại thì kệ.
to bac ndu96081631: đoạn code của bác dùng trong file co khoảng 5 sheet thì được nhưng > 5 thi hỏng
Các bác xem và giải thích hộ em đoạn code trên với. khi chạy đoạn code này, msgbox đều báo đúng tên sheet và dòng cần tác động trong sheet đó, nhưng chẳng thấy kết quả cần phải có ở đó.

cảm ơn các bác
 
Lần chỉnh sửa cuối:
Upvote 0
trời ơi! các bác ơi, em đang hỏi là cái vòng lặp này thực sự nó tác động thế nào đến từng sheet trong nhóm đối tượng (các sheet) mà nó duyệt qua cơ.
em thấy nó cứ chỉ tác động đến sheet đầu tiên còn lại thì kệ.
Các bác xem và giải thích hộ em đoạn code trên với. khi chạy đoạn code này, msgbox đều báo đúng tên sheet và dòng cần tác động trong sheet đó, nhưng chẳng thấy kết quả cần phải có ở đó.
cảm ơn các bác

Bác xem lại bài số #15, nguyên nhân nằm ở đó!
 
Upvote 0
Web KT

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

Back
Top Bottom