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:
Nhờ giải thích giùm ý nghĩa đoạn code !

range("H12:I13").Select
Selection.AutoFill Destination:=Range(Cells(12, 8), Cells(n, 9)), Type:=xlFillDefault
 
Upvote 0
đoạn code trên của bác chưa đủ, vì cells(n,9) phải khai báo n là cái gì?
 
Upvote 0
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
Nếu dữ liệu của bạn < 65.000 dòng thì hai đoạn code trên là tương đương.
Khi dữ liệu >=65.000 dòng thì Khác biệt sẽ thấy rõ đấy bạn à! Bạn hãy thử với hai đoạn code sau (chép vào sheet, không chép vào module), rồi cho chạy SUB này để thấy sự khác biệt.
PHP:
Sub Test()
a = Cells(Cells.Rows.Count, 1).End(xlUp).Row
b = [A65000].End(xlUp).Row
MsgBox a
MsgBox b
End Sub
 
Upvote 0
Bạn vào VBA nhấn Ctrl + G rồi gõ thử đoạn sau:
PHP:
?Cells.Rows.Count
Khi nhấn Enter sẽ thấy có thêm dòng bên dưới ghi là: 65536
Tức là số dòng mà bảng tính có thể ghi dữ liệu luôn.
Nhưng do ít ai dùng đến mức như vậy, nên mình sẽ chọn code sau xem vì code sau sẽ ngắn hơn 1 chút mà tính chất gần như nhau,
Thân.
 
Upvote 0
Xin cảm ơn ! nguyên đoạn code là như sau :

PHP:
Private Sub CommandButton1_Click()
    Sheets("Solieu").Range("A4:F10000").Copy
    Range("A12").Select
    Selection.PasteSpecial Paste:=xlPasteValues
    Dim n, i, dau As Integer
     n = 12
    Do While Cells(n, "A") <> ""
        n = n + 1
    Loop
    n = n - 1
    Range("H12:I13").Select
    Selection.AutoFill Destination:=Range(Cells(12, 8), Cells(n, 9)), Type:=xlFillDefault
    Range("N13:AJ13").Select
    Selection.AutoFill Destination:=Range(Cells(13, 14), Cells(n, 36)), Type:=xlFillDefault
    i = 12
    dau = 12
    For i = dau To n
        If Cells(i, "A") <> Cells(i + 1, "A") Then
            Cells(dau, "G") = Cells(i, "B")
            Range(Cells(dau, "G"), Cells(dau, "G")).Select
            Selection.AutoFill Destination:=Range(Cells(dau, "G"), Cells(i, "G")), _
                   Type:=xlFillDefault
            dau = i + 1            
        End If
    Next i
    Range("A14").Select
End Sub
nhưng mà mình không hiểu được đoạn này nói gì nhờ các bác giải thích giúp :

Selection.AutoFill Destination:=Range(Cells(12, 8), Cells(n, 9)), Type:=xlFillDefault
Range("N13:AJ13").Select
Selection.AutoFill Destination:=Range(Cells(13, 14), Cells(n, 36)), Type:=xlFillDefault
 
Upvote 0
nhưng mà mình không hiểu được đoạn này nói gì nhờ các bác giải thích giúp :

Selection.AutoFill Destination:=Range(Cells(12, 8), Cells(n, 9)), Type:=xlFillDefault
Range("N13:AJ13").Select
Selection.AutoFill Destination:=Range(Cells(13, 14), Cells(n, 36)), Type:=xlFillDefault

Bạn mở Excel lên
Tại ô A2 nhap vao = A1+1
Tại ô B2 nhap vao = A2*2
Vào Tools/Macro/Record New Macro/OK
Chọn vùng A2:B2
đưa chuột về bên phải, ở phía dưới vùng chọn, đến khi xuất hiện dấu + thì ấn vào và kéo xuống đến B6
Vào Tools/Macro/Stop Recording
Ấn F11 vào Code
Mở Module1 lên xem, trong macro 1 là cái bạn cần tìm đố. Đến đây là bạn đã hiểu tác dụng của nó rồi.
Thân chào.
GPE giup mình đoạn Code của mình với, nó nằm trong link này
http://www.giaiphapexcel.com/forum/showthread.php?p=108674#post108674
 
Lần chỉnh sửa cuối:
Upvote 0
Cơ bạn là đây:
Khi viết địa chỉ cũa 1 cell, người ta thường dùng 2 cách:
1> Range("A10") ---> cái này rất gần gữi với công thức, đang muốn nói đến cell A10
2> Cells(10,1) ----> Đang muốn nói đến 1 cell có chỉ số dòng =10 và chỉ số cột =1 --> tức vẩn là A10
cách 1 người ta viết tắt luôn thành [A10]
Vậy:
Cells.Rows.Count là đếm toàn bộ số dòng có trong bảng tính
- Với Excel2003 trở về trước thì giá trị này = 65536 ---> Cells(Cells.Rows.Count, 1) ~ Cells(65536,1) ~ Range("A65536") ~ [A65536]
- Với Excel2007 thì giá trị này = 1048576 ---> Cells(Cells.Rows.Count, 1) ~ Cells(1048576,1) ~ Range("A1048576") ~ [A1048576]
Từ đó suy tiếp nhé
 
Upvote 0
Code Copy

Cho mình hỏi về Code Copy? Vì có bạn hỏi mình, mình làm hoài không ra. nên mạo muội hỏi GPE
1. Đứng ở Sheet1 mình muốn copy 1 vùng A1:B2 sang Sheet2.[B2].với giá trị Value (Không copy Format Cell)??? (Copy va Paste trong khi vẫn ở Sheet1 không Active sheet2)
2. Tương tự như vậy mình đứng ở Sheet 2 muốn copy vùng A1:B2 của Sheet1 qua Sheet2 tại cell B2 , chỉ paste value (không format)???
 
Upvote 0
Cho mình hỏi về Code Copy? Vì có bạn hỏi mình, mình làm hoài không ra. nên mạo muội hỏi GPE
1. Đứng ở Sheet1 mình muốn copy 1 vùng A1:B2 sang Sheet2.[B2].với giá trị Value (Không copy Format Cell)??? (Copy va Paste trong khi vẫn ở Sheet1 không Active sheet2)
2. Tương tự như vậy mình đứng ở Sheet 2 muốn copy vùng A1:B2 của Sheet1 qua Sheet2 tại cell B2 , chỉ paste value (không format)???

Bạn dùng đoạn code sau (chép vào Module) và có thể gán phím tắt để chạy code:
PHP:
Sub TestCopy()
    Sheets("Sheet1").[A1:B2].Copy: Sheets("Sheet2").[B2].PasteSpecial _
           Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn dùng đoạn code sau (chép vào Module) và có thể gán phím tắt để chạy code:
PHP:
Sub TestCopy()
    Sheets("Sheet1").[A1:B2].Copy: Sheets("Sheet2").[B2].PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End Sub
Tôi thì dùng cái này thay ít chiếm bộ nhơ hơn.
PHP:
 Sub Test()
iRow = Sheets("Sheet1").[A1:B2].Row
iCol = Sheets("Sheet1").[A1:B2].Column
With Sheets("Sheet2")
    .[B2].Resize(iRow, iCol).Value = Sheets("Sheet1").[A1:B2].Value
End With
End Sub
 
Upvote 0
Hỏi về 1 lỗi Erorr Copy?

Mình đã làm theo cách bạn Ca_dafi, nhưng file của mình vẫn còn bị Error, Mình gởi file cho các bạn kiểm tra nhé
1. Đứng ở Sheet TaoPw thì Run Ok
2. Đứng ở Sheet DangKy thì Run Error, thế mới lạ chứ (trong khi câu lệnh là tổng quát)
PHP:
Sub CopyError()
  Sheets("TaoPw").Range([A2], [B65536].End(xlUp)).Copy
  Sheets("DangKy").[A2].PasteSpecial Paste:=xlPasteValues
  MsgBox "Copy thanh cong"
End Sub
 

File đính kèm

  • Copy Hoi GPE.rar
    8.5 KB · Đọc: 146
Upvote 0
Không nên tạo Sub ở Sheet nào bạn ạ, như vậy rất khó cho bạn.

Nên tạo ra các Sub ở Module, nó sẽ có tác dụng trên mọi Sheet.

Khi đó
1. Đứng ở Sheet1 mình muốn copy 1 vùng A1:B2 sang Sheet2.[B2].với giá trị Value (Không copy Format Cell)??? (Copy va Paste trong khi vẫn ở Sheet1 không Active sheet2)

Thì chỉ cần :
PHP:
Sheet2.Range("B2:C3").Value = Sheet1.Range("A1:B2").Value
2. Tương tự như vậy mình đứng ở Sheet 2 muốn copy vùng A1:B2 của Sheet1 qua Sheet2 tại cell B2 , chỉ paste value (không format)???
PHP:
Sheet1.Range("A1:B2").Value = Sheet2.Range("B2:C3").Value
Khi đó bạn muốn đứng trên Sheet nào thì chỉ cần cho Sheet đó Active là được.

Xin chào!
 
Upvote 0
Mình đã làm theo cách bạn Ca_dafi, nhưng file của mình vẫn còn bị Error, Mình gởi file cho các bạn kiểm tra nhé
1. Đứng ở Sheet TaoPw thì Run Ok
2. Đứng ở Sheet DangKy thì Run Error, thế mới lạ chứ (trong khi câu lệnh là tổng quát)
Sub CopyError()
Sheets("TaoPw").Range([A2], [B65536].End(xlUp)).Copy <===Sai chỗ này
Sheets("DangKy").[A2].PasteSpecial Paste:=xlPasteValues
MsgBox "Copy thanh cong"
End Sub

Bạn sửa lại code như sau:
PHP:
Sub CopyError()
  Sheets("TaoPw").Range("A2:B" & Sheets("TaoPw").[B65536].End(xlUp).Row).Copy
  Sheets("DangKy").[A2].PasteSpecial Paste:=xlPasteValues
  MsgBox "Copy thanh cong"
End Sub
 
Upvote 0
Mình đã làm theo cách bạn Ca_dafi, nhưng file của mình vẫn còn bị Error, Mình gởi file cho các bạn kiểm tra nhé
1. Đứng ở Sheet TaoPw thì Run Ok
2. Đứng ở Sheet DangKy thì Run Error, thế mới lạ chứ (trong khi câu lệnh là tổng quát)
PHP:
Sub CopyError()
  Sheets("TaoPw").Range([A2], [B65536].End(xlUp)).Copy
  Sheets("DangKy").[A2].PasteSpecial Paste:=xlPasteValues
  MsgBox "Copy thanh cong"
End Sub


Bạn sửa lại :
PHP:
Sub CopyErrorSua()
    Dim iC As Long
    iC = Sheet1.Range("B65000").End(xlUp).Row
    If iC < 2 Then Exit Sub
    Sheet2.Range("A2:B" & iC).Value = Sheet1.Range("A2:B" & iC).Value
    MsgBox "Copy thanh cong"
End Sub
Code trên của bạn chưa tường minh về khai báo, hơn nữa thiếu 1 dòng lệnh giải phóng bộ nhớ khi Copy xong



Chúc vui.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình đã làm theo cách bạn Ca_dafi, nhưng file của mình vẫn còn bị Error, Mình gởi file cho các bạn kiểm tra nhé
1. Đứng ở Sheet TaoPw thì Run Ok
2. Đứng ở Sheet DangKy thì Run Error, thế mới lạ chứ (trong khi câu lệnh là tổng quát)
PHP:
Sub CopyError()
  Sheets("TaoPw").Range([A2], [B65536].End(xlUp)).Copy
  Sheets("DangKy").[A2].PasteSpecial Paste:=xlPasteValues
  MsgBox "Copy thanh cong"
End Sub

Nên tường minh một chút. Code của bạn sai ở [B65536].End(xlUp), phải thêm .row
Tôi thì thích dùng như sau:
PHP:
Sub CopyRng()
Dim eRow As Long, iCol As Long, Data As Range
Sheets("TaoPw").Select
eRow = [B65000].End(xlUp).Row
Set Data = Range("A2:B" & eRow)
iCol = Data.Columns.Count
With Sheets("DangKy")
    .[A2].Resize(eRow - 1, iCol).Value = Data.Value
End With
End Sub
 
Upvote 0
Tôi thì dùng cái này thay ít chiếm bộ nhơ hơn.
Sub Test()
1 iRow = Sheets("Sheet1").[A1:B2].Row
2 iCol = Sheets("Sheet1").[A1:B2].Column
3 With Sheets("Sheet2")
4 .[B2].Resize(iRow, iCol).Value = Sheets("Sheet1").[A1:B2].Value
5 End With
6 End Sub
Đã Test và phân tích lỗi sai Code này. Không hiểu ý bạn TN nói ít chiếm bộ nhớ ..., Mình thì thấy nó thêm Biến iRow, iCol là tốn thêm bộ nhớ ...không biết suy nghi vay dung ko?
1. và 2. Không phải xuất ra số hàng và cột của [A1:B2] mà là xuất ra xuất ra hàng và cột của ActiveCell cũa [A1:B2], nghĩa là Cell A1 => iRow=1, iCol=1
4. Khi đó [B2].resize(1,1) vẫn là [B2] => Kết quả là copy qua Sheet 2 chỉ Past được đúng 1 Cell B2.
 
Upvote 0
PHP:
Sub CopyRng()
Dim eRow As Long, iCol As Long, Data As Range
Sheets("TaoPw").Select
eRow = [B65000].End(xlUp).Row
Set Data = Range("A2:B" & eRow)
iCol = Data.Columns.Count
With Sheets("DangKy")
    .[A2].Resize(eRow - 1, iCol).Value = Data.Value
End With
End Sub
Do không xem kỹ, nhưng cái này co OK không. Từ A2 lấy eRow - 1 dòng và iCol cột
lúc này
eRow=5, iCol=2
.[A2].Resize(eRow - 1, iCol) # [a2:B4]
Bạn test hộ mình nhé!
 
Upvote 0
Đây là cách làm truyền thống mà. nhưng mình bổ sung 1 tý cho no pro. vì 1 cách tổng quát thì eRow -1 không còn hợp lệ. Mình thay iRow cho nó
PHP:
iCol = Data.Columns.Count
iRow = Data.Rows.Count
With Sheets("DangKy")
    .[A2].Resize(iRow, iCol).Value = Data.Value
End With
Mình có lệnh này mình thấy sao tác dụng của nó cũng gần giống với các lệnh trên, không biết nó có sự khác biệt nhau chổ nào không?
PHP:
iRow = Data.Rows.Count
iRow = UBound(Data.Value, 1)
Sự khác biệt của 2 lệnh trên là gi?
 
Upvote 0
Cách nhận biết những câu lệnh đang chiếm giữ bộ nhớ ?

Chào các bạn! nhờ các bạn vui lòng chỉ giúp cách nhận biết những câu lệnh trong code đang chiếm giữ bộ nhớ; câu lệnh để giải phóng bộ nhớ và vị trí đặt chúng trong code (ví dụ trong đoạn code sau thì viết như thế nào ?).
Mã:
[COLOR=#000000][COLOR=#0000bb]Sub CopyError[/COLOR][COLOR=#007700]()
  [/COLOR][COLOR=#0000bb]Sheets[/COLOR][COLOR=#007700]([/COLOR][COLOR=#dd0000]"TaoPw"[/COLOR][COLOR=#007700]).[/COLOR][COLOR=#0000bb]Range[/COLOR][COLOR=#007700]([[/COLOR][COLOR=#0000bb]A2[/COLOR][COLOR=#007700]], [[/COLOR][COLOR=#0000bb]B65536[/COLOR][COLOR=#007700]].[/COLOR][COLOR=#0000bb]End[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000bb]xlUp[/COLOR][COLOR=#007700])).[/COLOR][COLOR=#0000bb]Copy
  Sheets[/COLOR][COLOR=#007700]([/COLOR][COLOR=#dd0000]"DangKy"[/COLOR][COLOR=#007700]).[[/COLOR][COLOR=#0000bb]A2[/COLOR][COLOR=#007700]].[/COLOR][COLOR=#0000bb]PasteSpecial Paste[/COLOR][COLOR=#007700]:=[/COLOR][COLOR=#0000bb]xlPasteValues
  MsgBox [/COLOR][COLOR=#dd0000]"Copy thanh cong"
[/COLOR][COLOR=#0000bb]End Sub  [/COLOR][/COLOR]
Code trên của bạn chưa tường minh về khai báo, hơn nữa thiếu 1 dòng lệnh giải phóng bộ nhớ khi Copy xong[FONT=&quot]

[/FONT]Xin cảm ơn !
 
Lần chỉnh sửa cuối:
Upvote 0
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom