Code thực thi không đúng tên sheet

Liên hệ QC

Lê Hồng Minh83

Thành viên tiêu biểu
Tham gia
29/9/17
Bài viết
587
Được thích
649
Giới tính
Nam
Chào các thành viên diễn đàn
Em đã thay đổi code name của sheet rồi mà code nó vẫn không nhận diện đúng tên sheet
Cụ thể, tại cột D của sheet từ 1 đến 5, đang thiết lập phép tính thành tiền = đơn giá x số lượng
Mã:
Sub Test_VongLap()
    Dim i&, j&
    For i = 1 To 5
        For j = 2 To 15
        If Sheets(i).Cells(j, 1) <> "" Then
        Sheets(i).Cells(j, 4) = Sheets(i).Cells(j, 2) * Sheets(i).Cells(j, 3)
        End If
        Next
    Next
End Sub
Nhưng em chưa hiểu sao nó cứ tính cả sheet DATA mà bỏ sheet 5
Mong các bác giúp đỡ
 

File đính kèm

  • Test Vòng lặp.xlsm
    21.8 KB · Đọc: 10
Chào các thành viên diễn đàn
Em đã thay đổi code name của sheet rồi mà code nó vẫn không nhận diện đúng tên sheet
Cụ thể, tại cột D của sheet từ 1 đến 5, đang thiết lập phép tính thành tiền = đơn giá x số lượng
Mã:
Sub Test_VongLap()
    Dim i&, j&
    For i = 1 To 5
        For j = 2 To 15
        If Sheets(i).Cells(j, 1) <> "" Then
        Sheets(i).Cells(j, 4) = Sheets(i).Cells(j, 2) * Sheets(i).Cells(j, 3)
        End If
        Next
    Next
End Sub
Nhưng em chưa hiểu sao nó cứ tính cả sheet DATA mà bỏ sheet 5
Mong các bác giúp đỡ
Góp ý cho bạn:
1/ Việc theo dõi nên nằm trên 1 sheet sẽ thuận tiện cho việc tổng hợp, muốn kết quả như bạn cần thì chỉ cần tách sheet.
2/ Nên cụ thể vấn đền cần làm và muốn làm cái gì?
 
Upvote 0
Chào các thành viên diễn đàn
Em đã thay đổi code name của sheet rồi mà code nó vẫn không nhận diện đúng tên sheet
Cụ thể, tại cột D của sheet từ 1 đến 5, đang thiết lập phép tính thành tiền = đơn giá x số lượng
Mã:
Sub Test_VongLap()
    Dim i&, j&
    For i = 1 To 5
        For j = 2 To 15
        If Sheets(i).Cells(j, 1) <> "" Then
        Sheets(i).Cells(j, 4) = Sheets(i).Cells(j, 2) * Sheets(i).Cells(j, 3)
        End If
        Next
    Next
End Sub
Nhưng em chưa hiểu sao nó cứ tính cả sheet DATA mà bỏ sheet 5
Mong các bác giúp đỡ
Lưu ý quan trọng đối với những sheet có tên là số.
- Sheets(3) là sheet thứ 3, không phải sheet tên 3
- Sheets("3") là sheet có tên 3, không phải sheet thứ 3
Vậy trường hợp của bạn, nếu ghi Sheets(i) thì code sẽ hiểu bạn đang nói đến sheet thứ i, không phải tên i. Muốn nói đến sheet có tên là i, phải ghi Sheets(Cstr(i))
 
Upvote 0
Chào các thành viên diễn đàn
Em đã thay đổi code name của sheet rồi mà code nó vẫn không nhận diện đúng tên sheet
Cụ thể, tại cột D của sheet từ 1 đến 5, đang thiết lập phép tính thành tiền = đơn giá x số lượng
Mã:
Sub Test_VongLap()
    Dim i&, j&
    For i = 1 To 5
        For j = 2 To 15
        If Sheets(i).Cells(j, 1) <> "" Then
        Sheets(i).Cells(j, 4) = Sheets(i).Cells(j, 2) * Sheets(i).Cells(j, 3)
        End If
        Next
    Next
End Sub
Nhưng em chưa hiểu sao nó cứ tính cả sheet DATA mà bỏ sheet 5
Mong các bác giúp đỡ
Thay:
Mã:
    For i = 1 To 5
thành:
Mã:
 For i = 1 To 6
 
Upvote 0
Góp ý cho bạn:
1/ Việc theo dõi nên nằm trên 1 sheet sẽ thuận tiện cho việc tổng hợp, muốn kết quả như bạn cần thì chỉ cần tách sheet.
2/ Nên cụ thể vấn đền cần làm và muốn làm cái gì?
Cảm ơn Bác đã góp ý.
Lưu ý quan trọng đối với những sheet có tên là số.
- Sheets(3) là sheet thứ 3, không phải sheet tên 3
- Sheets("3") là sheet có tên 3, không phải sheet thứ 3
Vậy trường hợp của bạn, nếu ghi Sheets(i) thì code sẽ hiểu bạn đang nói đến sheet thứ i, không phải tên i. Muốn nói đến sheet có tên là i, phải ghi Sheets(Cstr(i))
Cảm ơn Thầy đã hướng dẫn, đúng là cái này.
 
Upvote 0
Thay:
Mã:
    For i = 1 To 5
thành:
Mã:
 For i = 1 To 6
For i = 2 To 6 mới đúng chứ Bác nhỉ.
Nhân đây cho em hỏi thêm chút xíu
For j = 2 To 15
If Sheets(i).Cells(j, 1) <> "" Then
Vòng lặp nó vẫn chạy cho đến khi hết dòng 15 luôn, nhưng thực tế có nhiều sheet cột A có dữ liệu ít hơn 15 dòng, vậy làm sao để cho vòng lặp nó kết thúc tại Sheets(i) với dòng cuối có dữ liệu tại cột A của Sheets(i) đó. (file này chỉ là tình huống giả định, file thật nó lên tới 55 dòng và rất nhiều sheet)
 
Upvote 0
For i = 2 To 6 mới đúng chứ Bác nhỉ.
Nhân đây cho em hỏi thêm chút xíu
For j = 2 To 15
If Sheets(i).Cells(j, 1) <> "" Then
Vòng lặp nó vẫn chạy cho đến khi hết dòng 15 luôn, nhưng thực tế có nhiều sheet cột A có dữ liệu ít hơn 15 dòng, vậy làm sao để cho vòng lặp nó kết thúc tại Sheets(i) với dòng cuối có dữ liệu tại cột A của Sheets(i) đó. (file này chỉ là tình huống giả định, file thật nó lên tới 55 dòng và rất nhiều sheet)
Có ít nhất cả chục cách để giải quyết yêu cầu của bạn (từ đơn giản nhất đến tối ưu nhất). Tuy nhiên vẫn chưa biết bạn ý đồ của bạn là HỌC hay LÀM THẬT để tư vấn cho hợp lý
Riêng phần xác định dòng cuối cùng thì không gì bằng End(xlUp), cứ thế mà múc nhé
 
Upvote 0
Có ít nhất cả chục cách để giải quyết yêu cầu của bạn (từ đơn giản nhất đến tối ưu nhất). Tuy nhiên vẫn chưa biết bạn ý đồ của bạn là HỌC hay LÀM THẬT để tư vấn cho hợp lý
Riêng phần xác định dòng cuối cùng thì không gì bằng End(xlUp), cứ thế mà múc nhé
Dạ em vừa học và áp dụng luôn vào thực tế cho dễ nhớ. Có thể hiện tại những cái em đang làm nó chưa được tối ưu nhưng em thấy nó có ích. Ví dụ như làm cho file chạy nhanh hơn (những công thức tính cho nhiều mảng lớn được chỉ định tính bằng click chuột chạy marco và chỉ ghi giá trị).
Em cũng đọc được một số cách để chọn dòng cuối cùng có chứa dữ liệu nhưng nếu làm trên từng sheet riêng biệt thì em làm được, còn để cho nó chạy luôn trên nhiều sheet trong vòng lặp như bài #1 thì em làm chưa được như lỗi hình dưới. Mong thầy giúp đỡ.
1537675176278.png
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ em vừa học và áp dụng luôn vào thực tế cho dễ nhớ. Có thể hiện tại những cái em đang làm nó chưa được tối ưu nhưng em thấy nó có ích. Ví dụ như làm cho file chạy nhanh hơn (những công thức tính cho nhiều mảng lớn được chỉ định tính bằng click chuột chạy marco và chỉ ghi giá trị).
Em cũng đọc được một số cách để chọn dòng cuối cùng có chứa dữ liệu nhưng nếu làm trên từng sheet riêng biệt thì em làm được, còn để cho nó chạy luôn trên nhiều sheet trong vòng lặp như bài #1 thì em làm chưa được như lỗi hình dưới. Mong thầy giúp đỡ.
View attachment 204345
Tình hình là em đã làm được, còn tối ưu hay chưa thì chưa biết :)
Mã:
Sub Test_VongLap()
    Dim i&, j&, k&
        For i = 1 To 5
        With Sheets(CStr(i))
        k = .Cells(.Rows.Count, "A").End(xlUp).Row
        End With
        
        For j = 2 To k
        If Sheets(CStr(i)).Cells(j, 1) <> "" Then
        Sheets(CStr(i)).Cells(j, 4) = Sheets(CStr(i)).Cells(j, 2) * Sheets(CStr(i)).Cells(j, 3)
        End If
        Next
    Next
End Sub
 
Upvote 0
Tình hình là em đã làm được, còn tối ưu hay chưa thì chưa biết
Viết như vầy nhìn rõ ràng hơn.
PHP:
Sub Test_VongLap()
Dim i As Long, j As Long, k As Long
    For i = 1 To 5
        With Sheets(CStr(i))
            k = .Range("A1000000").End(xlUp).Row
            For j = 2 To k
                If .Cells(j, 1) <> Empty Then .Cells(j, 4) = .Cells(j, 2) * .Cells(j, 3)
            Next j
        End With
    Next i
End Sub
 
Upvote 0
Tình hình là em đã làm được, còn tối ưu hay chưa thì chưa biết :)
Mã:
Sub Test_VongLap()
    Dim i&, j&, k&
...
End Sub
Học thì học cách kiểm soát dữ liệu đầu ra mới quan trọng.
Cái phần "tối ưu" nó chỉ là quan niệm chủ quan. "Ưu" đối với 90% ngừoi trên diễn đàn này (chuyên "thực hành") là tốc độ và giảm thiểu số dòng code. "Ưu" đối với 10% còn lại (chuyên "lý thuyết", chả biết thực hành) như tôi là sự dễ hiểu, dễ sửa, và dễ kiểm soát của code.

Điển hình, theo "lý thuyết" thì cái dấu & nó ra thời thượng cổ, bây giờ ngừoi ta dùng As Long. Nhưng theo "thực hành" thì nó làm cho code trông xịn (cool).
Theo lý thuyết thì i, j, k dùng để đếm (thường là chiều thứ 1, 2, 3); nếu là một con số tổng thì là n (hay num). Theo thực hành ở đây thì con số tổng dòng thường là k.
Theo lý thuyết thì tôi dò dòng code để đoán giới hạn dữ liệu. Theo thực hành ở đây thì dò dòng code để xem có cách nào viết ngắn hơn.
 
Upvote 0
Upvote 0
Đang thắc mắc là tại sao bạn không dùng
Mã:
For Each wks in Thisworkbook.Worksheets
  If UCase(wks.Name) <> "DATA" then
   ...................
  ...............
Next
Đúng rồi, em đang thắc mắc mãi, search google cũng chưa tìm thấy cái nào loại trừ sheet DATA là khỏe nhất
Cảm ơn Thầy
 
Upvote 0
Web KT
Back
Top Bottom