Nhờ mọi người sửa code vòng lặp

Liên hệ QC

tu205489039

Thành viên hoạt động
Tham gia
14/12/14
Bài viết
114
Được thích
12
Giới tính
Nam
Dạ em có viết đoạn code vòng lặp, nhưng em không hiểu tại sao rõ ràng em cho i chạy từ 1 đến j ( j = 20 ), nhưng khi chạy thì khi tạo sheet thì nó tạo đủ từ 1 đến 20, nhưng khi copy nó luôn bắt đầu của i =20. Mong anh chị chỉ giáo ạ
Mã:
Sub a()
Dim i As Integer, j As Integer
Dim sh As Worksheet
Dim scell1 As String, scell2 As String, rng As String

j = WorksheetFunction.RoundUp(WorksheetFunction.CountA(Sheet1.Range("A:A")) / 500, 0)
For i = 1 To j
    With ThisWorkbook
        .Sheets.Add.Name = i
    End With
    Set sh = ActiveWorkbook.Sheets(i)
 
    If i = 1 Then
        sh.Range("A1:J500").Value = Sheet1.Range("A1:J500").Value
    Else
        scell1 = "A" & ((i - 1) * 500 + 1)
        scell2 = "J" & (i * 500)
        rng = scell1 & ":" & scell2
        sh.Range("A1:J1").Value = Sheet1.Range("A1:J1").Value
        sh.Range("A2:J500").Value = Sheet1.Range(rng).Value
    End If
Next i

End Sub
 

File đính kèm

  • mas.xls
    940.5 KB · Đọc: 3
Lần chỉnh sửa cuối:
Dạ em có viết đoạn code vòng lặp, nhưng em không hiểu tại sao rõ ràng em cho i chạy từ 1 đến j ( j = 20 ), nhưng khi chạy thì khi tạo sheet thì nó tạo đủ từ 1 đến 20, nhưng khi copy nó luôn bắt đầu của i =20. Mong anh chị chỉ giáo ạ
Mã:
Sub a()
Dim i As Integer, j As Integer
Dim sh As Worksheet
Dim scell1 As String, scell2 As String, rng As String

j = WorksheetFunction.RoundUp(WorksheetFunction.CountA(Sheet1.Range("A:A")) / 500, 0)
For i = 1 To j
    With ThisWorkbook
        .Sheets.Add.Name = i
    End With
    Set sh = ActiveWorkbook.Sheets(i)

    If i = 1 Then
        sh.Range("A1:J500").Value = Sheet1.Range("A1:J500").Value
    Else
        scell1 = "A" & ((i - 1) * 500 + 1)
        scell2 = "J" & (i * 500)
        rng = scell1 & ":" & scell2
        sh.Range("A1:J1").Value = Sheet1.Range("A1:J1").Value
        sh.Range("A2:J500").Value = Sheet1.Range(rng).Value
    End If
Next i

End Sub
Không hiểu! Thử thay:

Set sh = ActiveWorkbook.Sheets(i)

bằng:

Set sh = ActiveWorkbook.ActiveSheet
 
Upvote 0
Dạ anh cho em hỏi thêm chút ạ. Câu dưới khác câu trên chổ nào mà khi thay câu của anh vào thì nó lại chạy ạ. Em cảm ơn anh ạ
Khác, ví dụ i = 3

Set sh = ActiveWorkbook.Sheets(i)' là Sheet có vị trí thứ 3, không phải sheet tên là 3

Muốn nó hiểu là sheet có tên là 3 thì viết:

Set sh = ActiveWorkbook.Sheets(CStr(i))

tức là dùng hàm CStr() để chuyển nó thành chuỗi.
 
Upvote 0
Khác, ví dụ i = 3

Set sh = ActiveWorkbook.Sheets(i)' là Sheet có vị trí thứ 3, không phải sheet tên là 3
...
Giải thích theo lý thuyết thì như vầy:
Sheets là một thuộc tính của WorkBook. Kiểu của nó là collection, với các phần tử ở dạng WorkSheet và ChartSheet (WorkSheets mới là collection không gồm Chart sheets).

Collection(tham số) là hàm chọn và trả về phần tử của collection. Hàm này được mặc định để nhận hai kiểu tham:
1. kiểu tham Long được sử dụng như chỉ số (tương tự như array), tức là truy vấn lấy phần tử thứ nth của collection
2. kiểu tham id (trong trường hợp này là chuỗi/string), tức là truy vấn theo tên của phần tử.

Trong vấn đề này, thớt đã vi phạm một lỗi khá khó nhận ra. Tuy nhiên, nó thuộc về loại lỗi mà người viết code cẩn thận sẽ không bao giờ mắc phải: đặt tên đối tượng bằng số.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom