Những câu hỏi về code, xin giải thích các code, đề nghị các bạn gửi vào đây

Liên hệ QC
Status
Không mở trả lời sau này.

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Kể từ hôm nay, tất cả những câu hỏi nhờ giải thích dùm một đoạn code, hay là hỏi những vấn đề linh tinh gì liên quan đến cách viết code, đề nghị các bạn gửi chung vào đây.

Những đề tài mới với tiêu đề: "Nhờ giải thích dùm đoạn code", mà không nói rõ là code gì, code dùng để làm gì, sẽ bị xóa.

BQT

----------------------------------------------------------------------------------------------------------------


Em xin được hỏi 2 đoạn code sau có tương đương nhau ?

Cells(Cells.Rows.Count, 1).End(xlUp).Row có tương đương với [A65000].End(xlup).row

Cám ơn các anh chỉ giáo
 
Chỉnh sửa lần cuối bởi điều hành viên:
Ví dụ tôi muốn dùng code để gán công thức cho ô A1 là =IF(B1="";C1;D1)
Đang đứng tại ô B1, tôi viết code là ActiveCell.Offset(0, -1).Formula = "=IF(B" & ActiveCell.Row & "="";C" & ActiveCell.Row & ";D" & ActiveCell.Row & ")"
Thì bị lỗi nhờ các AE giúp!
Vầy mới đúng anh ơi:
PHP:
ActiveCell.Offset(0, -1).Formula = "=IF(B" & ActiveCell.Row & "="""";C" & ActiveCell.Row & ";D" & ActiveCell.Row & ")"
Hoặc đặt ActiveCell ra làm "thừa số chung" như vầy:
PHP:
With ActiveCell
  .Offset(0, -1).Formula = "=IF(B" & .Row & "="""";C" & .Row & ";D" & .Row & ")"
End With
(gọn hơn)
----------------------------------
Còn em thì thích dùng vầy:
PHP:
ActiveCell.Offset(0, -1).Value = "=IF(RC[1] ="""";RC[2];RC[3])"
Chú ý: Hãy coi chừng chuổi trong công thức, tức trong công thức có cặp dấu "" ---> tốt nhất anh nên record macro xem code nó viết thế nào mà bắt chước
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy chỉ việc thay "" thành """" là được phải không? lạ nhỉ, cách của ndu gọn thật nhưng mình chưa quen, rồi để mình sẽ thay đổi "tư duy".
Còn một điều lạ nữa là mình phải viết dấu "," chớ viết dấu ";" như trong excel nó cũng không hiểu
 
Upvote 0
Vậy chỉ việc thay "" thành """" là được phải không? lạ nhỉ, cách của ndu gọn thật nhưng mình chưa quen, rồi để mình sẽ thay đổi "tư duy".
Còn một điều lạ nữa là mình phải viết dấu "," chớ viết dấu ";" như trong excel nó cũng không hiểu
Cái vụ RC này rất hay đấy anh ---> Nó cũng gần tương đương với Offset đấy
Ví dụ: RC[1] nghĩa là: Dòng giữ nguyên, dịch cột sang phải 1 đơn vị (tính từ vị trí cell chứa công thức) ---> tương đương với Offset(,1)
Ngoài ra, anh dùng kiểu RC thì anh có thể điền 1 lần công thức cho nguyên cột hoặc nguyên dòng luôn... trong khi viết theo kiểu của anh thì phải dùng vòng lập For
Lấy ví dụ điền công thức trên cho A1:A10, em viết như sau:
PHP:
Range("A1:A10").Value = "=IF(RC[1] ="""",RC[2],RC[3])"
Sướng không? Ẹc... Ẹc...
 
Upvote 0
nhờ các bác viết cho em macro như thế này nhé.
trước hết là em muốn làm hypre link theo thứ tự lần lượt từ A1 đến A... ???? xong rồi gán hypre link ở cột A sang cột B theo thứ tự nhưng chữ vẫn giữ nguyên các bác giúp em với.
phai ví dụ: http://www.mediafire.com/?9d4izgizald13fn
+-+-+-+
 
Upvote 0
híc, Mình có đoạn code do GPE viết về tính tổng các số thực hiện được với số liệu khoảng hơn 200 dòng nhưng khi mình tăng thêm số dòng thì thông báo lỗi như sau:

Sub TinhTong2()
Const FRow = 4
Dim Arr(), ArrKQ()
Dim endR As Long, endC As Long, i As Long, j As Long, k As Long, s As Long
With Sheet1
endR = .Cells(65000, 1).End(xlUp).Row - FRow + 1
endC = .Cells(3, 500).End(xlToLeft).Column
Arr = .Range("A4").Resize(endR, endC).Value
End With
endR = UBound(Arr, 1): endC = UBound(Arr, 2)
ReDim ArrKQ(1 To endR * endR, 1 To endC): s = 0
For i = 1 To endR - 1
For j = i + 1 To endR
s = s + 1
If s > 65536 - FRow Then GoTo Exit_Sub
For k = 1 To endC
ArrKQ(s, k) = (Arr(i, k) + Arr(j, k)) Mod 10
Next k
Next j
Next i
Exit_Sub:
With Sheet2
.Range("A4").Resize(s, endC) = ArrKQ
End With
Erase Arr(), ArrKQ()
End Sub

Mình có mò sửa đôi chỗ nhưng không được! Mong GPE xem giúp đỡ sửa hay thay đổi thông số ở phần nào của code để có thể thực hiện được với dữ liệu khoảng 1000 dòng và 500 cột ?
Mình gửi kèm theo file! Xin cảm ơn!
 

File đính kèm

  • Tim_don_vi_tong_vi_tri.rar
    54.3 KB · Đọc: 30
Upvote 0
ReDim ArrKQ(1 To endR * endR, 1 To endC)

1000 * 1000 là 1 triệu, vượt quá số dòng của Excel 2003. Tuy vậy đã có câu lệnh bẫy lỗi

If s > 65536 - FRow Then GoTo Exit_Sub

Nếu bạn không muốn bẫy lỗi để chạy cho đủ kết quả thì không được.

Còn EndC mà hơn 256 thì thua chắc. Bạn phải chuyển qua dùng Excel 2007 hoặc 2010.
 
Upvote 0
ReDim ArrKQ(1 To endR * endR, 1 To endC)

1000 * 1000 là 1 triệu, vượt quá số dòng của Excel 2003. Tuy vậy đã có câu lệnh bẫy lỗi

If s > 65536 - FRow Then GoTo Exit_Sub

Nếu bạn không muốn bẫy lỗi để chạy cho đủ kết quả thì không được.

Còn EndC mà hơn 256 thì thua chắc. Bạn phải chuyển qua dùng Excel 2007 hoặc 2010.

Vâng! Cảm ơn bạn! Mình đang dùng Excel 2007, vậy Có cách nào thực hiện được không ạ?
 
Upvote 0
Giới hạn của bộ nhớ của máy làm giới hạn số dòng có thể tính toán cho Array.

Trên máy cùn của tôi thì số dòng của 1 biến Aray chỉ khoảng 250.000 dòng.
Nếu để nguyên code thì giới hạn data là 495 dòng
Nếu tăng số cột lên thì còn ít nữa.

Nếu thay Redim vừa đủ (ThuNghi Redim dư quá, hơn gấp đôi sự cần thiết), sẽ được tối đa 708 dòng (trên máy của tôi):

ReDim ArrKQ(1 To (endR * (endR) / 2), 1 To endC)

Ngoài ra, tạm bỏ câu bẫy lỗi If s > 65536 - FRow

Bạn thử trên máy mình xem được bao nhiêu?
 
Lần chỉnh sửa cuối:
Upvote 0
Giới hạn của bộ nhớ của máy làm giới hạn số dòng có thể tính toán cho Array.

Trên máy cùn của tôi thì số dòng của 1 biến Aray chỉ khoảng 250.000 dòng.
Nếu để nguyên code thì giới hạn data là 495 dòng
Nếu tăng số cột lên thì còn ít nữa.

Nếu thay Redim vừa đủ (ThuNghi Redim dư quá, hơn gấp đôi sự cần thiết), sẽ được tối đa 708 dòng (trên máy của tôi):

ReDim ArrKQ(1 To (endR * (endR) / 2), 1 To endC)

Ngoài ra, tạm bỏ câu bẫy lỗi If s > 65536 - FRow

Bạn thử trên máy mình xem được bao nhiêu?
Vậy thì dùng Transpose thôi, thay vì
ReDim ArrKQ(1 To endR * endR, 1 To endC)
Thì
ReDim Preserve ArrKQ(1 To endC, 1 To s)
Code sau chạy với > 1000 dòng và 500 cột nhưng mới chạy dc kq là 30.000 dòng là thấy phê rồi.
Còn không thì làm ra dòng nào thì xóa và làm lại next.
PHP:
Sub TinhTong2()
Const FRow = 3: Const endRow = 100000: Const endCol = 500
Dim Arr(), ArrKQ()
Dim endR As Long, endC As Long, i As Long, j As Long, k As Long, s As Long
With Sheet1
  endR = .Cells(endRow, 1).End(xlUp).Row - FRow
  endC = .Cells(FRow, endCol).End(xlToLeft).Column
  Arr = .Range("A4").Resize(endR, endC).Value
End With
endR = UBound(Arr, 1): endC = UBound(Arr, 2)
'ReDim ArrKQ(1 To endR * endR, 1 To endC)
s = 0
For i = 1 To endR - 1
  For j = i + 1 To endR
    s = s + 1
    ReDim Preserve ArrKQ(1 To endC, 1 To s)
    For k = 1 To endC
      ArrKQ(k, s) = (Arr(i, k) + Arr(j, k)) Mod 10
    Next k
  Next j
Next i
With Sheet2
  .Range("A4").Resize(s, endC) = WorksheetFunction.Transpose(ArrKQ)
End With
Erase Arr(), ArrKQ()
End Sub
Kg can đảm test.
 
Upvote 0
Sub TinhTong2()
Const FRow = 3: Const endRow = 100000: Const endCol = 500
Dim Arr(), ArrKQ()
Dim endR As Long, endC As Long, i As Long, j As Long, k As Long, s As Long
With Sheet1
endR = .Cells(endRow, 1).End(xlUp).Row - FRow
endC = .Cells(FRow, endCol).End(xlToLeft).Column
Arr = .Range("A4").Resize(endR, endC).Value
End With
endR = UBound(Arr, 1): endC = UBound(Arr, 2)
ReDim ArrKQ(1 To endR * endR, 1 To endC)
s = 0
For i = 1 To endR - 1
For j = i + 1 To endR
s = s + 1
ReDim Preserve ArrKQ(1 To endC, 1 To s)
For k = 1 To endC
ArrKQ(k, s) = (Arr(i, k) + Arr(j, k)) Mod 10
Next k
Next j
Next i
With Sheet2
.Range("A4").Resize(s, endC) = WorksheetFunction.Transpose(ArrKQ)
End With
Erase Arr(), ArrKQ()
End Sub

Vâng! Cảm ơn Các bạn rất nhiều! Nhưng khi mình chạy thử với dữ liệu 1000 dòng và 500 cột vẫn thấy báo lỗi luôn như trên bạn àh!
 
Lần chỉnh sửa cuối:
Upvote 0
Xoá bỏ dòng màu cam đó đi.
 
Upvote 0
Em có đoạn code này, mong được các anh giải thích dùm, hjc
Mã:
Public Sub PN()
Dim Vung, iCot, iHang, iTong, I, J, K, Hang, Heso, Vong, Sl
Set Vung = [a1].CurrentRegion
iCot = [j2].End(xlToLeft).Column:  iHang = Vung.Rows.Count - 1:   Heso = 1
    For I = 1 To iCot
       Set Hang = Range(Cells(2, I), Cells(9, I).End(xlUp))
        Heso = Heso * Hang.Rows.Count
    Next I
        Vong = 1: Sl = Heso
        For I = 1 To iCot
            Set Hang = Range(Cells(2, I), Cells(9, I).End(xlUp))
            Heso = Heso / Hang.Rows.Count
            For K = 1 To Vong
                For J = 1 To Hang.Rows.Count
                    Cells(10000, 10 + I).End(xlUp)(2).Resize(Heso) = Hang(J)
                Next J
            Next K
                Vong = Vong * Hang.Rows.Count
        Next I
        MsgBox "So luong liêt kê: " & Sl
End sub
Đây là code tổ hợp, xem thêm ở đây:
http://www.giaiphapexcel.com/forum/showthread.php?46200-T%C3%ADnh-t%E1%BB%95-h%E1%BB%A3p-b%E1%BA%B1ng-Excel&p=297640
Em nhìn vào code này không hiểu được cách suy nghĩ của tác giả, vì vậy mong mọi người giải thích dùm, hjc, có nhiều chỗ em không hiểu.
Vi dụ chỗ này chẳng hạn:
Mã:
Cells(10000, 10 + I).End(xlUp)(2).Resize(Heso) = Hang(J)
số 2 ở trên nghĩa là gì, hàm resize có tác dụng gì ạ, hjc
 
Upvote 0
Xoá bỏ dòng màu cam đó đi.

Hic, bạn Ptm ơi! Mình đã xóa bỏ dòng màu cam đó đi rồi và chạy được tầm 4 giờ đồng hồ ( nhâm nhi hết 3tách coffee) thì lại thấy màu cam tếp bạn àh:
Sub TinhTong2()
Const FRow = 3: Const endRow = 100000: Const endCol = 500
Dim Arr(), ArrKQ()
Dim endR As Long, endC As Long, i As Long, j As Long, k As Long, s As Long
With Sheet1
endR = .Cells(endRow, 1).End(xlUp).Row - FRow
endC = .Cells(FRow, endCol).End(xlToLeft).Column
Arr = .Range("A4").Resize(endR, endC).Value
End With
endR = UBound(Arr, 1): endC = UBound(Arr, 2)
s = 0
For i = 1 To endR - 1
For j = i + 1 To endR
s = s + 1
ReDim Preserve ArrKQ(1 To endC, 1 To s)
For
k = 1 To endC
ArrKQ(k, s) = (Arr(i, k) + Arr(j, k)) Mod 10
Next k
Next j
Next i
With Sheet2
.Range("A4").Resize(s, endC) = WorksheetFunction.Transpose(ArrKQ)
End With
Erase Arr(), ArrKQ()
End Sub
Mong Ptm và các bạn giúp đỡ! Xin chân thành cảm ơn!
 
Upvote 0
Hic, bạn Ptm ơi! Mình đã xóa bỏ dòng màu cam đó đi rồi và chạy được tầm 4 giờ đồng hồ ( nhâm nhi hết 3tách coffee) thì lại thấy màu cam tếp bạn àh:

Mong Ptm và các bạn giúp đỡ! Xin chân thành cảm ơn!
1/ Chả hiểu mất nếu dùng transpose thì số dòng cho phép không > 65.536 dòng
Vậy mình thêm vào 1 dòng if
PHP:
If s = 65536 Then
      With Sheet2
        .Range("A4").Offset(nR, 0).Resize(s, endC) = WorksheetFunction.Transpose(ArrKQ)
      End With
      nR = nR + s: s = 0
      Erase ArrKQ()
    End If
Và code sẽ như sau:
PHP:
Sub TinhTong2()
Const FRow = 3: Const endRow = 100000: Const endCol = 500
Dim Arr(), ArrKQ()
Dim endR As Long, endC As Long, i As Long, j As Long, k As Long, s As Long, nR As Long
Dim T As Double
T = Timer
With Sheet1
  endR = 1000 '.Cells(endRow, 1).End(xlUp).Row - FRow
  endC = 1 '.Cells(FRow, endCol).End(xlToLeft).Column
  Arr = .Range("A4").Resize(endR, endC).Value
End With
endR = UBound(Arr, 1): endC = UBound(Arr, 2)
s = 0: nR = 0
For i = 1 To endR - 1
  For j = i + 1 To endR
    s = s + 1
    ReDim Preserve ArrKQ(1 To endC, 1 To s)
    For k = 1 To endC
      ArrKQ(k, s) = (Arr(i, k) + Arr(j, k)) Mod 10
    Next k
    If s = 65536 Then
      With Sheet2
        .Range("A4").Offset(nR, 0).Resize(s, endC) = WorksheetFunction.Transpose(ArrKQ)
      End With
      nR = nR + s: s = 0
      Erase ArrKQ()
    End If
  Next j
Next i
With Sheet2
  .Range("A4").Offset(nR, 0).Resize(s, endC) = WorksheetFunction.Transpose(ArrKQ)
End With
'TC s= 499.500 rows'
Erase Arr(), ArrKQ()
MsgBox Timer - T
End Sub

2/ Tôi test thử với 1000 dòng và 1 cột thì KQ là 499.500 dòng và 1 cột thấy muốn phê, còn với 500 cột thì hên xui.
PHP:
T = Timer
With Sheet1
  endR = 1000 '.Cells(endRow, 1).End(xlUp).Row - FRow
  endC = 1 '.Cells(FRow, endCol).End(xlToLeft).Column
  Arr = .Range("A4").Resize(endR, endC).Value
End With
Sửa lại endR và endC.
 
Upvote 0
1/ Chả hiểu mất nếu dùng transpose thì số dòng cho phép không > 65.536 dòng
Vậy mình thêm vào 1 dòng if
.
- Cảm ơn bạn ThuNghi nhiều! Cảm ơn GPE đã giúp đỡ!
Híc! Đúng là khủng khiếp thật! Mình test thử mà...cuối cùng phải dùng biện pháp tắt máy! Nhưng sao lại như vậy nhỉ? Nếu chạy hết thì dữ liệu của file chỉ đội lên hơn 50Mb thôi mà?
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Mới bắt dầu viết Code

em mới bắt đầu viết VBA trong excel.Em muồn viết 1 code như sau:
ô A1 : 2*3*4*...+.....
ô A2 : la 1 code sau cho bằng tổng của ô A1
Mong các anh chỉ giáo dùm em
 
Upvote 0
Đề bài của bạn khó mà hiểu nổi

Hay mình bạo gan dịch tiếng Việt sang tiếng Việt xem đúng không nha:

Ở [A1] là 1 số nguyên dương<>0
Hãy viết code hay hàm trả về tại [A2] là tổng các số liên tục từ 0 cho đến số i?!
 
Upvote 0
em mới bắt đầu viết VBA trong excel.Em muồn viết 1 code như sau:
ô A1 : 2*3*4*...+.....
ô A2 : la 1 code sau cho bằng tổng của ô A1
Mong các anh chỉ giáo dùm em
Diễn giải lại:
- A1 là 1 biểu thức toán học (chẳng hạn 2*3*4 + 5*6)
- A2 là kết quả của biểu thức trên

-------------
Diễn giải vậy có đúng không?
 
Upvote 0
Tôi muốn tạo một đường kẻ phía phía dưới control thứ 2 của Menu chuột phải (trong cell) tôi đã viết code thế này:
Mã:
----------------
Dim Bar As CommandBarButton
For Each Bar In Application.CommandBars("Cell").Controls
    If Bar.Index = 3 Then Bar.BeginGroup = True
Next
----------------
(Là do hai controls đầu do mình tạo ra)

Hỏi: Có cách nào gọn hơn không? xin được các Bạn chỉ giáo!
 
Upvote 0
Tôi muốn tạo một đường kẻ phía phía dưới control thứ 2 của Menu chuột phải (trong cell) tôi đã viết code thế này:
Mã:
----------------
Dim Bar As CommandBarButton
For Each Bar In Application.CommandBars("Cell").Controls
    If Bar.Index = 3 Then Bar.BeginGroup = True
Next
----------------
(Là do hai controls đầu do mình tạo ra)

Hỏi: Có cách nào gọn hơn không? xin được các Bạn chỉ giáo!
Thế sao anh không viết vầy:
PHP:
CommandBars("Cell").Controls(3).BeginGroup = True
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT

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

Back
Top Bottom