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.
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
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.
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 :
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
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é
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)???
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
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
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
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
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)
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
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
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
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
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
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.
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é!
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 ?).
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="]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="]
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 !
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
[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 !
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
[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
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ì!
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
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
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ả!
Do
If rc > 1 And rc < 13 Or Trim(Cells(rc, 1)) = "" Or IsNumeric(Cells(rc, 1)) = False Then
Cells(rc, 1).EntireRow.Delete Shift:=xlUp
End If
rc = rc - 1
Loop While rc > 1
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.
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:
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:
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
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ỳ:
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á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á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.
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á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
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é)
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
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
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
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
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
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.
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
Sau khi List 1 -> List 2, muốn chọn lại chọn lại List 1 thì báo lỗi
Sau khi List 1 -> List 2 -> List 3, muốn chọn lại chọn lại List 1 hoặc List 2thì 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
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
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
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
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
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
Được chứ, và nên như vậy.
Tuy nhiên người ta thường dùng biến trung gian khi có những mục đích khác (sử dụng cho nhiều mục đích khác nhau, sử dụng nhiều lân)
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é@
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é@
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.
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
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
* 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"
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 (&).
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...
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­¬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­ê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­ê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.
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.
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 Subgọi là thủ tục.
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
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
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
Đơ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 là
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?
Đơ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 là
Ở đâ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
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
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.
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.
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 ạ
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 ạ
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
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!!!!
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
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.
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!
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.