Thay Range("A1:C20") bằng Range("A1:C(tong)"), tong là biến số thay đổi??? (1 người xem)

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

thanhtung1088

Thành viên mới
Tham gia
23/8/13
Bài viết
20
Được thích
2
Cho mình hỏi muốn thay lệnh Range("A1:C20") bằng Range("A1:Ctong"), trong đó tong là biến số luôn thay đổi, phải viết như thế nào để VBA hiểu được mình muốn biến tong là chỉ số hàng???
Tương tự Range("'Sheet2'!$A$1:$C$20"), muốn thay số 20 là biến tong thì phải viết cú pháp sao cho đúng để VBA hiểu??
Xin cảm ơn các bạn.
 
Cho mình hỏi muốn thay lệnh Range("A1:C20") bằng Range("A1:Ctong"), trong đó tong là biến số luôn thay đổi, phải viết như thế nào để VBA hiểu được mình muốn biến tong là chỉ số hàng???
Tương tự Range("'Sheet2'!$A$1:$C$20"), muốn thay số 20 là biến tong thì phải viết cú pháp sao cho đúng để VBA hiểu??
Xin cảm ơn các bạn.
Bạn phải viết vầy thì nó mới hiểu:
PHP:
Range("A1:C" & tong)
 
Upvote 0
Thì bạn làm như vầy: Rows(a & ":" & b)

Đơn giản thế thôi!
Mình làm theo mà không được bạn à.
Rows(dong1&":"&dong2).Select
Selection.Delete Shift:=xlUp
mình muốn dùng code xóa dòng từ dong1 đến dong2 mà làm theo hướng dẫn của bạn chưa được, dong1 và dong2 mình khai báo kiếu Integer.
 
Upvote 0
Mình làm theo mà không được bạn à.
Rows(dong1&":"&dong2).Select
Selection.Delete Shift:=xlUp
mình muốn dùng code xóa dòng từ dong1 đến dong2 mà làm theo hướng dẫn của bạn chưa được, dong1 và dong2 mình khai báo kiếu Integer.

Sao vậy bạn? Tôi thấy bình thường mà! Tôi xóa từ hàng 6 đến hàng 10 đấy!

Mã:
Sub Test()


    Dim a As Long, b As Long
    a = 6
    b = 10
    Rows(a & ":" & b).Delete


End Sub
 
Upvote 0
Cho em hỏi, em có đoạn code ghi bằng macro như sau:
PHP:
Range("G1").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(R1C6:R72C6,"">=""&RC[-1])/72"
    Range("G1").Select
    Selection.AutoFill Destination:=Range("G1:G72")
    Range("G1:G72").Select
    Selection.Style = "Percent"

Ở dòng thứ 2:
"=COUNTIF(R1C6:R72C6,"">=""&RC[-1])/72"

em muốn thay số 72 bằng một biến số j, thì phải viết như thế nào? mong các anh chị chỉ giúp, em viết như thế này vẫn báo lỗi hoài.
"=COUNTIF(R1C6:R"&j&"C6,"">=""&RC[-1])/j"
 
Upvote 0
Cho em hỏi, em có đoạn code ghi bằng macro như sau:
PHP:
Range("G1").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(R1C6:R72C6,"">=""&RC[-1])/72"
    Range("G1").Select
    Selection.AutoFill Destination:=Range("G1:G72")
    Range("G1:G72").Select
    Selection.Style = "Percent"

Ở dòng thứ 2:
"=COUNTIF(R1C6:R72C6,"">=""&RC[-1])/72"

em muốn thay số 72 bằng một biến số j, thì phải viết như thế nào? mong các anh chị chỉ giúp, em viết như thế này vẫn báo lỗi hoài.
"=COUNTIF(R1C6:R"&j&"C6,"">=""&RC[-1])/j"
"=COUNTIF(R1C6:R"&j&"C6,"">=""&RC[-1])/" & j
 
Upvote 0
Cho em hỏi, em có đoạn code ghi bằng macro như sau:
PHP:
Range("G1").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(R1C6:R72C6,"">=""&RC[-1])/72"
    Range("G1").Select
    Selection.AutoFill Destination:=Range("G1:G72")
    Range("G1:G72").Select
    Selection.Style = "Percent"

Ở dòng thứ 2:
"=COUNTIF(R1C6:R72C6,"">=""&RC[-1])/72"

em muốn thay số 72 bằng một biến số j, thì phải viết như thế nào? mong các anh chị chỉ giúp, em viết như thế này vẫn báo lỗi hoài.
"=COUNTIF(R1C6:R"&j&"C6,"">=""&RC[-1])/j"
Mình thấy bạn đưa file lên thì hơn, Bạn thấy Bạn Hoàng trọng Nghĩa viết đến trên 6000 bài trên GPE, bạn Hữu Thắng trên 4000 bài rồi mà "Mua bò vẽ bóng" còn chả trúng thì chịu . Thực ra 2 người này là Thày trên GPE rồi đó bạn .
 
Upvote 0
Em làm theo thầy Nghĩa rồi mà không được. Em có file dữ liệu có số lượng dòng thay đổi như file đính kèm. Em muốn sắp xếp dữ liệu ở cột B và C thành các nhóm riêng rẽ ra các cột khác nằm bên phải dữ liệu gốc (cột A ko quan tâm). sau đó áp dụng công thức: =COUNTIF(G$1:G$72;”>=” & G1)/72 (đối với dữ liệu đã sắp xếp ra có 72 dòng, nhưng số dòng này thay đổi tuỳ theo file dữ liệu khác nhau, nên em sẽ thay số 72 bằng biến). Đây là toàn bộ code của em, em mới học VBA nên code hơi rườm rà, mong anh chị đừng cười. Code này chạy OK, nhưng khi thay bằng biến thì có lỗi.
PHP:
Sub sapxep()
    Dim ws As Worksheet
    Dim i, j, t1, t2, t3, t4 As Integer
   
    Set ws = Sheets("Sheet1")
    i = 3
    j = 1
    t1 = 1
    t2 = 1
    t3 = 1
    t4 = 1
   
    Do While ws.Cells(i, 1) <> ""
        If ws.Cells(i, 2) = "140.05" Then
            ws.Cells(j, 5) = ws.Cells(i, 2)
            ws.Cells(j, 6) = ws.Cells(i, 3)
            j = j + 1
        ElseIf ws.Cells(i, 2) = "148" Then
           
            ws.Cells(t1, 9) = ws.Cells(i, 2)
            ws.Cells(t1, 10) = ws.Cells(i, 3)
            t1 = t1 + 1
        ElseIf ws.Cells(i, 2) = "152" Then
            ws.Cells(t2, 13) = ws.Cells(i, 2)
            ws.Cells(t2, 14) = ws.Cells(i, 3)
            t2 = t2 + 1
        ElseIf ws.Cells(i, 2) = "169" Then
            ws.Cells(t3, 17) = ws.Cells(i, 2)
            ws.Cells(t3, 18) = ws.Cells(i, 3)
            t3 = t3 + 1
        ElseIf ws.Cells(i, 2) = "171" Then
            ws.Cells(t4, 21) = ws.Cells(i, 2)
            ws.Cells(t4, 22) = ws.Cells(i, 3)
            t4 = t4 + 1
        End If
           
        i = i + 1
    Loop
    Range("G1").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(R1C6:R72C6,"">=""&RC[-1])/72"
    Range("G1").Select
    Selection.AutoFill Destination:=Range("G1:G72")
    Range("G1:G72").Select
    Selection.Style = "Percent"
   
    Range("K1").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(R1C10:R72C10,"">=""&RC[-1])/72"
    Range("K1").Select
    Selection.AutoFill Destination:=Range("K1:K72")
    Range("K1:K72").Select
    Selection.Style = "Percent"
   
    Range("O1").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(R1C14:R72C14,"">=""&RC[-1])/72"
    Range("O1").Select
    Selection.AutoFill Destination:=Range("O1:O72")
    Range("O1:O72").Select
    Selection.Style = "Percent"
   
    Range("S1").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(R1C18:R72C18,"">=""&RC[-1])/72"
    Range("S1").Select
    Selection.AutoFill Destination:=Range("S1:S72")
    Range("S1:S72").Select
    Selection.Style = "percent"
   
    Range("W1").Select
    ActiveCell.FormulaR1C1 = "=COUNTIF(R1C22:R72C22,"">=""&RC[-1])/72"
    Range("W1").Select
    Selection.AutoFill Destination:=Range("W1:W72")
    Range("W1:W72").Select
    Selection.Style = "percent"
 
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
bạn thử cái này xem sao? tôi viết tổng quát hơn của bạn

Function UniqueList(ParamArray sArray())
Dim Item, tmpArr, SubArr
On Error Resume Next
With CreateObject("Scripting.Dictionary")
For Each SubArr In sArray
tmpArr = SubArr
If TypeName(tmpArr) <> "Variant()" Then
If tmpArr <> "" Then .Add tmpArr, ""
Else
For Each Item In tmpArr
If Item <> "" Then
If Not .Exists(Item) Then .Add Item, ""
End If
Next
End If
Next
If .Count Then UniqueList = .Keys
End With
End Function


Sub DUYNHAT()


Dim Arr, tmpArr, I As Long
Dim COT As Byte
Dim K As Byte
COT = 5

Sheet1.Range("F3:Z65000").ClearContents
tmpArr = UniqueList(Sheet1.Range("B3:B65000"))
If IsArray(tmpArr) Then
ReDim Arr(1 To UBound(tmpArr) + 1, 1 To 1)
For I = 0 To UBound(tmpArr)
Arr(I + 1, 1) = tmpArr(I)
Next
End If
If (I > 0) Then
For K = 1 To I
Call DULIEU(Arr(K, 1), COT)
COT = COT + 4
Next K
End If
End Sub


Sub DULIEU(TEMP, COT As Byte)
Dim Rngs(), Arr(), I As Long, K As Long
On Error Resume Next
With Sheet1
Rngs = .Range(.[A3], .[A65000].End(xlUp)).Resize(, 4).Value
End With

ReDim Arr(1 To UBound(Rngs, 1), 1 To 2)
For I = 1 To UBound(Rngs, 1)
If Rngs(I, 2) = TEMP Then
K = K + 1
Arr(K, 1) = Rngs(I, 2)
Arr(K, 2) = Rngs(I, 3)

End If

Next I

If (K > 0) Then
Sheet1.Range(Cells(3, COT), Cells(3, COT)).Resize(K, 2).Value = Arr
End If
Sheet1.Select
Range(Cells(3, COT + 2), Cells(3, COT + 2)).Select
ActiveCell.FormulaR1C1 = "=COUNTIF(R3C[-1]:R" & K + 2 & "C[-1],"">=""&RC[-1])/" & K & ""
Range(Cells(3, COT + 2), Cells(3, COT + 2)).Select
Selection.Copy
Range(Cells(3, COT + 2), Cells(2 + K, COT + 2)).Select

Selection.PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False

End Sub
 

File đính kèm

Upvote 0
Cảm ơn Thầy Phi đã viết lại code giúp em, do mới học VBA nên code của Thầy em đọc hơi khó hiểu, em nhất định sẽ từ từ nghiên cứu code của Thầy sau, nhờ Thầy gỡ rối code trên giúp em, chỗ công thức:
ActiveCell.FormulaR1C1 = "=COUNTIF(R1C6:R72C6,"">=""&RC[-1])/72"
Em muốn thay số 72 bằng biến j, nhưng không biết viết thế nào cho đúng.
 
Upvote 0
Cảm ơn Thầy Phi đã viết lại code giúp em, do mới học VBA nên code của Thầy em đọc hơi khó hiểu, em nhất định sẽ từ từ nghiên cứu code của Thầy sau, nhờ Thầy gỡ rối code trên giúp em, chỗ công thức:
ActiveCell.FormulaR1C1 = "=COUNTIF(R1C6:R72C6,"">=""&RC[-1])/72"
Em muốn thay số 72 bằng biến j, nhưng không biết viết thế nào cho đúng.

ActiveCell.FormulaR1C1 = "=COUNTIF(R1C6:R72C6,"">=""&RC[-1])/" & j & ""
thử cái này xem sao, tôi chưa có thử trên code của bạn. nhưng tôi thường xuyên sử dụng cách này để làm
 
Lần chỉnh sửa cuối:
Upvote 0
Cho mình hỏi muốn thay lệnh Range("A1:C20") bằng Range("A1:Ctong"), trong đó tong là biến số luôn thay đổi, phải viết như thế nào để VBA hiểu được mình muốn biến tong là chỉ số hàng???
Tương tự Range("'Sheet2'!$A$1:$C$20"), muốn thay số 20 là biến tong thì phải viết cú pháp sao cho đúng để VBA hiểu??
Xin cảm ơn các bạn.
Bạn xem file . Thay đổi điều kiện tại H2 và M2
 

File đính kèm

Upvote 0
Bài này mà tính toán hết trên mảng rồi đập xuống sheet 1 cái mới sướng tay.
Các bạn thử code này chơi nha
PHP:
Sub ReArrange()
Dim Data(), Res(), i, j, k, item, kk, Des As Range
Set Des = [D3]  'Có thể thay đổi ô đích đến tại chỗ này
Data = Range([B3], [C65536].End(3)).Value
With CreateObject("scripting.dictionary")
   For i = 1 To UBound(Data)
      If Not .exists(Data(i, 1)) Then
         .Add Data(i, 1), ""
      End If
   Next
   ReDim Res(1 To 65536, 1 To 3 * .Count)
   For Each item In .keys
      For i = 1 To UBound(Data)
         If item = Data(i, 1) Then
            k = k + 1
            Res(k, j + 1) = Data(i, 1)
            Res(k, j + 2) = Data(i, 2)
         End If
      Next
      For i = 1 To k
         Res(i, j + 3) = "=Countif(R3C[-1]:R" & k & "C[-1],"">=""&RC[-1])/" & k
      Next
      Des.Offset(, j + 2).Resize(k).Style = "Percent"
      kk = k
      k = 0
      j = j + 3
   Next
End With
Des.Resize(kk, UBound(Res, 2)) = Res
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bài này mà tính toán hết trên mảng rồi đập xuống sheet 1 cái mới sướng tay.
Các bạn thử code này chơi nha
PHP:
Sub ReArrange()
Dim Data(), Res(), i, j, k, item, kk, Des As Range
Set Des = [D3]  'Có thể thay đổi ô đích đến tại chỗ này
Data = Range([B3], [C65536].End(3)).Value
With CreateObject("scripting.dictionary")
   For i = 1 To UBound(Data)
      If Not .exists(Data(i, 1)) Then
         .Add Data(i, 1), ""
      End If
   Next
   ReDim Res(1 To 65536, 1 To 3 * .Count)
   For Each item In .keys
      For i = 1 To UBound(Data)
         If item = Data(i, 1) Then
            k = k + 1
            Res(k, j + 1) = Data(i, 1)
            Res(k, j + 2) = Data(i, 2)
         End If
      Next
      For i = 1 To k
         Res(i, j + 3) = "=Countif(R3C[-1]:R" & k & "C[-1],"">=""&RC[-1])/" & k
      Next
      Des.Offset(, j + 2).Resize(k).Style = "Percent"
      kk = k
      k = 0
      j = j + 3
   Next
End With
Des.Resize(kk, UBound(Res, 2)) = Res
End Sub
"Đại ca" làm giật cả mình ! theo mình thì chỉ cấn 1 cột thôi, chính đập hết xuống sheet đâm loãng !
 
Upvote 0
"Đại ca" làm giật cả mình ! theo mình thì chỉ cấn 1 cột thôi, chính đập hết xuống sheet đâm loãng !
Viết code sướng nhất là lúc đập toàn bộ xuống sheet đó. Tại vì file của khổ chủ là lấy ra hết mà.
Mà muốn đập 1 phát như thế cũng phải có chút nội công chứ giỡn sao.
 
Upvote 0
Viết code sướng nhất là lúc đập toàn bộ xuống sheet đó. Tại vì file của khổ chủ là lấy ra hết mà.
Mà muốn đập 1 phát như thế cũng phải có chút nội công chứ giỡn sao.
Thì đang nói "khổ chủ" mà, có dám nói "Đại ca" đâu ! Mình chỉ dám mon men đứng ngoài học lỏm tý . Đứng gần nhỡ "lưc dư của chưởng" ập tới là ngỏm . thôi chuồn !...code hay lắm, mình học được khối thứ từ "đại ca" đấy ! xin cám ơn !
 
Lần chỉnh sửa cuối:
Upvote 0
Bài này mà tính toán hết trên mảng rồi đập xuống sheet 1 cái mới sướng tay.
Các bạn thử code này chơi nha
PHP:
Sub ReArrange()
Dim Data(), Res(), i, j, k, item, kk, Des As Range
Set Des = [D3]  'Có thể thay đổi ô đích đến tại chỗ này
Data = Range([B3], [C65536].End(3)).Value
With CreateObject("scripting.dictionary")
   For i = 1 To UBound(Data)
      If Not .exists(Data(i, 1)) Then
         .Add Data(i, 1), ""
      End If
   Next
   ReDim Res(1 To 65536, 1 To 3 * .Count)
   For Each item In .keys
      For i = 1 To UBound(Data)
         If item = Data(i, 1) Then
            k = k + 1
            Res(k, j + 1) = Data(i, 1)
            Res(k, j + 2) = Data(i, 2)
         End If
      Next
      For i = 1 To k
         Res(i, j + 3) = "=Countif(R3C[-1]:R" & k & "C[-1],"">=""&RC[-1])/" & k
      Next
      Des.Offset(, j + 2).Resize(k).Style = "Percent"
      kk = k
      k = 0
      j = j + 3
   Next
End With
Des.Resize(kk, UBound(Res, 2)) = Res
End Sub
Code chạy đúng yêu cầu rồi, cảm ơn anh. Anh cho em hỏi thêm, nếu dữ liệu của em có hơn 65536 dòng, thậm chí có lúc gần 1 triệu dòng(dữ liệu này được xuất ra từ phần mềm), thì code phải sửa lại như thế nào cho đúng, em thử thay các số 65536 thành số 1000000 rồi, code chạy không đúng. Mong anh vui lòng giúp em. Anh xem file đính kèm nhe, do file hơi lớn nên em up lên Fshare.
http://www.fshare.vn/file/TK6QMA1CDT/
 
Upvote 0
Code chạy đúng yêu cầu rồi, cảm ơn anh. Anh cho em hỏi thêm, nếu dữ liệu của em có hơn 65536 dòng, thậm chí có lúc gần 1 triệu dòng(dữ liệu này được xuất ra từ phần mềm), thì code phải sửa lại như thế nào cho đúng, em thử thay các số 65536 thành số 1000000 rồi, code chạy không đúng. Mong anh vui lòng giúp em. Anh xem file đính kèm nhe, do file hơi lớn nên em up lên Fshare.
http://www.fshare.vn/file/TK6QMA1CDT/
Nếu code đã chạy đúng với 10 dòng thì với 1 triệu dòng cũng như nhau, chỉ có con người là khi thế này khi thế khác. Không xem file nhưng có thể đoán là cấu trúc file đã thay đổi. File up qua link khác không bao giờ mình tải về đâu.
 
Upvote 0
Code chạy đúng yêu cầu rồi, cảm ơn anh. Anh cho em hỏi thêm, nếu dữ liệu của em có hơn 65536 dòng, thậm chí có lúc gần 1 triệu dòng(dữ liệu này được xuất ra từ phần mềm), thì code phải sửa lại như thế nào cho đúng, em thử thay các số 65536 thành số 1000000 rồi, code chạy không đúng. Mong anh vui lòng giúp em. Anh xem file đính kèm nhe, do file hơi lớn nên em up lên Fshare.
http://www.fshare.vn/file/TK6QMA1CDT/
file của bạn dung lượng trên 5,5MB với trên 300000 dòng và lọc xong đập hết xuống sheet thì sửa 65536 thành 1000000 xong ngồi chờ râu mọc . Phải chờ các thày ra tay xem có thể cải thiện hơn không ! Mà với dữ liệu vậy làm sao mà kiểm tra ? khiếp !
 
Upvote 0
file của bạn dung lượng trên 5,5MB với trên 300000 dòng và lọc xong đập hết xuống sheet thì sửa 65536 thành 1000000 xong ngồi chờ râu mọc . Phải chờ các thày ra tay xem có thể cải thiện hơn không ! Mà với dữ liệu vậy làm sao mà kiểm tra ? khiếp !
Đây là dữ liệu do phần mềm đo đạc xuất ra, thời gian đo càng lâu thì dữ liệu sẽ càng lớn đó anh, nhiều khi file Excel gần 10MB, sau khi xử lý số liệu xong, em sẽ tìm giá trị nào ở cột C tính ra được 20% để lấy kết quả báo cáo. Em có nghĩ ra một cách nữa có thể làm chương trình chạy nhanh hơn: Đó là sau khi lọc xong các giá trị giống nhau ở cột B ra thành các cột khác,tiếp đến áp dụng hàm countif để tính giá trị ra %, khi nào tính được ra giá trị 20% thì ngừng lại, không cần tính ở cột đó nữa, chuyển sang cột khác tính tiếp,...em nghĩ như vậy sẽ nhanh hơn, nhưng ko biết viết code thế nào. Mong mọi người giúp đỡ.
 
Upvote 0
Đây là dữ liệu do phần mềm đo đạc xuất ra, thời gian đo càng lâu thì dữ liệu sẽ càng lớn đó anh, nhiều khi file Excel gần 10MB, sau khi xử lý số liệu xong, em sẽ tìm giá trị nào ở cột C tính ra được 20% để lấy kết quả báo cáo. Em có nghĩ ra một cách nữa có thể làm chương trình chạy nhanh hơn: Đó là sau khi lọc xong các giá trị giống nhau ở cột B ra thành các cột khác,tiếp đến áp dụng hàm countif để tính giá trị ra %, khi nào tính được ra giá trị 20% thì ngừng lại, không cần tính ở cột đó nữa, chuyển sang cột khác tính tiếp,...em nghĩ như vậy sẽ nhanh hơn, nhưng ko biết viết code thế nào. Mong mọi người giúp đỡ.
Chắc phải chờ các cao thủ cải thiện thôi bạn, trước mắt cứ sửa địa chỉ code của bạn Quang Hải đi. Máy mình cũ chạy như rùa, nếu máy bạn mới thì khá hơn .
 
Lần chỉnh sửa cuối:
Upvote 0
Đây là dữ liệu do phần mềm đo đạc xuất ra, thời gian đo càng lâu thì dữ liệu sẽ càng lớn đó anh, nhiều khi file Excel gần 10MB, sau khi xử lý số liệu xong, em sẽ tìm giá trị nào ở cột C tính ra được 20% để lấy kết quả báo cáo. Em có nghĩ ra một cách nữa có thể làm chương trình chạy nhanh hơn: Đó là sau khi lọc xong các giá trị giống nhau ở cột B ra thành các cột khác,tiếp đến áp dụng hàm countif để tính giá trị ra %, khi nào tính được ra giá trị 20% thì ngừng lại, không cần tính ở cột đó nữa, chuyển sang cột khác tính tiếp,...em nghĩ như vậy sẽ nhanh hơn, nhưng ko biết viết code thế nào. Mong mọi người giúp đỡ.
Bạn thay code này vào, trên máy mình chạy chỉ khoảng 20s cho 300 000 dòng. Nhưng vì cái công thức countif sẽ ảnh hưởng nhiều thứ lắm.
PHP:
Sub ReArrange()
Dim Data(), Res(), i, j, k, item, kk, Des As Range
Set Des = [D3]
Data = Range([B3], [C1000000].End(3)).Value
With CreateObject("scripting.dictionary")
   For i = 1 To UBound(Data)
      If Not .exists(Data(i, 1)) Then
         .Add Data(i, 1), ""
      End If
   Next
   ReDim Res(1 To 65536, 1 To 3 * .Count)
   For Each item In .keys
      For i = 1 To UBound(Data)
         If item = Data(i, 1) Then
            k = k + 1
            Res(k, j + 1) = Data(i, 1)
            Res(k, j + 2) = Data(i, 2)
         End If
      Next
      For i = 1 To k
         Res(i, j + 3) = "=Countif(R3C[-1]:R" & k + 2 & "C[-1],"">=""&RC[-1])/" & k + 2
      Next
      Des.Offset(, j + 2).Resize(k).Style = "Percent"
      kk = k
      k = 0
      j = j + 3
   Next
End With
Des.Resize(kk, UBound(Res, 2)) = Res
End Sub
 
Upvote 0
Bạn thay code này vào, trên máy mình chạy chỉ khoảng 20s cho 300 000 dòng. Nhưng vì cái công thức countif sẽ ảnh hưởng nhiều thứ lắm.
PHP:
Sub ReArrange()
Dim Data(), Res(), i, j, k, item, kk, Des As Range
Set Des = [D3]
Data = Range([B3], [C1000000].End(3)).Value
With CreateObject("scripting.dictionary")
   For i = 1 To UBound(Data)
      If Not .exists(Data(i, 1)) Then
         .Add Data(i, 1), ""
      End If
   Next
   ReDim Res(1 To 65536, 1 To 3 * .Count)
   For Each item In .keys
      For i = 1 To UBound(Data)
         If item = Data(i, 1) Then
            k = k + 1
            Res(k, j + 1) = Data(i, 1)
            Res(k, j + 2) = Data(i, 2)
         End If
      Next
      For i = 1 To k
         Res(i, j + 3) = "=Countif(R3C[-1]:R" & k + 2 & "C[-1],"">=""&RC[-1])/" & k + 2
      Next
      Des.Offset(, j + 2).Resize(k).Style = "Percent"
      kk = k
      k = 0
      j = j + 3
   Next
End With
Des.Resize(kk, UBound(Res, 2)) = Res
End Sub
Code của anh, em đọc thấy thật ngắn gọn, nhưng em chỉ hiểu được ý nghĩa chung của các vòng lặp: vòng lặp 1 là tìm dữ liệu giống nhau ở cột B, vòng lặp 2 dán dữ liệu giống nhau qua các cột khác, vòng lặp 3 tính ra phần trăm, ko biết em hiểu vậy đúng ko nữa? Nhưng em ko hiểu ý nghĩa chi tiết của từng dòng code, em có thử đọc phần Help trong VBA, nhưng vẫn ko hiểu! xin các anh chị vui lòng giải thích các dòng code giúp em với.
 
Upvote 0

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

Back
Top Bottom