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 (7 người xem)

  • Thread starter Thread starter ST-Lu!
  • Ngày gửi Ngày gửi
Liên hệ QC

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

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

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
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ã:
[FONT=&quot]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[/FONT]
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 !

Code này không có copy gì cả bạn à! Mà là gán giá trị của một vùng bằng giá trị của một vùng khác tương ứng! Nên không cần phải giải phóng bộ nhớ gì cả. Code bên trên đã tường minh rồi. Bạn còn muốn khai báo thêm gì nữa!?

From TrungChinh:
Cảm ơn Ca_difi ! mình lấy ví dụ từ bài 15 nhưng copy nhầm code (đã sửa lại). Ý mình muốn hỏi: cách chung hoặc tổng quát để 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.
Thanks !
 
Upvote 0
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.

Cần gì phải giải phóng bộ nhớ, chỉ cần dùng:

application.cutcopymode=false

là ỌK!!!
 
Upvote 0
Nhờ giải thích giùm dòng code !

Mình có đoạn code :

Mã:
[B]Private Sub CommandButton1_Click()[/B]
[COLOR="Blue"]'MsgBox Me.UsedRange.Address, vbOKOnly[/COLOR]
[COLOR="blue"]'a = InStr("$", Me.UsedRange.Address, 0)[/COLOR]
On Error GoTo er
Dim i, b, curDam, k, curRow, copytoRow, q, crMta, crMtd, crMpa, _
        crMpd, crMna, crMnd As Integer
Dim curP, curPtmp, curDL, L, Mta, Mpa, Mna, Mtd, Mpd, Mnd As Double
Dim a, a1, addP, a2, a3 As String
Dim Dam(0 To 100) As Integer
b = 0
'Range("C3:I3").Copy Range("K3:s3")
[COLOR="blue"]' Lay tong so dong trong SAP[/COLOR]
For i = 10 To 0 Step -1
    a = Right(Me.UsedRange.Address, i)
    k = Val(a)
    If k <> 0 Then
        b = i
        i = 0
    End If

Mình không hiểu dòng Me.UsedRange.Address có ý nghĩa gì
có cách nào record macro để xuất hiện dòng trên, vì mình tra trong phần helf cũng không tìm thấy, mà search trên google cũng không tìm hiểu được gì ! nhờ các bác giải thích giúp mình xin cảm ơn nha !
 
Upvote 0
Mình có đoạn code :

Private Sub CommandButton1_Click()
'MsgBox Me.UsedRange.Address, vbOKOnly
'a = InStr("$", Me.UsedRange.Address, 0)
On Error GoTo er
Dim i, b, curDam, k, curRow, copytoRow, q, crMta, crMtd, crMpa, crMpd, crMna, crMnd As Integer
Dim curP, curPtmp, curDL, L, Mta, Mpa, Mna, Mtd, Mpd, Mnd As Double
Dim a, a1, addP, a2, a3 As String
Dim Dam(0 To 100) As Integer
b = 0
'Range("C3:I3").Copy Range("K3:s3")
' Lay tong so dong trong SAP
For i = 10 To 0 Step -1
a = Right(Me.UsedRange.Address, i)
k = Val(a)
If k <> 0 Then
b = i
i = 0
End If

Mình không hiểu dòng Me.UsedRange.Address có ý nghĩa gì
có cách nào record macro để xuất hiện dòng trên, vì mình tra trong phần helf cũng không tìm thấy, mà search trên google cũng không tìm hiểu được gì ! nhờ các bác giải thích giúp mình xin cảm ơn nha !

UsedRange là vùng đã sử dụng trên sheet. Vùng này bạn có thể xác định bằng tay, bằng cách: Tại sheet hiện hành ấn Ctrl+End, con trỏ chỉ tới ô cuối cùng của vùng đã sử dụng đấy bạn.

Bạn làm thử một ví dụ là sẽ hiểu ngay thôi:
Gõ vài chữ, vài hàng, vài cột vào sheet hiện hành, sau đó chép đoạn code này vào Module, quay ra sheet hiện hành ấn Alt+F8 chạy Sub này nhé!
PHP:
Sub Test()
MsgBox ActiveSheet.UsedRange.Address
End Sub
 
Upvote 0
Đây là phần Help của Excel nói như vậy!
Mã:
[B]UsedRange Property[/B]
 
See AlsoApplies To[URL="mk:@MSITStore:C:\Program%20Files\Microsoft%20Office\OFFICE11\1033\VBAXL10.CHM::/html/xlproUsedRange1.htm#example"][COLOR=#800080]Example[/COLOR][/URL]Specifics
Returns a [URL="mk:@MSITStore:C:\Program%20Files\Microsoft%20Office\OFFICE11\1033\VBAXL10.CHM::/html/xlobjRange1.htm"][B][COLOR=#0000ff]Range[/COLOR][/B][/URL] object that represents the used range on the specified worksheet. Read-only.
[B]Example[/B]
 
This example selects the used range on Sheet1.
Worksheets("Sheet1").Activate
ActiveSheet.[B]UsedRange[/B].Select
Theo mình hiểu thì .UsedRange dùng để chỉ 1 vùng đã được bạn thao tác trên 1 sheet.
.UsedRange.Address dùng đế lấy địa chỉ của vùng mà bạn đã thao tác trên bảng tính.
Còn chữ Me của bạn thì chắc bạn có tên 1 sheet nào đó được đặt là Me.

Bạn có thể thử với dòng ActiveSheet.UsedRange.Select này sẽ thấy liền!
Thân
 
Upvote 0
Mình không hiểu dòng Me.UsedRange.Address có ý nghĩa gì
có cách nào record macro để xuất hiện dòng trên, vì mình tra trong phần helf cũng không tìm thấy, mà search trên google cũng không tìm hiểu được gì!

Bạn có thể tìm hiểu thêm về UsedRange trong chữ ký của Nick Sa_DQ​

Chúc vui!:-=
 
Upvote 0
Còn chữ Me của bạn thì chắc bạn có tên 1 sheet nào đó được đặt là Me.
Hông phải PoPikachu ơi, Me đại diện cho cái chỗ code đang đứng:
- Đứng ở sheet nào thì Me là sheet đó
- Đứng ở Form nào thì Me là Form đó
- Đứng ở wbook nào thì Me là Wbook đó

thí dụ đứng ở sheet1:
me.cells = sheet1.cells = sheets("sheet1").cells

Đứng ở Form Nhaplieu:
Me.textbox1 = Forms("nhaplieu").textbox1
 
Upvote 0
Hông phải PoPikachu ơi, Me đại diện cho cái chỗ code đang đứng:
- Đứng ở sheet nào thì Me là sheet đó
- Đứng ở Form nào thì Me là Form đó
- Đứng ở wbook nào thì Me là Wbook đó

thí dụ đứng ở sheet1:
me.cells = sheet1.cells = sheets("sheet1").cells

Đứng ở Form Nhaplieu:
Me.textbox1 = Forms("nhaplieu").textbox1
Em thấy không đúng đâu! Ví dụ Sub này thì ở Sheet 1 nó báo lỗi ngay chữ Me. Thì sao?
PHP:
Sub thu()
Me.UsedRange.Select
End Sub
Me ở đây chỉ dùng trong Userform là đúng thôi! Còn các trường hợp khác bác test lại xem! Trên máy em nó báo lỗi rồi?!$@!!
Thân.
 
Upvote 0
Em thấy không đúng đâu! Ví dụ Sub này thì ở Sheet 1 nó báo lỗi ngay chữ Me. Thì sao?
PHP:
Sub thu()
Me.UsedRange.Select
End Sub
Me ở đây chỉ dùng trong Userform là đúng thôi! Còn các trường hợp khác bác test lại xem! Trên máy em nó báo lỗi rồi?!$@!!
Thân.

Code này bạn để ở đâu? Nếu bạn để trong Module thì nó báo lỗi là đúng rồi! Code trên phải để trong sheet thì Me ở đây excel mới hiểu.
Giống như trong Form, bạn cũng phải viết code và đặt ngay trong Form thì excel mới hiểu.
Giống như ở tại nhà ta thì ta nói Me, ta tự hiểu được; còn ra ngoài đường lớn, đường Quốc lộ, tự dưng nói Me, chẳng ai hiểu Me là ai cả!
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Vâng, em đã hiểu rồi!
Em cứ nghĩ là đang Active Sheet nào thì code sẽ tự Active chứ! Nào ngờ.!!
Sorry!
Thân.
 
Upvote 0
Kiểm tra giúp code khi chạy thì báo lỗi

Chào các bác.
Nhờ các bác xem giúp (trong file đính kèm:
rar.gif
BANGGIA boyxin.rar )

  1. Sau khi List 1 -> List 2, quay lại chọn lại List 1 thì báo lỗi
  2. Sau khi List 1 -> List 2 -> List 3, quay lại chọn lại List 1 hoặc List 2 thì báo lỗi
Em tìm mãi mà không rõ nguyên nhân, cách khắc phục? Mong các bác sớm hồi âm
 
Upvote 0
Upvote 0
Chào các anh
Trong cấu trúc vòng lặp em thừong thấy i = i+1 (...đại loại thế)
Nhưng sao cấu trúc trên lại là


Các anh chỉ giáo

ST
Cells(rc, 1).EntireRow.Delete Shift:=xlUp
Dòng này ie delte dòng từ dưới lên. Thông thường với vòng lặp, nếu bạn duyệt từ đầu đến cuối, thỏa điều kiện, bạn delete dòng, lúc ấy Rc, bạn cứ thử thực hiện sẽ thấy.
Từ đó => nếu muốn dele row thì bạn nến quét từ cuối lên đầu. =>Rc=Rc-1.
 
Upvote 0
1. Giả sử mình chọn 1 vùng bất kỳ, Sau đó muốn dùng Code để chọn Cell dưới cùng ở cột đầu tiên của vùng thì có code nào duy nhất 1 code làm được điều này không?

2. Mình thì không biết làm, nên mượn Resize để làm hộ chuyện ấy:
PHP:
Selection.Resize(, 1)(Selection.Resize(, 1).Count).Select
Nhưng thấy cách làm này thủ công và chưa ưu việt lắm, Mong cao kiến của các bạn?
 
Upvote 0
Bạn suy ra từ đây

PHP:
Sub LastSelection()
 Range([A3], [B65500].End(xlUp)).Select
 MsgBox Cells(Selection.Rows.Count, "A").Address
End Sub
 
Upvote 0
1. Giả sử mình chọn 1 vùng bất kỳ, Sau đó muốn dùng Code để chọn Cell dưới cùng ở cột đầu tiên của vùng thì có code nào duy nhất 1 code làm được điều này không?

2. Mình thì không biết làm, nên mượn Resize để làm hộ chuyện ấy:
PHP:
Selection.Resize(, 1)(Selection.Resize(, 1).Count).Select
Nhưng thấy cách làm này thủ công và chưa ưu việt lắm, Mong cao kiến của các bạn?
Bạn nghiên cứu code sau
PHP:
Sub thu()
Dim MyRng As Range, iR As Long, iC As Long, iRng As Long
Set MyRng = [a2:c10]
iR = MyRng.Rows.Count
iC = MyRng.Columns.Count
iRng = (iR - 1) * iC + 1
MsgBox MyRng(iRng).Address
MsgBox MyRng.Cells(iR, 1).Address
MsgBox MyRng.Resize(, 1)(MyRng.Resize(, 1).Count).Address

End Sub
 
Upvote 0
Câu dưới này không hẳn là ưu việt, nhưng có thể chọn ô bất kỳ trong vùng chọn. Khi dùng Cells(), tham chiếu dòng cột của Cells là số thứ tự dòng, cột tính từ ô trên cùng bên trái của vùng chọn, và vùng chọn là bất kỳ:

PHP:
Selection.Cells(Selection.Rows.Count,1).Select
 
Upvote 0
KKLUFRE009708
KKLUSYD08215
KKLUMEL088062
KKLUBNE0005060

Các huynh giúp em viết một code sao cho tại cột A (sheet active) các vận đơn tàu khi gặp các ký tự bôi đậm như trên thì 4 chữ cái đầu tiền đổi về KLIS (thay thế cho KKLU)

Bình thường công thức em vẫn làm như sau

{=IF(MID(A2;5;3)={"FRE";"SYD";"MEL";"BNE"};SUBSTITUTE(A2;A2;"KLIS"&RIGHT(A2;LEN(A2)-4));A2)}

Cám ơn các huynh
 
Lần chỉnh sửa cuối:
Upvote 0
Các huynh giúp em viết một code sao cho tại cột A (sheet active) các vận đơn tàu khi gặp các ký tự bôi đậm như trên thì 4 chữ cái đầu tiền đổi về KLIS (thay thế cho KKLU)

Cám ơn các huynh
Các chữ bold kia là phải tìm Bold hay là có danh mục: FRE, SYD, MEL, BNE.
Nếu phải tìm theo DM như trên thì nên dùng Find. Với What:=iFind
Trong đó iFind=RngFind(i)
RngFind={"FRE", "SYD", "MEL", "BNE"}
Tự làm sẽ hay hơn.
 
Upvote 0
Các huynh giúp em viết một code sao cho tại cột A (sheet active) các vận đơn tàu khi gặp các ký tự bôi đậm như trên thì 4 chữ cái đầu tiền đổi về KLIS (thay thế cho KKLU)

Cám ơn các huynh
Yêu cầu của bạn chắc phải dùng find và Replect quá, Mình nghỉ là như vậy. Bạn tham khảo phương thức find ở link này xem sao.
http://www.giaiphapexcel.com/forum/showthread.php?p=107268
 
Upvote 0
ThuNghi đã viết:
Các chữ bold kia là phải tìm Bold hay là có danh mục: FRE, SYD, MEL, BNE.
Nếu phải tìm theo DM như trên thì nên dùng Find. Với What:=iFind
Trong đó iFind=RngFind(i)
RngFind={"FRE", "SYD", "MEL", "BNE"}
Tự làm sẽ hay hơn.

Em bôi đậm lên cho dễ nhìn thôi, thực tế nó bình thường.
Em làm công thức và record lại được macro như sau
Sub Macro1()
'
' Macro1 Macro
' Macro recorded 27/10/2008 by ST

'
Range("J2").Select
Selection.FormulaArray = _
"=IF(MID(RC[-9],5,3)={""FRE"";""SYD"";""MEL"";""BNE""},SUBSTITUTE(RC[-9],RC[-9],""KLIS""&RIGHT(RC[-9],LEN(RC[-9])-4)),RC[-9])"
End Sub
Nhưng dựa vào cơ sở trên em tạo một vòng lặp bắt đầu tại A1 --> .endup

Các huynh gợi ý
 
Upvote 0
Em bôi đậm lên cho dễ nhìn thôi, thực tế nó bình thường.
Em làm công thức và record lại được macro như sau

Nhưng dựa vào cơ sở trên em tạo một vòng lặp bắt đầu tại A1 --> .endup

Các huynh gợi ý

Nếu bạn đã làm được 1 hàng thì sao bạn không dùng chức năng autofill để fill nó xuống các hàng khác cho dến hết

Autofill thì có thể viết bằng VBA bằng cách thư reco macro và chỉnh sữa tí síu ra theo ý mình (Autofill đã nói đến trong topic này ở mấy bài # ở dưới đó, bạn xêm nhé)
 
Upvote 0
Em bôi đậm lên cho dễ nhìn thôi, thực tế nó bình thường.
Em làm công thức và record lại được macro như sau

Nhưng dựa vào cơ sở trên em tạo một vòng lặp bắt đầu tại A1 --> .endup

Các huynh gợi ý

Bạn làm thử theo code sau, số ...B/L nằm ở cột 1, sheet1
PHP:
Sub ThayThe()
Dim MyRng As Range, RngFound As Range, iA As Long
Dim eR As Long, iFind As String, Dem As Long
Dim MyArr() As Variant
Sheet1.Select
eR = [A65000].End(xlUp).Row
Set MyRng = Range("A1:A" & eR)
MyArr = Array("FRE", "SYD", "MEL", "BNE")
For iA = LBound(MyArr()) To UBound(MyArr())
    iFind = MyArr(iA)
    Dem = WorksheetFunction.CountIf(MyRng, "*" & iFind & "*")
    Set RngFound = MyRng(1)
    For i = 1 To Dem
        With MyRng
            Set RngFound = .Find(iFind, After:=RngFound, SearchOrder:=xlColumns, _
                 LookIn:=xlFormulas, LookAt:=xlPart, SearchDirection:=xlPrevious)
        End With
        With RngFound
            .Value = Replace(.Value, "KKLU", "KLIS")
            .Font.ColorIndex = 5
            .AddComment ("OK")
        End With
    Next
Next

End Sub
 
Upvote 0
Bạn ơi Auto fill phải OR đến 4 lần, mình muốn viết code đại loại như
sub thaythe()


Dim Er As Long, thaythe As String
Er = Cells(Cells.Rows.Count, 1).End(xlUp).Row
With Application
.DisplayAlerts = False
.ScreenUpdating = False
End With
ActiveSheet.Select

For i = 2 To Er
if mid(A&I;5;3) = "FRE" or "SYD".......then subtistute(A&I...)
End if
Next

End sub

Em chỉ hình dung được code như thế , chưa viết được

Các huynh chỉ giáo thêm
 
Upvote 0
Các huynh giúp em viết một code sao cho tại cột A (sheet active) các vận đơn tàu khi gặp các ký tự bôi đậm như trên thì 4 chữ cái đầu tiền đổi về KLIS (thay thế cho KKLU)
Bình thường công thức em vẫn làm như sau
Cám ơn các huynh
Hình như mình đã đi lạc chủ để rồi đó. Ở đây mình chỉ nên giải quyết các code dùng chung chung. Không phải là giải quyết cả 1 bài tập vì
1. Để các thành viên khác có thắc mắc về code, có thể vào đây tham khảo và có thể đọc và hiểu liền code mình cần tìm
2. Các thành viên vào tìm code để hỏi mà đọc từ đầu đến cuối topic này chắc cũng loạn đầu với mấy bài tập luôn, vì có khi bài tập không liên quan gì đến họ.
3. Theo mình nghỉ ở đây mình chỉ nên giải thích về 1 vấn đề mà code sử lý => tác dụng của code, hoặc 1 lỗi nào đó trong code không thể hiểu nổi (Đây không phải topic làm bài tập mới), còn áp dụng vào bài tập thì tự thành viên áp dụng, hoặc mở topic khác để hỏi về bài tập của mình. Anh em nghĩ sao?
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
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn Pmhoang
Thực ra mình là thành viên mới tham gia, hôm nọ nghe Admin cảnh báo...và move lại bài của mình vào topic này. Và từ đó mình ko dám post thành một chủ đề mới

Nhân tiện em xin hỏi cách hoặc nhiều lần trong một hàm if
ví dụ
Nếu a1 = 1 hoặc = 2 hoặc = 3 hoặc = 4 thì....câu lệnh

thì em phải viết code như nào

xin cám ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn Pmhoang
Thực ra mình là thành viên mới tham gia, hôm nọ nghe Admin cảnh báo...và move lại bài của mình vào topic này. Và từ đó mình ko dám post thành một chủ đề mới
Nhân tiện em xin hỏi cách hoặc nhiều lần trong một hàm if
ví dụ
thì em phải viết code như nào

xin cám ơn
Bài này không thuộc về những vấn để Code.
Bạn nên vào tìm kiếm và nhập từ if vào. sẽ có rất nhiều cái hay cho bạn (vấn đề if đã nói rất nhiều rồi) hoặc tham khảo link
http://www.giaiphapexcel.com/forum/showthread.php?t=12212

Bạn hỏi không rõ ràng, nếu hỏi if trong VB thì cấu trúc như sau:
if <điều kiện> then
[thực hiện lệnh True]
else
[thưc hien lệnh False]
end if
else có thể thêm điểu kiện là else [điều kiện - then]
Có thể bôi đen if và ấn F1, xem ví dụ cụ thể trong Help, khi nào không hiểu sẽ hỏi GPE tiếp.
Trước khi hỏi bài bạn nên tìm kiếm xem chủ đề mình định hỏi đã có trên GPE chưa, nếu có rồi thì mình tham khảo và gốp y. còn chưa có thì hãy post bài (tránh trường hợp post bài đã có rồi). Thân chào.
 
Lần chỉnh sửa cuối:
Upvote 0
Anh ThuNghi đã viết:
For iA = LBound(MyArr()) To UBound(MyArr())
iFind = MyArr(iA)
Dem = WorksheetFunction.CountIf(MyRng, "*" & iFind & "*")
Set RngFound = MyRng(1)

Đoạn code của anh phức tạp ghê!
Anh cho em hỏi ý nghĩa của đoạn bôi đậm trên với
và tại sao trong Myrng(1) lại có số 1 hả anh?

cám ơn anh
 
Upvote 0
Anh cho em hỏi ý nghĩa của đoạn bôi đậm trên với
và tại sao trong Myrng(1) lại có số 1 hả anh?

For iA = LBound(MyArr()) To UBound(MyArr())
iFind = MyArr(iA)

Set RngFound = MyRng(1)

For iA = LBound(MyArr()) To UBound(MyArr())
Cho biến iA chạy từ phần tử đầu tiên đến phần tử cuối cùng có trong mảng MyArr()

iFind = MyArr(iA)
Gán biến iFind bằng với phần tử thứ iA trong mảng MyArr()

Set RngFound = MyRng(1)
Gán biến RngFound bằng với phần tử thứ nhất trong vùng MyRng
Nếu MyRng= [A1:A10] thì MyRng(1) = [A1], MyRng(10) = [A10]
 
Upvote 0
Chào các bác.
Nhờ các bác xem giúp (trong file đính kèm:
rar.gif
BANGGIA boyxin.rar )

  1. Sau khi List 1 -> List 2, quay lại chọn lại List 1 thì báo lỗi
  2. Sau khi List 1 -> List 2 -> List 3, quay lại chọn lại List 1 hoặc List 2 thì báo lỗi
Em tìm mãi mà không rõ nguyên nhân, cách khắc phục? Mong các bác sớm hồi âm

Oài, sao không ai xem giúp em à.
Các bác bớt chút thời gian vàng ngọc xem giúp em nhé



Không hiểu rõ câu hỏi của bác, bác giải thích cụ thể hơn đi

Xem file đính kèm: yêu cầu chi tiết, có VD tham khảo tại Lọc theo điều kiện cho các ComboBox

Khi chay code timgia (hoặc Nhấn nút Test tại K1)-> lên 1 form có 3 List chọn (1-nhóm hàng, 2-nhà sản xuất, 3-mã số hàng). sau khi chọn đủ 3 list thì sẽ lọc trong sheet1 ra các thông số và cho hiện ở các ô còn lại của form

Nếu chọn list theo đúng trình tự 1 - 2 - 3 thì không vấn đề gì
Nhưng nếu

  1. Sau khi List 1 -> List 2, muốn chọn lại chọn lại List 1 thì báo lỗi
  2. Sau khi List 1 -> List 2 -> List 3, muốn chọn lại chọn lại List 1 hoặc List 2 thì báo lỗi
Tìm mãi mà không rõ nguyên nhân <=> cách khắc phục ? ĐỂ KHÔNG BỊ LỖI
 
Upvote 0
Theo mình, nguyên nhân của lỗi trên là tình trạng code chạy chồng chéo lên nhau do cả 3 List đều dùng sự kiện Change:
-Khi chọn List 1 - code chạy gán giá trị vào List 2. Khi chọn List 2 - code chạy gán giá trị vào List 3: Không có vấn để gì.
-Khi chọn List 1 mà List 2 đã có giá trị - code chạy gán giá trị mới vào List 2 - vô tình kích hoạt sự kiện Change của List 2 - code List 2 chạy chồng lên code List 1 ---> báo lỗi.
Cách khắc phục: dùng sự kiện DropButtonClick cho List 2 và List 3
 
Upvote 0
THUNGHI đã viết:
Sub thaythe()

Dim MyRng As Range, RngFound As Range, iA As Long
Dim ei As Long, iFind As String, Dem As Long
Dim MyArr() As Variant
ActiveSheet.Select
ei = [A65000].End(xlUp).Row
Set MyRng = Range("A1:A" & eR)
MyArr = Array("FRE", "SYD", "MEL", "BNE")
For iA = LBound(MyArr()) To UBound(MyArr())
iFind = MyArr(iA)
Dem = WorksheetFunction.CountIf(MyRng, "*" & iFind & "*")
Set RngFound = MyRng(1)
For i = 1 To Dem
With MyRng
Set RngFound = .Find(iFind, After:=RngFound, SearchOrder:=xlColumns, _
LookIn:=xlFormulas, LookAt:=xlPart, SearchDirection:=xlPrevious)
End With
With RngFound
.Value = Replace(.Value, "KKLU", "KLIS")
.Font.ColorIndex = 5
.AddComment ("OK")
End With
Next
Next





End Sub

Thu nghi viết giúp code chạy ngon

Nhưng không hiểu sao khi bê sang sheet khác chạy báo lỗi 400 hoặc Object were require

Các bác giúp em
 
Lần chỉnh sửa cuối:
Upvote 0
Code chạy sheet này thì được, sheet khác không được

Bác Thunghi à

Em gửi file chạy ko được lên nhé

Bác xem ngâm cứu giúp


ST
 

File đính kèm

Upvote 0
Khắc phục lỗi khi sub không tồn tại?

Trong lệnh Call <Sub> , Nếu vì 1 lý do nào đó Sub đó bị Delete đi, khi đó sẽ báo lỗi như sau:
PHP:
Compile error:
Sub or Function not defined
Làm sao để bẩy lỗi cho lỗi này, Mình dùng lệnh On Erorr goto <Erorr_Sub> nhưng vẫn không có bẫy được lỗi này.
Mong các bạn chỉ giáo cho? Thanks
 
Upvote 0
Bác Boyxin có viết giúp em một đoạn code, do nhu cầu công việc em phải chình lại một tí
nhưng chỉnh xong không chạy được

------> em thêm code để lọc những dòng có VNHPH tại cột POP

Các bác xem file giúp ST sai ở chỗ nào nhé

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

Thấy GPE đang lỗi, ngồi cố nghĩ mãi cũng ra được....nhưng vẫn thiếu code chạy để
gắn "KLIS" nếu bill bắt đầu bằng "BNE", "FRE";"MEL";SYD"



Option Explicit
Dim Rng As Range, Str As String, idate As String
Dim Tmp, i As Long, Er As Long
Sub Hang_nhap_Loc()
ActiveSheet.Select
With Application
.DisplayAlerts = False
.ScreenUpdating = False
End With
Range("A:A,C:C,E:G,J:M,O:O").Select
Selection.Delete Shift:=xlToLeft
Set Rng = [A1].CurrentRegion
Rng.AutoFilter Field:=8, Criteria1:="<>C"
Rng.Offset(1).SpecialCells(12).EntireRow.Delete
Selection.AutoFilter

Rng.AutoFilter Field:=7, Criteria1:="<>VNHPH"
Rng.Offset(1).SpecialCells(12).EntireRow.Delete
Selection.AutoFilter


Er = [A65536].End(xlUp).Row
For i = 2 To Er
idate = Mid(Cells(i, 9), 1, 10)
Cells(i, 9) = idate
Str = Trim(Cells(i, 1))
Cells(i, 1) = "KKLU" & Str
Tmp = Cells(i, 6)
If Cells(i, 1) = Cells(i - 1, 1) Then
Tmp = Tmp + Cells(i - 1, 6)
Cells(i - 1, 8).ClearContents
Cells(i - 1, 7).ClearContents
Cells(i, 6) = Tmp
End If
Cells(i, 6) = Tmp
Next
Range("H2:H" & Er).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
Range("G2:G" & Er).SpecialCells(xlCellTypeBlanks).EntireRow.Delete


Range([A1], Selection.End(xlDown)).Columns.AutoFit

With Application
.DisplayAlerts = True
.ScreenUpdating = True
End With
[A1].Select
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
------> em thêm code để lọc những dòng có VNHPH tại cột POP

ngồi cố nghĩ mãi cũng ra được....nhưng vẫn thiếu code chạy để
gắn "KLIS" nếu bill bắt đầu bằng "BNE", "FRE";"MEL";SYD"

CẢM ƠN BÁC ThuNghi đã góp ý. Em đã điều chỉnh lại code.

PHP:
Option Explicit
Dim Rng As Range, Clls As Range, Str As String
Dim Tmp, i As Long, Er As Long
Sub GPE_Loc()
Sheet2.Select
With Application
       .DisplayAlerts = False:       .ScreenUpdating = False
End With

' Xóa những cột màu vàng'
Range("A:A,C:C,E:G,J:M,O:O").Delete Shift:=xlToLeft

' Lọc giữ lại cột POP CD="VNHPH" và cột PREPAID COLLECT CD="C" '
Set Rng = [A1].CurrentRegion
With Rng
    .AutoFilter Field:=7, Criteria1:="<>VNHPH", Field:=8, Criteria2:="<>C"
    .Offset(1).SpecialCells(12).EntireRow.Delete
End With
Selection.AutoFilter

' Một kiểu SUMIF ...    '
Er = [A65536].End(xlUp).Row
For i = 2 To Er
    Cells(i, 9) = Mid(Cells(i, 9), 1, 10)
    Tmp = Cells(i, 6)
    If Cells(i, 1) = Cells(i - 1, 1) Then
        Tmp = Tmp + Cells(i - 1, 6)
        Cells(i - 1, 7).ClearContents
        Cells(i, 6) = Tmp
    End If
    Cells(i, 6) = Tmp
Next
Range("G2:G" & Er).SpecialCells(xlCellTypeBlanks).EntireRow.Delete

' Nối "KKLU" vào cột BL NUM sau khi đã TRIM(..)  '
Set Rng = Range([A2], [A65536].End(xlUp))
For Each Clls In Rng
        Clls = "KKLU" & Trim(Clls)
Next

'Thay "KKLU" = "KLIS" nếu trước khi nối bắt đầu = "FRE" hoặc "MEL" hoặc "BNE" hoặc "SYD" '
With Rng
    .Replace What:="KKLUFRE", Replacement:="KLISFRE"
    .Replace What:="KKLUMEL", Replacement:="KLISMEL"
    .Replace What:="KKLUBNE", Replacement:="KLISBNE"
    .Replace What:="KKLUSYD", Replacement:="KLISSYD"
End With

' Tự động căn chỉnh độ rộng cells  '
[A1].CurrentRegion.Columns.AutoFit
[A1].Select

With Application
    .DisplayAlerts = True:      .ScreenUpdating = True
End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Xin góp ý code khai báo biến

Chào các bạn,
Đọc các đoạn code của các bạn tôi xin góp ý về cách khai báo biến.
Việc khai báo biến như thế nào để khi truy tìm, hoặc khi Ctrl + Space bar nhanh hơn?

Thông thường khi mới bước vào lập trình thì chúng ta không quan tâm lắm, chỉ làm sao cho chương trình đạt được mục đích của mình là được. Vâng, tôi đồng ý, nhưng như vậy nó sẽ làm cho chúng ta có thói quen lập trình không hay, ảnh hưởng đến các đoạn code của các bạn sau này.

Ví dụ, phân tích đoạn khai biến sau:

Mã:
Option Explicit
Dim Rng As Range, Clls As Range, Str As String
Dim Tmp, i As Long, Er As Long
Rng, Clls --> được khai báo là đối tượng Range.
i, Er --> được khai báo là kiểu Long
Còn Tmp là kiểu Variant
(Chú ý rằng trong VBA, nếu chúng ta khai báo Dim Tmp, i As Long thì chương trình chỉ hiểu là chúng ta khai báo i As Long, còn Tmp là kiểu Variant)
Cách khai báo trên đôi khi sẽ làm chính người lập trình bị lộn xộn.

Chúng ta nên dùng một từ đầu trong tên biến để thể hiện kiểu dữ liệu:

Ví dụ:
Ví dụ kiểu khai báo|Từ đầu tiên|Kiểu dữ liệu
Dim iColumn As Integer|i|Kiểu Integer
Dim lRow As Long|l|Kiểu Long
Dim dProduct As Double|d|Kiểu Double
Dim sName As String|s|String
Dim vValue As Variant|v|Variant
Dim bChoice As Boolean|b|Boolean
Như vậy việc khai báo biến sẽ dễ hiểu hơn. Chú ý, ký tự thứ hai của tên biến, các bạn nên viết Hoa.

Ngoài ra còn các kiểu dữ liệu khác, chúng ta sẽ dùng hai hoặc ba ký tự đầu của tên biến:

Ví dụ kiểu khai báo|Từ đầu tiên|Kiểu dữ liệu
Dim objExcel As Object|obj|Object
Dim rngData As Range|rng|Range
Dim wkbSales As Workbook|wkb|Workbook
Dim wksProducts As Worksheet|wks|Worksheet

Lê Văn Duyệt
 
Lần chỉnh sửa cuối:
Upvote 0
Xin lỗi, cho hỏi một chút về mảng đối tượng với nhé!

Các bạn ơi, chỉ dùm tôi cách lập nên một mảng các đối tượng trong VBA với. Ví dụ tôi có 1 mảng bao gồm các CommandButton ấy. trong 1 Form tôi có dùng khoảng 20 CommandButton có chức năng gần tương tự nhau. Bây giờ tôi muốn quản lý các cmd đó theo dạng mảng thì làm thế nào?
Cảm ơn các bạn nhé@
 
Upvote 0
Các bạn ơi, chỉ dùm tôi cách lập nên một mảng các đối tượng trong VBA với. Ví dụ tôi có 1 mảng bao gồm các CommandButton ấy. trong 1 Form tôi có dùng khoảng 20 CommandButton có chức năng gần tương tự nhau. Bây giờ tôi muốn quản lý các cmd đó theo dạng mảng thì làm thế nào?
Cảm ơn các bạn nhé@
Bạn nghiên cứu bài số 5 của Po_Pikachu về tham số k trong Command Button.
http://www.giaiphapexcel.com/forum/showthread.php?t=15438
 
Upvote 0
Làm sao để hiện thông báo bằng tiếng việt

Mình dùng các lệnh có thông báo VD:
msgbox "Hiện lên thông báo",,"Tiêu đề của thông báo"
inputbox "Nhập số liệu"
Nhưng nó luôn bị mã hóa, Không có hiện lên tiếng việt, Mong các bạn giúp với.
 
Upvote 0
NDU đã viết:
Function Unique(Vung As Range, STT As Long) As String 'Can I change STT as Long to Interger
Dim i As Long, K As Long
Dim Temp As String
For i = 1 To Vung.Cells.Count ' till the last row in the range
If Vung(i) <> "" Then
If i = Application.WorksheetFunction.Match(Vung(i), Vung, 0) Then
K = K + 1 'K was defaulted starting at 0?
End If
If K = STT Then Temp = Vung(i): Exit For
End If
Next i
Unique = Temp
End Function

Chào các anh
Em xin được hỏi trong đoạn code trên:

- Em có thể khai báo STT as interger?
- K = K+1 (có phải K được mặc định bắt đầu = 0?)

Có phải muốn Exit For thì mình phải đặt dấu ":" đằng trước?

Cám ơn các anh chỉ bảo?

ST
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các anh
Em xin được hỏi trong đoạn code trên:

- Em có thể khai báo STT as interger?
- K = K+1 (có phải K được mặc định bắt đầu = 0?)

Có phải muốn Exit For thì mình phải đặt dấu ":" đằng trước?

Cám ơn các anh chỉ bảo?

ST
Hãy Google để tìm interger, long
K=0, nếu chuẩn thì nên khai trước vì UDF nằm trong 1 Sub nào mà có biến K => sẽ sai.
":" thay vì xuống hàng.
cells( )=1: exit sub
đó là
cells( )=1
exit sub

 
Upvote 0
Em xin được hỏi trong đoạn code trên:
- Em có thể khai báo STT as interger?
- K = K+1 (có phải K được mặc định bắt đầu = 0?)
* Integer hay Long tùy thuộc vào số lượng records bạn đang & sẽ có trong CSDL;
* Một khi khai 1 biến kiểu Long hay Interger thì có lả đúng vậy, chúng = 0 khi chưa đụng đến nó.
Có phải muốn Exit For thì mình phải đặt dấu ":" đằng trước?
Cám ơn các anh chỉ bảo? ST
Dấu ':' dùng đề phân cách hai lệnh (ngắn) đang chung 1 dòng;
Ngược lại, dấu '_' dùng để báo cho VBA biết tôi có dòng lệnh quá dài, nên phải viết tiếp ở dòng dưới liền kề.
Ví dụ:
PHP:
Dim GGGGGGGGGGGGGGGPPPPPPPPPPPPPPPPPEEEEEEEEEEE As String
 GGGGGGGGGGGGGGGPPPPPPPPPPPPPPPPPEEEEEEEEEEE = "AAA" & _
         GGGGGGGGGGGGGGGPPPPPPPPPPPPPPPPPEEEEEEEEEEE & ".COM"
 
Upvote 0
Long (long integer) variables are stored as signed 32-bit (4-byte) numbers ranging in value from -2,147,483,648 to 2,147,483,647. The type-declaration character for Long is the ampersand (&).

Em đã đọc Integer và Long nên em mới hỏi. Excel 2003 chỉ có 65536 dòng thì làm sao phải dùng đến Long ạ?

Các anh chỉ thêm.

Xin cám ơn

ST
 
Upvote 0
Bổ sung:
dấu hai chấm (:) còn dùng cho việc đặt nhãn (label) trong câu lệnh goto.

-hvl-
 
Upvote 0
Upvote 0
Em đã đọc và đúng thật rất sôi nổi...nhưng có một số bài em đọc không vừa ý lắm...
Nhưng không sao, là diễn đàn mà

Có lẽ do ta chỉ đứng từ mỗi góc độ khác nhau nên đánh giá dáng vẻ của một " pho tượng" không đúng lắm

Đối với Em Anh thực sự là một cao thủ mà không biết bao giờ em đạt tới được.

Cám ơn anh
 
Lần chỉnh sửa cuối:
Upvote 0
Em đã đọc và đúng thật rất sôi nổi...nhưng có một số bài em đọc không vừa ý lắm...
Nhưng không sao, là diễn đàn mà

Có lẽ do ta chỉ đứng từ mỗi góc độ khác nhau nên đánh giá dáng vẻ của một " pho tượng" không đúng lắm

Đối với Em Anh thực sự là một cao thủ mà không biết bao giờ em đạt tới được.

Cám ơn anh
Một số bài trong Topic đó thật sự tôi cũng chưa hiểu nổi, vì trình độ của tôi còn quá hạn hẹp... Nhưng đại khái các cao thủ đã khẳng định rằng:
- Các biến Byte, Integer, Long ... tất cả đều sẽ được chuyển thành Long trước khi tính toán
- Vì lẽ đó mà thay vì khai báo Integer, ta khai báo là Long luôn cho nó nhanh
- Đương nhiên nếu ta khai báo Integer cũng chẳng ai nói gì (với trình độ của tôi và bạn)... nếu như vùng nhớ Integer chứa đủ
- Cũng từ sau bài viết ấy, tôi đã tập thói quen khai báo Long cho mấy biến loại trên
Còn 1 nguyên nhân khác: Chử Long gõ.. dể và sướng tay hơn chử Integer...
Ẹc.. Ẹc...
 
Upvote 0
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
Minh không biết post bai chu đề riêng cua mình nen mươn đề tài của bạn vậy. Xin lỗi ban nha.
Các bạn ơi giup minh giải thích đoan code này nha! hàm đổi số ra chữ: không biết có sai cái gi mà đoan code mình không chạy.
Public Sub VND(BaoNhieu)
If Val(BaoNhieu) = 0 Then
KetQua = "Kh«ng ®ång"
Else
If Abs(BaoNhieu) > 1E+15 Then
KetQua = "Sè qu¸ lín"
Else
If BaoNhieu < 0 Then KetQua = "Trwf&Space(1) Else KetQua=Space(0)"
SoTien = Format(Abs(BaoNhieu), "##############0.00") '18 cét sè, 2 sè lÎ
SoTien = Right(Space(15) & SoTien, 18)
Hang = Array("None", "Tr¨m", "m&shy;¬i", "g× ®ã")
DonVi = Array("None", "ngµn tû", "tû", "triÖu", "ngµ", "®ång", "xu")
Dem = Array("None", "mét", "hai", "ba", "bèn", "n¨m", "s¸u", "b¶y", "t¸m", "chÝn")
For N = 1 To 6
Nhom = Mid(SoTien, N * 3 - 2, 3)
If Nhom <> Space(3) Then
Select Case Nhom
Case "000"
If N = 5 Then
Chu = "®ång" & Space(1)
Else
Chu = Space(0)
End If
Case "00", ",00"
Chu = "Ch½n"
Case Else
S1 = Left(Nhom, 1): S2 = Mid(Nhom, 2, 1): S3 = Right(Nhom, 1)
Chu = Space(0): Hang(3) = DonVi(N)
For K = 1 To 3
Dich = Space(0): S = Val(Mid(Nhom, K, 1))
If S > 0 Then
Dich = Dem(S) & Space(1) & Hang(K) & Space(1)
Else
If K = 1 And N > 1 And N < 6 And Val(Mid(SoTien, (N - 1) * 3 - 2, 3)) > 0 Then
Dich = "Kh«ng""& space(1)& Hang(K)& Space(1)"
End If
End If
Select Case K
Case 2 And S = 1
Dich = "m&shy;êi" & Space(1)
Case 3 And S = 0 And Nhom <> Space(2) & "0"
Dich = Hang(K) & Space(1)
Case 3 And S = 5 And Val(S2) > 0
Dich = "I" & Mid(Dich, 2) 'Ký Tù en lê'
Case 2 And S = 0 And S3 <> "0"
If N > 1 And Val(Mid(SoTien, (N - 1) * 3 - 2, 3)) > 0 Or (S1) > 0 Then
Dich = "lÓ" & Space(1)
End If
End Select
Chu = Chu & Dich
Next K
End Select
Vitri = InStr(1, Chu, "m&shy;êi mét")
KetQua = KetQua & Chu
End If
Next N
End If
End If
VND = UCase(Left(KetQua, 1)) & Trim(Mid(KetQua, 2))
End Function
(Đoạn này của Ông Văn Thông "giáo trình thực hành"
Không biết thao tác mình có đánh sai doan code không. Các bạn giúp mình với.
 
Upvote 0
Minh không biết post bai chu đề riêng cua mình nen mươn đề tài của bạn vậy. Xin lỗi ban nha.
Các bạn ơi giup minh giải thích đoan code này nha! hàm đổi số ra chữ: không biết có sai cái gi mà đoan code mình không chạy.
Public Sub VND(BaoNhieu)
If Val(BaoNhieu) = 0 Then
....
VND = UCase(Left(KetQua, 1)) & Trim(Mid(KetQua, 2))
End Function
(Đoạn này của Ông Văn Thông "giáo trình thực hành"
Không biết thao tác mình có đánh sai doan code không. Các bạn giúp mình với.
Thay Public Sub VND(BaoNhieu) là Public Function VND(BaoNhieu)
Đầu là Sub mà cuối là Function
 
Upvote 0
Procedures có hai loại:
_ Sub
_ Function

Cả hai loại đều thực hiện một số lệnh (hay người ta còn thường gọi chúng ta các Macro), nhưng Function sẽ trả về một giá trị. Chính vì vậy để tính toán người ta sẽ dùng Function mà tiếng việt chúng ta thường gọi là Hàm. Còn Sub gọi là thủ tục.

Mã:
Function Vnd(SoTien) As String

End Function

Mã:
Sub DinhDang()

End Sub

Vbavn
 
Upvote 0
Nhờ các bạn sửa giúp!

Các bác ơi em có đoạn code sau :
PHP:
Private Sub CommandButton1_Click()
Dim i As Long
    i = 3
    Do While Range("A" & i + 1).Value <> ""
    i = i + 1
    Loop
    Range(" " A " & i : " E " & i").Select
End Sub
Chạy không được, các bác sửa lại dùm em với nhé, em chả biết sai như thế nào để mà sửa
 
Upvote 0
Các bác ơi em có đoạn code sau :
PHP:
Private Sub CommandButton1_Click()
Dim i As Long
    i = 3
    Do While Range("A" & i + 1).Value <> ""
    i = i + 1
    Loop
    Range(" " A " & i : " E " & i").Select
End Sub
Chạy không được, các bác sửa lại dùm em với nhé, em chả biết sai như thế nào để mà sửa
Sai ở câu này:
Range(" " A " & i : " E " & i").Select
Phải là

PHP:
 Range("A" & i & ":E" & i ).Select
 
Upvote 0
Các bác ơi em có đoạn code sau :
PHP:
Private Sub CommandButton1_Click()
Dim i As Long
    i = 3
    Do While Range("A" & i + 1).Value <> ""
    i = i + 1
    Loop
    Range(" " A " & i : " E " & i").Select
End Sub
Chạy không được, các bác sửa lại dùm em với nhé, em chả biết sai như thế nào để mà sửa
Cái này sao phải cần vòng lập?
Nếu bạn chỉ muốn "tập dợt" code thì sửa theo ThuNghi... Còn như muốn xài thật sự thì phải thế này:
PHP:
Private Sub CommandButton1_Click()
  [A3].End(xlDown).Resize(, 5).Select
End Sub
Mới gọn chứ
 
Upvote 0
Cái này sao phải cần vòng lập?
Nếu bạn chỉ muốn "tập dợt" code thì sửa theo ThuNghi... Còn như muốn xài thật sự thì phải thế này:
PHP:
Private Sub CommandButton1_Click()
  [A3].End(xlDown).Resize(, 5).Select
End Sub
Mới gọn chứ
Bác giải thích hộ em câu lệnh
[A3].End(xlDown).Resize(, 5).Select
Với
 
Upvote 0
Bác giải thích hộ em câu lệnh
[A3].End(xlDown).Resize(, 5).Select
Với
Đơn giản:
[A3].End(xlDown) giống như việc bạn chọn A3 rồi bấm Ctrl + mũi tên xuống ---> nó sẽ di chuyển đến dòng cuối cùng có dử liệu
Thêm .Resize(, 5) nghĩa là sau khi bấm Ctrl + mũi tên xuống xong, tại cell mới này ta mở rộng nó ra 5 cột
Cú pháp của Resize
Resize(Số dòng, Số cột)
Ở đây số dòng để trống xem như mặc định = 0 (tức không mở rộng dòng)
Xem thông tin chi tiết về Resize tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=13005
 
Upvote 0
Mình có 2 bảng Nhập-Xuất -Tồn tháng 3 và bảng kê nhập tháng 4, mã số các mặt hàng giống nhau, nhưng trình tự khác nhau, làm thế nào để tìm ra những mã mới trong bảng kê nhập?
 
Upvote 0
Đơn giản:
[A3].End(xlDown) giống như việc bạn chọn A3 rồi bấm Ctrl + mũi tên xuống ---> nó sẽ di chuyển đến dòng cuối cùng có dử liệu
Thêm .Resize(, 5) nghĩa là sau khi bấm Ctrl + mũi tên xuống xong, tại cell mới này ta mở rộng nó ra 5 cột
Cú pháp của Resize
Ở đây số dòng để trống xem như mặc định = 0 (tức không mở rộng dòng)
Xem thông tin chi tiết về Resize tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=13005
Àh, thế làm sao để viết dữ liệu vào hàng tiếp theo của hàng cuối cùng có dữ liệu hả bác?
 
Upvote 0
Àh, thế làm sao để viết dữ liệu vào hàng tiếp theo của hàng cuối cùng có dữ liệu hả bác?
Đoạn code này:

Mã:
Private Sub CommandButton1_Click()
  [A3].End(xlDown).Resize(, 5).Select
End Sub
là chọn dòng cuối có dử liệu, vậy dưới nó là rổng, đúng không?
Thế thì dùng OFFSET dịch chuyển nó 1 dòng nữa:

Mã:
Private Sub CommandButton1_Click()
   [A3].End(xlDown).Resize(, 5)[COLOR=Red][B].Offset(1)[/B][/COLOR].Select
 End Sub
Cú pháp Offset gần giống với Resize nhưng công dụng là để DỊCH CHUYỂN dòng, cột (chứ không phải mở rộng)
 
Upvote 0
Xin code tạo marco chỉnh 1 phần font chữ trong Cell thành chữ đậm

Tôi có 1500 ô chứa 1500 câu hỏi và đáp án
Xin chỉ cho tôi cách nhanh nhất để chỉnh font chữ các câu hỏi trong mỗi ô thàng chữ đậm mà câu trả lời thì vẫn là chữ thường.
Thanks
 
Upvote 0
Thủ tục xác định số hàng lớn nhất của dữ liệu?

Trong một sheet làm sao xác định được vị trí hàng lớn nhất của dữ liệu đã được nhập vào sheet? Ví dụ trong một sheet vị trí nhập dữ liệu có số hàng lớn nhất là ô A50 tôi cần thủ tục lấy được giá trị 50 này. Xin cảm ơn nhiều.
 
Upvote 0
Hình như bạn đang cần tìm cái này

Trong một sheet làm sao xác định được vị trí hàng lớn nhất của dữ liệu đã được nhập vào sheet? Ví dụ trong một sheet vị trí nhập dữ liệu có số hàng lớn nhất là ô A50 tôi cần thủ tục lấy được giá trị 50 này. Xin cảm ơn nhiều.
http://giaiphapexcel.com/forum/showthread.php?t=1641&highlight=lastrows#10
Lần sau tìm trước khi hỏi dùm cái, xin cảm ơn.
 
Upvote 0
Đoạn code này:

Mã:
Private Sub CommandButton1_Click()
  [A3].End(xlDown).Resize(, 5).Select
End Sub
là chọn dòng cuối có dử liệu, vậy dưới nó là rổng, đúng không?
Thế thì dùng OFFSET dịch chuyển nó 1 dòng nữa:

Mã:
Private Sub CommandButton1_Click()
   [A3].End(xlDown).Resize(, 5)[COLOR=Red][B].Offset(1)[/B][/COLOR].Select
 End Sub
Cú pháp Offset gần giống với Resize nhưng công dụng là để DỊCH CHUYỂN dòng, cột (chứ không phải mở rộng)

Cám ơn bác nhiều. Khi select được dòng có dữ liệu cuối cùng, làm sao để xác định đó là dòng thứ bao nhiêu hả bác?
 
Upvote 0
Thay chử Select thành Row ---> Sẽ ra được chỉ số dòng

Bác giúp em cái này với nhé.
e có 1 biến i mang giá trị i = Sheet1.Range("A65536").End(xlUp).Row
em muốn viết code cho 1 Scrollbar sao khi nhấp mũi tên phía trên thì i = i-1
con nhấp mũi tên xuống thì i=i+1
Bác viết hộ em được không ạ
 
Upvote 0
Bác giúp em cái này với nhé.
e có 1 biến i mang giá trị i = Sheet1.Range("A65536").End(xlUp).Row
em muốn viết code cho 1 Scrollbar sao khi nhấp mũi tên phía trên thì i = i-1
con nhấp mũi tên xuống thì i=i+1
Bác viết hộ em được không ạ
Viết cái này thì dể thôi! Nhưng sao bạn không đưa lên toàn bộ ý tưởng (để làm luôn 1 lần)
Ra được kết quả của i thì làm cái gì với nó chứ?
 
Upvote 0
Hic, kính mong các bác giảng hộ em bài vb sau đây, ông thầy của em suốt ngày chỉ biết viết code thôi
Mã:
Dim i As Integer    '(cái nì khai báo ở general)

Private Sub Form_Load()
txtmshs.Enabled = False
txthoten.Enabled = False
txtngaysinh.Enabled = False
End Sub
Mã:
Private Sub cmdinput_Click()
txtmshs.Enabled = True
txthoten.Enabled = True
txtngaysinh.Enabled = True
txtmshs = ""
txthoten = ""
txtngaysinh = ""
txtmshs.SetFocus
End Sub
Mã:
Private Sub khoidong()
For i = 1 To 100
If danhsach(i).mshs <> 0 Then
    List1.AddItem danhsach(i).hoten
    List1.ItemData(List1.NewIndex) = danhsach(i).mshs
End If
Next i
End Sub
Mã:
Private Sub cmdsave_Click()
If txtmshs <> "" And txthoten <> "" Then
    For i = 1 To 100
        If danhsach(i).mshs = 0 Then
            danhsach(i).mshs = Val(txtmshs)
            danhsach(i).hoten = Trim(txthoten)
            danhsach(i).ngaysinh = Trim(txtngaysinh)
            Exit For
            End If
        Next i
        List1.Clear
        Call khoidong
    End If
End Sub
Mã:
Private Sub List1_Click()
Dim x
    x = List1.ItemData(List1.ListIndex)
    For i = 1 To 100
    If danhsach(i).mshs = x Then
        txtmshs = danhsach(i).mshs
        txthoten = danhsach(i).hoten
        txtngaysinh = danhsach(i).ngaysinh
    End If
Next i
End Sub
Mã:
Public Type hocsinh    '(cái nì khai báo ở mudule)
mshs As Integer
hoten As String
ngaysinh As String * 10
End Type
Public danhsach(100) As hocsinh
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
XIn các bác chỉ dẫn dùm cho mình vấn đề này:

Trong ổ D:\ của mình có các folder sau : vb1, vb2,.....
Bây giờ mình đánh văn bản mới nếu Cell A1 có chữ vb1 thì khi save nó save tự động vào d:\vb1. Tương tự với vb2
Với tên file là chuỗi bao gồm "tenvanban+ngaythangnam+giophutgiay.xls"
Mong các bác chỉ giáo!!!!
 
Upvote 0
Private Function Find_Address(Text As String, a As Boolean) As String
If a = True Then

Find_Address = Mid(Range(Text).Address, 2, WorksheetFunction.Find("$", Range(Text).Address, 2) - 2)
Else
Find_Address = Range(Text).Row
End If
End Function
Sub Tinh()
Dim col_NC As String, row_NC As String, col_i As String, row_i As String
col_NC = Find_Address("a", True)
row_NC = Find_Address("b", False) + 1
Sheet1.Range("A1").Value = col_NC
Sheet1.Range("A2").Value = row_NC
End Sub
Xin giải thích giùm đoạn code này, đặc biệt là ở chỗ này, và tham số boolean để làm gì?
Mid(Range(Text).Address, 2, WorksheetFunction.Find("$", Range(Text).Address, 2) - 2)
Mình có kèm theo file, xem hoài mà ko hiểu, mong các bạn giải thích hộ.
 

File đính kèm

  • a.xls
    a.xls
    26.5 KB · Đọc: 24
Upvote 0
Xin giải thích giùm đoạn code này, đặc biệt là ở chỗ này, và tham số boolean để làm gì?

Mình có kèm theo file, xem hoài mà ko hiểu, mong các bạn giải thích hộ.
Trong file bạn nói rằng:
Mục đích là xác định vị trí ô đầu tiên có số liệu để phục vụ việc tính toán.
nhưng tôi xóa tất tần tật dử liệu nó vẩn cho KQ = D8
Chả hiểu gì cả! Name a, b của bạn nhằm mục đích gì?
 
Upvote 0
Bác đọc code sẽ thấy dòng Find_Address("a", True) và bên Function thì nó sẽ là Find_Address = Mid(Range(a).Address, 2, WorksheetFunction.Find("$", Range(a).Address, 2) - 2) vậy thì a ở đây không phải là dữ liệu trong ô D7 mà là Name của ô D7 cơ.

Chì khóa của cách làm này là dựa vào việc đặt tên Name thôi.
Chúc vui!
Thân.
 
Upvote 0
Bác đọc code sẽ thấy dòng Find_Address("a", True) và bên Function thì nó sẽ là Find_Address = Mid(Range(a).Address, 2, WorksheetFunction.Find("$", Range(a).Address, 2) - 2) vậy thì a ở đây không phải là dữ liệu trong ô D7 mà là Name của ô D7 cơ.

Chì khóa của cách làm này là dựa vào việc đặt tên Name thôi.
Chúc vui!
Thân.
Ý mình là không hiểu đặt name để làm gì (name này cố định cơ mà)? Vì nếu nó xác định cell có dử liệu thì cần gì viết code nhiều thế ---> Goto đến nó luôn!
 
Upvote 0
Cái này chỉ có thể nói là người dùng chưa Pro thôi! Còn họ ứng dụng vào việc gì thì mình chịu luôn.
Cách này sẽ phải tốn rất nhiều name vô ích và còn làm nặng máy nữa. Để tìm địa chỉ ô đầu tiên của 1 khối thì có rất nhiều cách nhưng thường thì chúng ta thích làm trực tiếp luôn đâu cần phải dùng Name làm gì?
Vậy để tác giả cho ý kiến trước xem!
Thân.
 
Upvote 0
Status
Không mở trả lời sau này.

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

Back
Top Bottom