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.
Mình làm thử theo cách Sort thông thường thì khi dữ kiệu thay đổi, nó không luôn luôn sort theo ý mình, ví dụ ưu tiên cột A (luôn sorrt theo cách giảm dần), còn các cột còn lại thì luôn sorrt theo cách tăng dần - mỗi lần thay đổ dữ liệu thì mình phải sort lại - các bạn giúp mình với
Nếu sort bằng tay, đương nhiên khi dử liệu thay đổi bạn phải sort lại rồi ---> Lý nào nó lại tự động sort cho bạn? ---> Cho dù bạn dùng code trên thì ít nhất bạn cũng phải làm động tác nhấn nút chứ (có tự động 100% đâu)
-----------------
Theo như bạn nói, bạn muốn sort giảm dần cột đầu tiên, các cột còn lại sort tăng dần! Vậy bạn thử code này xem:
PHP:
Sub SortByX()
Dim i As Long
With Selection
For i = .Columns.Count To 1 Step -1
.Sort .Cells(2, i), 1 - (i = 1), Header:=xlGuess
Next i
End With
End Sub
Nếu sort bằng tay, đương nhiên khi dử liệu thay đổi bạn phải sort lại rồi ---> Lý nào nó lại tự động sort cho bạn? ---> Cho dù bạn dùng code trên thì ít nhất bạn cũng phải làm động tác nhấn nút chứ (có tự động 100% đâu)
-----------------
Theo như bạn nói, bạn muốn sort giảm dần cột đầu tiên, các cột còn lại sort tăng dần! Vậy bạn thử code này xem:
PHP:
Sub SortByX()
Dim i As Long
With Selection
For i = .Columns.Count To 1 Step -1
.Sort .Cells(2, i), 1 - (i = 1), Header:=xlGuess
Next i
End With
End Sub
Cảm ơn bạn đã hướng dẫn, mình làm thử và thấy có kết quả, theo bạn chỉ dẫn thì mình hiểu rằng thay vì phải sort by --- then by --- nhiều lần, thì chỉ cần cho run cái macro trên. Tuy nhiên, mình thấy nó không hoàn toàn tự động - lâu lâu, nếu thấy nó không sort như ý thì mình phải "run" 1 cái nữa ! nếu không thí dữ liệu thay đổi sẽ bị sai
Cảm ơn bạn đã hướng dẫn, mình làm thử và thấy có kết quả, theo bạn chỉ dẫn thì mình hiểu rằng thay vì phải sort by --- then by --- nhiều lần, thì chỉ cần cho run cái macro trên. Tuy nhiên, mình thấy nó không hoàn toàn tự động - lâu lâu, nếu thấy nó không sort như ý thì mình phải "run" 1 cái nữa ! nếu không thí dữ liệu thay đổi sẽ bị sai
Cái quan trọng là trước khi chạy code bạn phải quét chọn dử liệu trước ---> Chọn toàn bộ dử liệu, nếu chọn bậy (bỏ bớt cột nào đó) nó sort sai là cái chắc
Thêm nữa: Cái này không phải thuộc dạng "tự động" khi thay đổi dử liệu ---> Vẫn phải chạy code mới sort
Mình có thử nhiều lần nhưng không ổn, còn áp dụng đoạn code đã học ở chiêu thứ 30 thì luôn sort theo kiểu Ascending, có cách nào sửa code sao cho cột đầu tiên (theo thứ tự ưu tiên) thì descending, còn các cột còn lại thì Ascending - giúp mình với
Bằng cách sửa đoạn code sau:
Sub SortByX( ) Dim i As Long For i = Selection.Columns.Count To 1 Step -1 Selection.Sort Key1:=Selection.Cells(2, i), _ Order1:=xlAscending, Header:=xlGuess, Orientation:=xlTopToBottom Next i End Sub
Sub SortByX( )
Dim i As Long
For i = Selection.Columns.Count To 1 Step -1
If i = Selection.Columns.Count Then
Selection.Sort Key1:=Selection.Cells(2, i), _
Order1:=xlDescending, Header:=xlGuess, Orientation:=xlTopToBottom
Else
Selection.Sort Key1:=Selection.Cells(2, i), _
Order1:=xlAscending, Header:=xlGuess, Orientation:=xlTopToBottom
End If
Next i
End Sub
Gởi HuuThang:
Cột đầu tiên là giảm dần chứ không phải cột cuối.
Với lại code dài quá, sau đây cũng là 1 cách rút gọn, mà dễ hiểu:
PHP:
Sub SortByX( )
Dim i As Long
For i = Selection.Columns.Count To 1 Step -1
Selection.Sort Key1:=Selection.Cells(2, i), _
Order1:=IIf(i = 1, xlDescending, xlAscending), Header:=xlGuess
Next i
End Sub
Gởi HuuThang:
Cột đầu tiên là giảm dần chứ không phải cột cuối.
Với lại code dài quá, sau đây cũng là 1 cách rút gọn, mà dễ hiểu:
PHP:
Sub SortByX( )
Dim i As Long
For i = Selection.Columns.Count To 1 Step -1
Selection.Sort Key1:=Selection.Cells(2, i), _
Order1:=IIf(i = 1, xlDescending, xlAscending), Header:=xlGuess
Next i
End Sub
Gởi HuuThang:
Cột đầu tiên là giảm dần chứ không phải cột cuối.
Với lại code dài quá, sau đây cũng là 1 cách rút gọn, mà dễ hiểu:
PHP:
Sub SortByX( )
Dim i As Long
For i = Selection.Columns.Count To 1 Step -1
Selection.Sort Key1:=Selection.Cells(2, i), _
Order1:=IIf(i = 1, xlDescending, xlAscending), Header:=xlGuess
Next i
End Sub
Sư phụ dùng: IIf(i = 1, xlDescending, xlAscending)
Sau không làm giống em: 1 - (i =1)
Cho nó khỏe thân nhỉ?
PHP:
Sub SortByX()
Dim i As Long
With Selection
For i = .Columns.Count To 1 Step -1
.Sort .Cells(2, i), 1 - (i = 1), Header:=xlGuess
Next i
End With
End Sub
Đã nói là thêm 1 cách, mà lại là 1 cách dễ hiểu mờ! Cách của NDU dĩ nhiên là ngắn tuyệt rồi, nhưng người mới học sẽ phải hỏi thêm đấy. Lão chết tiệt thì quan niệm cái gì cũng từ từ thôi, cũng như dạy người yếu đánh vật ấy.
PS:
Nhiều lắm thì IIf(i = 1, 2, 1) cũng vẫn còn dễ hiểu. Hì hì.
Đã nói là thêm 1 cách, mà lại là 1 cách dễ hiểu mờ! Cách của NDU dĩ nhiên là ngắn tuyệt rồi, nhưng người mới học sẽ phải hỏi thêm đấy. Lão chết tiệt thì quan niệm cái gì cũng từ từ thôi, cũng như dạy người yếu đánh vật ấy.
PS:
Nhiều lắm thì IIf(i = 1, 2, 1) cũng vẫn còn dễ hiểu. Hì hì.
Uh.. nhỉ!
Nghĩ lại. nếu ngày xưa mà "LÃO" phang toàn tuyệt chiêu thì chắc ngày nay em đã không gọi "LÃO" là SƯ PHỤ rồi
(Spam tí sự phụ ơi)
----------
Em nghĩ sư phụ vẫn còn phải giải thích thêm 1 chổ: - Tại sao phải For ngược (Step -1) ---> Đây mới chính là chổ quan trọng nhất
Ẹc... Ẹc...
With Range("B3")
Range(.Offset(1), .End(xlDown).Offset(-1)).Select
End With
Như 1 bài viết em đã từng nói, ở đây B3 mới là cell tham gia quá trình tính toán, vậy anh hãy "bám" vào cell này ---> Tất cả những tham chiếu khác chỉ là Offset hoặc Resize (theo B3)
Giải pháp ex rất khó mong các bác giúp
XIN LỖI CÁC BÁC, EM CÓ VẤN ĐỀ NÀY ĐÃ HỎI TỪ LÂU MÀ CHƯA AI GIÚP...
KHÔNG BIẾT LÀM THẾ NÀO NÊN ĐÀNH XIN PHÉP CẮT NGANG CHÚT!
Em muốn giúp Em làm một bảng câu hỏi lựa chọn Yes/No ví dụ: bảng excel như sau:
...A .......................................B.......... ................C
1BẠN ĐÃ ĐI LÀM CHƯA...............Yes
2BẠN LÀM Ở HÀ NỘI À................No
3BẠN LÀM Ở TPHCM À.................Yes
GHI GHÚ: Nếu trường hợp B2 trả lời là No thì A2 sẽ không hiện ra mà sẽ ẩn đi, còn nếu B2 là Yes thì A3 sẽ không hiện ra...
Chào cả nhà
Em dùng phần mềm dự toán chạy trên nền excel, khi cần diễn giải khối lượng trong một ô thì em nhập: Móng M1: 10+5+3 sau đó bấm Ctrl E rồi bấm enter thì nó hiện kết quả là: Móng M1: 10+5+3=18 trên ô đó luôn. Chương trình sẽ thực hiện phép tính nếu trước phép tính đó có dấu ":"
Em không hiểu tại sao vừa có dòng text và số mà nó có thể tính toán được. Pro nào biết tại sao mong giải thích dùm và viết hộ mình cái code với.
Mong được chỉ bảo chi tiết vì e dốt đặc VBA.
Thanks
Chào cả nhà
Em dùng phần mềm dự toán chạy trên nền excel, khi cần diễn giải khối lượng trong một ô thì em nhập: Móng M1: 10+5+3 sau đó bấm Ctrl E rồi bấm enter thì nó hiện kết quả là: Móng M1: 10+5+3=18 trên ô đó luôn. Chương trình sẽ thực hiện phép tính nếu trước phép tính đó có dấu ":"
Em không hiểu tại sao vừa có dòng text và số mà nó có thể tính toán được. Pro nào biết tại sao mong giải thích dùm và viết hộ mình cái code với.
Mong được chỉ bảo chi tiết vì e dốt đặc VBA.
Thanks
Bạn chỉnh thế nào cứ để yên đấy rồi đưa file lên đây là được rồi (mọi người sẽ sửa giúp)
-----------
Tôi làm file thí nghiệm (giống như bạn yêu cầu) ---> Xem file thử nhé
Chào các Bác
Bác nào có code hàm Moving Average như trong phần Data Analysis không?
Với Input Range : $K$1:$K$10000
Interval : 100
Output Range : $L$1:$L$10000
Mong các bác giúp. Xin cảm ơn
Nhờ cái nghiên cứu này mà tôi học được chiêu thức từ các cao thủ trong diễn đàng. nên nội công tăng lên thấy rõ. tới đây tôi bị kẹt không biét làm sao. nhờ các sư huynh chỉ giáo. làm xong tôi post lên cho anh em tham khảo
Giải pháp ex rất khó mong các bác giúp
XIN LỖI CÁC BÁC, EM CÓ VẤN ĐỀ NÀY ĐÃ HỎI TỪ LÂU MÀ CHƯA AI GIÚP...
KHÔNG BIẾT LÀM THẾ NÀO NÊN ĐÀNH XIN PHÉP CẮT NGANG CHÚT!
Em muốn giúp Em làm một bảng câu hỏi lựa chọn Yes/No ví dụ: bảng excel như sau:
...A .......................................B.......... ................C
1BẠN ĐÃ ĐI LÀM CHƯA...............Yes
2BẠN LÀM Ở HÀ NỘI À................No
3BẠN LÀM Ở TPHCM À.................Yes
GHI GHÚ: Nếu trường hợp B2 trả lời là No thì A2 sẽ không hiện ra mà sẽ ẩn đi, còn nếu B2 là Yes thì A3 sẽ không hiện ra...
Chú ý chỉ có thể định dạng dữ liệu kiểu ngày về dạng 'm/d/yyyy'
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Columns("A:A")) Is Nothing Then
Dim Sh As Worksheet, Rng As Range, sRng As Range, cRng As Range
Dim MyAdd As String
Set Sh = Sheets("Data")
Set Rng = Sh.Range(Sh.[c1], Sh.[c65500].End(xlUp))
Rng.NumberFormat = "m/d/yyyy"
Set sRng = Rng.Find(Format(Target.Value, "m/d/yyyy"), , xlFormulas, xlWhole)
If Not sRng Is Nothing Then
MyAdd = sRng.Address
Do
If cRng Is Nothing Then
Set cRng = sRng.Offset(, -1)
Else
Set cRng = Union(cRng, sRng.Offset(, -1))
End If
Set sRng = Rng.FindNext(sRng)
Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
End If
If Not cRng Is Nothing Then
cRng.Copy
Target.Offset(, 2).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
Application.CutCopyMode = False
End If
End If
End Sub
Bạn xem lại File đính kèm của mình. Trong đó mình có sửa đổi nội dung thắc mắc .
còn đoạn code của bạn giúp mình, chép về loay hoay mãi mà không biết làm sao để nó chạy như mình mong muốn.
xem ra bạn viết được như vậy là nội công có hạng rồi. giúp mình với.
trước đây mình đã làm được một file Excel để nghiên cứu. với số liệu 1 năm 2008. kết quả dự đoán lâu lâu (lâu lâu thôi nhé) nhịn ăn 5 tô hủ tíu đánh đề cũng kiếm được 4-5 "chai".
bổng máy mình bị rớt ổ đĩa cứng mất hết dữ liệu phải làm lại từ đầu.
download được kết quả. nhưng nó có format dàn trang không như mong muốn phải chỉnh sửa lại để dễ bề lập công thức.
Mong bạn ra tay cứu giá
Thành thật cảm ơn
Bạn xem lại File đính kèm của mình. Trong đó mình có sửa đổi nội dung thắc mắc .
còn đoạn code của bạn giúp mình, chép về loay hoay mãi mà không biết làm sao để nó chạy như mình mong muốn.
xem ra bạn viết được như vậy là nội công có hạng rồi. giúp mình với.
trước đây mình đã làm được một file Excel để nghiên cứu. với số liệu 1 năm 2008. kết quả dự đoán lâu lâu (lâu lâu thôi nhé) nhịn ăn 5 tô hủ tíu đánh đề cũng kiếm được 4-5 "chai".
bổng máy mình bị rớt ổ đĩa cứng mất hết dữ liệu phải làm lại từ đầu.
download được kết quả. nhưng nó có format dàn trang không như mong muốn phải chỉnh sửa lại để dễ bề lập công thức.
Mong bạn ra tay cứu giá
Thành thật cảm ơn
chân thành cảm ơn các bạn đã đọc thắc mắc của anbamilu2005
Chân thành cảm tạ các bạn đã quan tâm giúp đỡ . trong lúc vật lộn với code mình quay trở về các file cũ tìm được từ đống phục hồi ổ đĩa bới tung lên và tìm thấy kho số liệu.
ai chà chà khoooooo....ẻ
nhưng dù sao cũng phải khâm phục các sư huynh đệ.
những dòng code "khô queo" vậy mà các sư huynh đệ luyện được quá là hay.
Ít hôm nữa tôi chỉnh chót cái "Dự đoán KQXS" xong sẽ "xe" lên diễn đàn để các sư huynh đệ coi chơi và góp ý thêm.
chúc sức khỏe các sư huynh đệ.
chúc gặt hái được nhiều thành công
Tôi muốn dùng VBA để thực hiện lệnh Cutom format "#" Khẩu" . Câu lệnh do Macro ghi lại là: Selection.NumberFormat = "#"" Kh?u""" không thể hiện được chữ ẩ. Nhờ các bạn viết giúp câu lệnh này. Thanks !
Em có đoạn code này nhưng không hiểu rõ được các bac giải thích hộ em với
Mã:
Public Function WriteHeaderFileDBF(FileInput As String)
Dim i As Long
Put #FileNumber, , Header.DBT '3
Put #FileNumber, , Header.YY '109
Put #FileNumber, , Header.MM '9
Put #FileNumber, , Header.DD '6
Put #FileNumber, , Header.NumRecords 'So luong ban ghi
Put #FileNumber, , Header.HeaderLen '257
Put #FileNumber, , Header.RecordLen '604
Put #FileNumber, , Header.NotUse 'Null
For i = 1 To NumFields '7
Put #FileNumber, , Fields(i).FieldName
Put #FileNumber, , Fields(i).FieldType
Put #FileNumber, , Fields(i).FieldMemoAdd
Put #FileNumber, , Fields(i).FieldWidth
Put #FileNumber, , Fields(i).FieldDecimal
Put #FileNumber, , Fields(i).NotUse
Next i
End Function
PHP:
Public Function WriteRecordsFileDBF(FileInput As String)
Put #FileNumber, Header.HeaderLen, Header.EndHeader
Records.DeleteFlag = 32
With Parcels(i)
Records.FieldParcelId = .Parcel
Records.FieldUserName = .UserName
Records.FieldCodeLandType = .LandType
Records.FieldArea = .Area
Records.FieldArea2 = .Area2
Records.FieldAddress = .Address
Records.FieldMDSD2003 = .MDSD2003
End With
Put #FileNumber, , Records.DeleteFlag
Put #FileNumber, , Records.FieldParcelId
Put #FileNumber, , Records.FieldArea
Put #FileNumber, , Records.FieldArea2
Put #FileNumber, , Records.FieldUserName
Put #FileNumber, , Records.FieldCodeLandType
Put #FileNumber, , Records.FieldAddress
Put #FileNumber, , Records.FieldMDSD2003
End Function
Mã:
Public Function ReadHeaderFileDBF(FileInput As String)
Dim i As Long
FileNumber = FreeFile
Open FileInput For Binary As #FileNumber
Get #FileNumber, , Header.DBT
Get #FileNumber, , Header.YY
Get #FileNumber, , Header.MM
Get #FileNumber, , Header.DD
Get #FileNumber, , Header.NumRecords
Get #FileNumber, , Header.HeaderLen
Get #FileNumber, , Header.RecordLen
Get #FileNumber, , Header.NotUse
NumFields = (Header.HeaderLen - 32 - 1) / 32
ReDim Fields(NumFields) As FieldStructure
For i = 1 To NumFields
Get #FileNumber, , Fields(i).FieldName
Get #FileNumber, , Fields(i).FieldType
Get #FileNumber, , Fields(i).FieldMemoAdd
Get #FileNumber, , Fields(i).FieldWidth
Get #FileNumber, , Fields(i).FieldDecimal
Get #FileNumber, , Fields(i).NotUse
Next i
Close #FileNumber
End Function
Trong khi chờ phương cách xịn hơn, tạm xài cách chuối, như sau
Tôi muốn dùng VBA để thực hiện lệnh Cutom format "#" Khẩu" . Câu lệnh do Macro ghi lại là: Selection.NumberFormat = "#"" Kh?u""" không thể hiện được chữ ẩ. Nhờ các bạn viết giúp câu lệnh này. Thanks !
Tôi muốn dùng VBA để thực hiện lệnh Cutom format "#" Khẩu" . Câu lệnh do Macro ghi lại là: Selection.NumberFormat = "#"" Kh?u""" không thể hiện được chữ ẩ. Nhờ các bạn viết giúp câu lệnh này. Thanks !
Chào các Bác
Bác nào có code hàm Moving Average như trong phần Data Analysis không?
Với Input Range : $K$1:$K$10000
Interval : 100
Output Range : $L$1:$L$10000
Mong các bác giúp. Xin cảm ơn
Hỏi các bác giúp đỡ , nhưng chưa có câu trả lời .Tôi đành mày mò vậy. Tạm đưa lên đây đoạn mã này nếu có trùng của ai xin thứ lỗi .
Ngoài ra nếu ai có đoạn code nào hay hơn xin chỉ giúp . Xin cám ơn
Sub TrungBinhDong() Dim i As Integer Dim j As Integer j = 1 For i = 1 To 10000 Cells(j, 2).Select ' Kết quả ở cột B If j < 100 Then ActiveCell.FormulaR1C1 = "#N/A" ' lay tu 1 den 99 ActiveCell.Offset(1, 0).Range("A1").Select ' Dữ liệu ở cột A ElseIf 100 <= j Then ActiveCell.FormulaR1C1 = "=AVERAGE(RC[-1]:R[-99]C[-1])" ActiveCell.Offset(1, 0).Range("A1").Select End If j = j + 1 Next i End Sub
Tôi không biết về Marco nên nhờ các bác sửa lại code sau:
Sub copy_special()
With Selection
Selection.copy = specialcell
End With
End Sub
Chắc là sai ở chỗ bôi đỏ nhưng tôi không biết sửa thành câu lệnh như thế nào cho phù hợp. Code này để copy vùng lựa chọn thành dữ liệu (vùng lựa chọn đang là công thức).
Tôi không biết về Marco nên nhờ các bác sửa lại code sau:
Sub copy_special()
With Selection
Selection.copy = specialcell
End With
End Sub
Chắc là sai ở chỗ bôi đỏ nhưng tôi không biết sửa thành câu lệnh như thế nào cho phù hợp. Code này để copy vùng lựa chọn thành dữ liệu (vùng lựa chọn đang là công thức).
Lưu ý với bạn là code trên chỉ hoạt động chính xác nếu Selection là 1 vùng liên tục ---> Nếu Selection là nhiều vùng tách biệt nhau thì lúc đó phải xử lý khác
Thanks bác lần nữa nhé. Vì mình thực sự không biết về marco nên chỉ chắp ghép từ nhiều đoạn code miễn phí trên mạng và gắn vào của mình nên nếu nó có vấn đề gì làm cho code không chạy được thì chịu luôn.
Và Dim x, y, z, m, n As Integer y = Range("IQ1").Value z = Range("IR1").Value m = Range("IS1").Value
Sheets(y).Select Sheets(y).Copy Before:=Sheets(2) Cells.Select Selection.RemoveSubtotal
Vấn đề của tôi như sau : 1. Range("A5", x), và Sheets(y).Select: với "x" và "y" là do mình phải tự tác động vào code hay là do macro tự thu được. Nếu tự thu được thì mình làm như thế nào để được như vậy. Còn do mình tác động thì sao mà mình biết để tác động?
2. Dim x, y, z, m, n As Integer y = Range("IQ1").Value z = Range("IR1").Value m = Range("IS1").Value
Các biến x,y, z mà mình khai báo là để giúp macro chạy nhanh hơn phải không?
Tôi chỉ mới biết về macro, tôi có đọc một số bài viết về macro của GPE và chỉ biết được 1 vài macro đơn giản. Những code phức tạp thì chưa hiểu được nên mong các bạn chỉ giúp. Cám ơn rất nhiều.
Public Function WriteHeaderFileDBF(FileInput As String)
Dim i As Long
Put #FileNumber, , Header.DBT '3'
Put #FileNumber, , Header.YY '109'
Put #FileNumber, , Header.MM '9'
Put #FileNumber, , Header.DD '6'
Put #FileNumber, , Header.NumRecords 'So luong ban ghi'
Put #FileNumber, , Header.HeaderLen '257'
Put #FileNumber, , Header.RecordLen '604'
Put #FileNumber, , Header.NotUse 'Null'
For i = 1 To NumFields '7
Put #FileNumber, , Fields(i).FieldName
Put #FileNumber, , Fields(i).FieldType
Put #FileNumber, , Fields(i).FieldMemoAdd
Put #FileNumber, , Fields(i).FieldWidth
Put #FileNumber, , Fields(i).FieldDecimal
Put #FileNumber, , Fields(i).NotUse
Next i
End Function
Mã:
[B]Public Function WriteRecordsFileDBF(FileInput As String)[/B]
Put #FileNumber, Header.HeaderLen, Header.EndHeader
Records.DeleteFlag = 32
With Parcels(i)
Records.FieldParcelId = .Parcel
Records.FieldUserName = .UserName
Records.FieldCodeLandType = .LandType
Records.FieldArea = .Area
Records.FieldArea2 = .Area2
Records.FieldAddress = .Address
Records.FieldMDSD2003 = .MDSD2003
End With
Put #FileNumber, , Records.DeleteFlag
Put #FileNumber, , Records.FieldParcelId
Put #FileNumber, , Records.FieldArea
Put #FileNumber, , Records.FieldArea2
Put #FileNumber, , Records.FieldUserName
Put #FileNumber, , Records.FieldCodeLandType
Put #FileNumber, , Records.FieldAddress
Put #FileNumber, , Records.FieldMDSD2003
[B]End Function[/B]
PHP:
Public Function ReadHeaderFileDBF(FileInput As String)
Dim i As Long
FileNumber = FreeFile
Open FileInput For Binary As #FileNumber
Get #FileNumber, , Header.DBT
Get #FileNumber, , Header.YY
Get #FileNumber, , Header.MM
Get #FileNumber, , Header.DD
Get #FileNumber, , Header.NumRecords
Get #FileNumber, , Header.HeaderLen
Get #FileNumber, , Header.RecordLen
Get #FileNumber, , Header.NotUse
NumFields = (Header.HeaderLen - 32 - 1) / 32
ReDim Fields(NumFields) As FieldStructure
For i = 1 To NumFields
Get #FileNumber, , Fields(i).FieldName
Get #FileNumber, , Fields(i).FieldType
Get #FileNumber, , Fields(i).FieldMemoAdd
Get #FileNumber, , Fields(i).FieldWidth
Get #FileNumber, , Fields(i).FieldDecimal
Get #FileNumber, , Fields(i).NotUse
Next i
Close #FileNumber
End Function
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
Do mới vào nên không biết post bài có đúng chố không , nếu sai BQT chuyển dùm
Nhờ BQT chỉ cho chỗ sai trong đoạn code dưới đây
PHP:
Function FindSp(Mang As Range, Diem As Range) As Long
For i = 1 To 3
If fn.Find(Mang.Offset(i, 0), Diem) > 0 Then
FindSp = Find(Mang.Offset(i, 0), Diem)
Exit For
Next
End Function
Xin cảm ơn BQT
Ko ai giúp đỡ new member sao??? Việc này rất gấp mong các bạn Pro về code hướng dẫn tôi với.
Nhờ các bro giúp đỡ đoạn code này. Đoạn này dùng để quản lý nhân viên có hình ảnh: ví dụ: Khi gõ tên người thư1 ==> ảnh người thứ 1 v..v.... Đoạn code này được lấy từ bài: http://www.giaiphapexcel.com/forum/showthread.php?t=18652
Tôi ko biết về code nên mong các bạn chỉ giúp
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rng As Range, PicName As String
Application.ScreenUpdating = False
On Error Resume Next
If Not Intersect([A3:A10], Target) Is Nothing Then
Set Rng = Sheet2.Range("A2").CurrentRegion
PicName = ThisWorkbook.Path & "\" & Rng.Find(Target).Offset(, 4)
Sheet1.Shapes(Target.Offset(, 4).Address).Delete
With ActiveSheet.Pictures.Insert(PicName)
.Name = Target.Offset(, 4).Address
.Left = Target.Offset(, 4).Left: .Top = Target.Offset(, 4).Top
.Width = Target.Offset(, 4).Width: .Height = Target.Offset(, 4).Height
End With
End If
End Sub
Do mới vào nên không biết post bài có đúng chố không , nếu sai BQT chuyển dùm
Nhờ BQT chỉ cho chỗ sai trong đoạn code dưới đây
Mã:
Function FindSp(Mang As Range, Diem As Range) As Long
For i = 1 To 3
If [COLOR="Red"]fn[/COLOR].Find(Mang.Offset(i, 0), Diem) > 0 Then
FindSp = Find(Mang.Offset(i, 0), Diem)
Exit For
Next
End Function
(1) Thiếu câu lệnh End If
(2) fn phải được chỉ ra rõ ràng, như Range("A135")
(3) Câu lệnh
Mã:
FindSp = Find(Mang.Offset(i, 0), Diem)
Sai hai chổ, đó là:
(+) Phương thức FIND() phải chỉ rõ nơi phải tìm, Bắt buộc phải như là
Range("A1:B65500").FIND(. . . , . . .)
(+) FindSP được khai báo có kiểu dữ liệu là Long; Còn phương thức tìm kiếm trả về là biến đối tượng; mà cụ thể có kiểu dữ liệu Range
Câu lệnh đó có thể phải sửa lại gần giống như thế này
(Nhưng có thể vẫn báo lỗi, một khi phương thức không tìm thấy cái cần tìm trong vùng quy định cho nó.)
(4) Câu lệnh: If fn.Find(Mang.Offset(i, 0), Diem) > 0 Then
Phải sửa lại như (3), hay
PHP:
If Not fn.Find(Mang.Offset(i, 0), Diem) Is Nothing Then
. . . . .
Nói chung bạn nên khai báo các biến đầy đủ;
Luôn nên dùng câu lệnh Option Explicit trên các Sub cũng như các Function
Đó là lời mình luôn khuyên những người đang chập chững đến với VBA! Bạn có dận cũng đành chịu!
Nhờ các bro giúp đỡ đoạn code này. Đoạn này dùng để quản lý nhân viên có hình ảnh: ví dụ: Khi gõ tên người thư1 ==> ảnh người thứ 1 v..v.... Đoạn code này được lấy từ bài: http://www.giaiphapexcel.com/forum/showthread.php?t=18652
Tôi ko biết về code nên mong các bạn chỉ giúp
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rng As Range, PicName As String
Application.ScreenUpdating = False
On Error Resume Next
If Not Intersect([A3:A10], Target) Is Nothing Then
Set Rng = Sheet2.Range("A2").CurrentRegion
PicName = ThisWorkbook.Path & "\" & Rng.Find(Target).Offset(, 4)
Sheet1.Shapes(Target.Offset(, 4).Address).Delete
With ActiveSheet.Pictures.Insert(PicName)
.Name = Target.Offset(, 4).Address
.Left = Target.Offset(, 4).Left: .Top = Target.Offset(, 4).Top
.Width = Target.Offset(, 4).Width: .Height = Target.Offset(, 4).Height
End With
End If
End Sub
(1) Thiếu câu lệnh End If
(2) fn phải được chỉ ra rõ ràng, như Range("A135")
(3) Câu lệnh
Mã:
FindSp = Find(Mang.Offset(i, 0), Diem)
Sai hai chổ, đó là:
(+) Phương thức FIND() phải chỉ rõ nơi phải tìm, Bắt buộc phải như là
Range("A1:B65500").FIND(. . . , . . .)
(+) FindSP được khai báo có kiểu dữ liệu là Long; Còn phương thức tìm kiếm trả về là biến đối tượng; mà cụ thể có kiểu dữ liệu Range
Câu lệnh đó có thể phải sửa lại gần giống như thế này
(Nhưng có thể vẫn báo lỗi, một khi phương thức không tìm thấy cái cần tìm trong vùng quy định cho nó.)
(4) Câu lệnh: If fn.Find(Mang.Offset(i, 0), Diem) > 0 Then
Phải sửa lại như (3), hay
PHP:
If Not fn.Find(Mang.Offset(i, 0), Diem) Is Nothing Then
. . . . .
Nói chung bạn nên khai báo các biến đầy đủ;
Luôn nên dùng câu lệnh Option Explicit trên các Sub cũng như các Function
Đó là lời mình luôn khuyên những người đang chập chững đến với VBA! Bạn có dận cũng đành chịu!
Function MatchX(L_Value As Range, L_Array As Range)
Dim i As Long
For i = 1 To L_Array.Resize(, 1).Count
If Not L_Value.Find(L_Array(i, 1), LookAt:=xlPart) Is Nothing Then
MatchX = i: Exit Function
End If
Next
End Function
Function MatchX(L_Value As Range, L_Array As Range)
Dim i As Long
For i = 1 To L_Array.Resize(, 1).Count
If Not L_Value.Find(L_Array(i, 1), LookAt:=xlPart) Is Nothing Then
MatchX = i: Exit Function
End If
Next
End Function
Do giá trị trả về có thể là số , có thể là ký tự , mà trong code của bác chỉ trả về phần tử thứ n trong mảng , vậy có cách nào để giá trị trả về của hàm MatchX linh hoạt hơn không . Rất cảm ơn
Do giá trị trả về có thể là số , có thể là ký tự , mà trong code của bác chỉ trả về phần tử thứ n trong mảng , vậy có cách nào để giá trị trả về của hàm MatchX linh hoạt hơn không . Rất cảm ơn
Vậy ý bạn muốn trả về kết quả gì? Cứ ghi rõ vào file luôn rồi gữi lên nhé (vì câu hỏi trước bạn yêu cầu thế mà)
Nếu muốn kết quả trả về là giá trị thì chỉ cần thay: MatchX = i: Exit Function
thành: MatchX = L_Array(i, 1): Exit Function
Option Explicit
Function PartFind(FindValue As String, FindRange As Range)
Dim Clls As Range
For Each Clls In FindRange
If InStr(FindValue, Clls.Value) > 0 Then
PartFind = Clls.Offset(, -1): Exit Function
End If
Next Clls
End Function
Option Explicit
Function PartFind(FindValue As String, FindRange As Range)
Dim Clls As Range
For Each Clls In FindRange
If InStr(FindValue, Clls.Value) > 0 Then
PartFind = Clls.Offset(, -1): Exit Function
End If
Next Clls
End Function
Anh ơi, bài này người ta đang hỏi về Find cơ mà (em đoán vậy)
Hơn nữa Clls.Offset(, -1) em thấy không ổn ---> Sao có thể biết chắc FindRange nằm cạnh FindValue?
Có chăng, nếu dùng InStr em nghĩ phải vầy:
PHP:
Function PartFind(FindValue As String, FindRange As Range)
Dim i As Long
For i = 1 To FindRange.Resize(, 1).Count
If InStr(UCase(FindValue), UCase(FindRange(i))) > 0 Then
PartFind = FindRange(i, 1): Exit Function
End If
Next i
End Function
Trong VBA câu lệnh tương đương với bấm phím Ctrl + Shift + mũi tên xuống thì mình đã biết nhưng không biết có hay không câu lệnh tương đương với bấm phím Shift + mũi tên xuống, nếu có thể viết được các Bạn viết giúp mình nhé. Thanks!
Trong VBA câu lệnh tương đương với bấm phím Ctrl + Shift + mũi tên xuống thì mình đã biết nhưng không biết có hay không câu lệnh tương đương với bấm phím Shift + mũi tên xuống, nếu có thể viết được các Bạn viết giúp mình nhé. Thanks!
Cảm ơn các bạn đã giúp nhưng chưa có phương án nào đạt yêu cầu. Tôi đã bổ sung file ví dụ và làm rõ lý do tại sao tôi muốn thế. Rất mong các bạn vui lòng giúp đỡ và có thể dùng cách khác miễn là đạt được yêu cầu. Thanks!
Cảm ơn Ndu ! Code này đạt yêu cầu rồi nhưng tôi chưa biết cách làm thế nào để tuỳ biến Cells(1) tức là khi chạy code sẽ chọn Cells hiện hành và Cells kế tiếp (ô đầu của mảng kế tiếp).
With Range(ActiveCell, Cells(Cells.Rows.Count - 1, ActiveCell.Column))
Range(.Cells(1), Intersect(.Cells, .Offset(1)).SpecialCells(12)(1)).Select
End With
With Range(ActiveCell, Cells(Cells.Rows.Count - 1, ActiveCell.Column))
Range(.Cells(1), Intersect(.Cells, .Offset(1)).SpecialCells(12)(1)).Select
End With
1. Dịch nghĩa của những câu tô đỏ đậm trong đoạn code sau:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If [COLOR=Red][B]Intersect[/B][/COLOR](ActiveCell, Range("B2:C10")) [COLOR=Red][B]Is Nothing[/B][/COLOR] Then
MsgBox Target.Address & " nam trong vung B2:C10"
Else
MsgBox Target.Address & " nam ngoai vung B2:C10"
End If
End Sub
2. Tôi muốn khi ô hiện hành nằm trong vùng B2:C10 thì kết quả là Msgbox (1) và khi ô hiện hành nằm ngoài vùng B2:C10 thì cho kết quả là Msgbox (2). Nhưng đoạn code này chỉ cho một kết quả là Msgbox (1) dù ô hiện hành nằm trong vùng hoặc ngoài vùng. Vậy code này sai ở đâu và phải sửa như thế nào ?? Thanks!
1. Dịch nghĩa của những câu tô đỏ đậm trong đoạn code sau:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If [COLOR=Red][B]Intersect[/B][/COLOR](ActiveCell, Range("B2:C10")) [COLOR=Red][B]Is Nothing[/B][/COLOR] Then
MsgBox Target.Address & " nam trong vung B2:C10"
Else
MsgBox Target.Address & " nam ngoai vung B2:C10"
End If
End Sub
2. Tôi muốn khi ô hiện hành nằm trong vùng B2:C10 thì kết quả là Msgbox (1) và khi ô hiện hành nằm ngoài vùng B2:C10 thì cho kết quả là Msgbox (2). Nhưng đoạn code này chỉ cho một kết quả là Msgbox (1) dù ô hiện hành nằm trong vùng hoặc ngoài vùng. Vậy code này sai ở đâu và phải sửa như thế nào ?? Thanks!
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B2:C10")) Is Nothing Then
MsgBox Target.Address & " nam trong vung B2:C10"
Else
MsgBox Target.Address & " nam ngoai vung B2:C10"
End If
End Sub
Intersect(Target, Range("B2:C10")) là vùng GIAO ĐIỂM giữa Target và Range("B2:C10") hay cũng chính là Target luôn Intersect(Target, Range("B2:C10")) Is Nothing ý muốn nói KHÔNG CÓ GIAO ĐIỂM NÀO
Vậy NotIntersect(Target, Range("B2:C10")) Is Nothing là CÓ TÌM THẤY GIAO ĐIỂM
-------------- Ví dụ minh họa về Intersect
Intersect([B2:C10], [C813]) sẽ là Range("C8:C10")
Tôi mới học viết code nên còn nhiều lệnh chưa biết hết cách dùng, nhờ mọi người giải thích và cho ví dụ giùm :
1, Lệnh Controls(...) có ý nghĩa gì ? Tôi đã được giải thích là để lấy giá trị nào đó trong mảng nhưng vẫn không hình dung được.
2, Lệnh Split(chuỗi cần tách, mark để tách, số lượng chuỗi con cần tách) nhưng tôi vấn không thực hiện được.
Ví dụ ở ô A1 tôi gõ "Truong-Giang-73", tôi cần tách là Ô B1 = "Truong", B2 = "Giang", B3 = "73" nhưng tôi dùng các lệnh sau trong Immediate :
* rangre("b1") = split(rangge("a1"), "-",1) cho KQ = "Truong"
* rangre("b2") = split(rangge("a1"), "-",2) cho KQ cũng = "Truong"
* rangre("b3") = split(rangge("a1"), "-",20) cũng cho KQ là = "Truong"
Xin mọi người giải thích kỹ kỹ và cho ví dụ luôn nhá.
TG73 xin cảm ơn nhiều.
Split trả về giá trị là 1 mảng. Vậy mà bạn gán mảng đó cho 1 range thì nó chỉ lấy giá trị đầu tiên của mảng mà thôi.
Bạn thử code này sẽ hiểu lý do tại sao? Thay mSplit bằng các giá trị khác nhau để rút ra kết luận.
[highlight=VB]
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
Dim myArr As Variant, mSplit As Long, i As Long
mSplit = 3
myArr = Split([A1], "-", mSplit)
For i = 1 To mSplit
Cells(i, 2).Value = myArr(i - 1)
Next i
End Sub
[/highlight]
Cảm ơn anh Cada_fi, qua bài test của anh tôi đã hiểu. Vì trước tôi có gặp một ví dụ về lệnh Split nhưng thiếu thông số "mSplit" và chưa hiểu về mảng nên xoay đi xoay lại mãi vẫn là số "0".
Còn Controls(i) có phải là đối tượng i trong Form không ah ?
Tôi vừa xem một bài trên GPE có đoạn code (của Ndu) nhưng có nhiều câu tôi chưa hiểu. Nhờ các bạn dịch nghĩa giúp tôi đoạn code này (dịch xen kẽ từng dòng lệnh). Thanks !
Mã:
Function GroupJoin(Find_String As String, Find_Range As Range, Col_Index As Long, Optional Sep As String = "-") As String
Dim i As Long, [COLOR=Red]Dic[/COLOR]
On Error Resume Next
Set Dic = CreateObject("[COLOR=Red]Scripting.Dictionary[/COLOR]")
For i = 1 To Len([COLOR=Red]Find_String[/COLOR])
With [COLOR=Red]Find_Range.Find(Mid(Find_String, i, 1), , , xlWhole, , , False)[/COLOR]
If Not .Cells Is Nothing Then
[COLOR=Red]Dic.Add i, .Cells(, Col_Index)[/COLOR]
End If
End With
Next i
[COLOR=Red]GroupJoin = Join(Dic.Items, Sep)[/COLOR]
End Function
Function GroupJoin(Find_String As String, Find_Range As Range, Col_Index As Long, Optional Sep As String = "-") As String| Cái này chỉ là đặt tên biến và kiểu biến thôi. "Optional" dùng để chỉ rằng biến này có hay ko cũng được.
Dim i As Long,
Dic| Đặt biến
On Error Resume Next|Xử lý lỗi trả về dòng tiếp theo dòng bị lỗi
Set Dic = CreateObject("
Scripting.Dictionary
")|
Dùng
để tạo 1 Object mới (dạng mãng chứa text) và đặt cho biến Dic
For i = 1 To Len(
Find_String
)| chạy vòng lặp từ 1 đến độ dài ký tự
Find_String
With
Find_Range.Find(Mid(Find_String, i, 1), , , xlWhole, , , False)| VớiFind_Range (là vùng địa chỉ cần tìm); lệnh Find() là tìm một giá trị nào đó trong vùng Find_Range (và chỉ lấy ô đầu tiên tìm thấy nếu trùng)
If Not .Cells Is Nothing Then| Nếu vùng tìm được đó không phải là rỗng thì Dic.Add i, .Cells(, Col_Index)|Nạp dữ liệu đó cho Dic ở vị trí i; dữ liệu thuộc vùng mới tìm được lấy cột thứ Col_Index
End If| kết thúc
IF
End With| kết thúc
With
Next i|kết thúc lần thứ
i
của
ForGroupJoin = Join(Dic.Items, Sep)| Lệnh Join(<Text>,<ký tự cách>) dùng để ghép các đoạn text của một mãng. Dic.Items để lấy các phần tử được nạp trong Dic ra.
End Function
Đây là những gì em biết. Nếu có gì thiếu sót thì xin mọi người bổ sung giúp... em cũng cố thêm kiến thức nha! Ths.
Thân.
Tôi vừa xem một bài trên GPE có đoạn code (của Ndu) nhưng có nhiều câu tôi chưa hiểu. Nhờ các bạn dịch nghĩa giúp tôi đoạn code này (dịch xen kẽ từng dòng lệnh). Thanks !
Mã:
Function GroupJoin(Find_String As String, Find_Range As Range, Col_Index As Long, Optional Sep As String = "-") As String
Dim i As Long, [COLOR=Red]Dic[/COLOR]
On Error Resume Next
Set Dic = CreateObject("[COLOR=Red]Scripting.Dictionary[/COLOR]")
For i = 1 To Len([COLOR=Red]Find_String[/COLOR])
With [COLOR=Red]Find_Range.Find(Mid(Find_String, i, 1), , , xlWhole, , , False)[/COLOR]
If Not .Cells Is Nothing Then
[COLOR=Red]Dic.Add i, .Cells(, Col_Index)[/COLOR]
End If
End With
Next i
[COLOR=Red]GroupJoin = Join(Dic.Items, Sep)[/COLOR]
End Function
Em nghĩ chắc chỉ có 1 chổ anh chưa biết, đó là Dictionary Object ---> Cái này chuyên dùng để xử lý mãng, rất dể dùng
1> Để dùng Dictionary thì đầu tiên anh phải khởi tạo cho nó bằng lệnh:
Set object = CreateObject("Scripting.Dictionary")
2> Câu lệnh quan trong nhất và thường dùng nhất trong Dictionary là phương thức Add
Cú pháp object.Add key, item Ý nghĩa: Add 1 key nào đó và 1 Item nào đó vào Object
Trong đó ta phải lưu ý 1 điều quan trọng:
- Item có thể bỏ qua nhưng Key bắt buộc phải có
- Key luôn là 1 phần tử duy nhất ---> Tức nếu anh add 1 key đã tồn tại trước đó thì nó sẽ... cằn nhằn ----> Người ta tận dụng đặc điểm này để lọc dử liệu duy nhất đấy
3> Sau khi đã hoàn tất việc Add dử liệu vào Object, cuối cùng ta được 2 mãng:
Object.Keys và Object.Items
4> Việc truy xuất các phần tử trong Object này hoàn toàn giống như với mãng, tức
Object.Keys(0) ---> Lấy giá trị đầu tiên trong Keys
Object.Items(0) ---> Lấy giá trị đầu tiên trong Items
.....
Object.Keys(Object.Count) ---> Lấy phần tử cuối cùng của Keys
Object.Items(Object.Count) ---> Lấy phần tử cuối cùng của Items
-----------
Đây là nhưng phương thức thường dùng, ngoài ra còn nhiều phương thức khác như Exists, Remove, RemoveAll... vân vân...
Theo nhận định của em, khi làm việc với mãng ta dùng Dictionary Object sẽ dể hơn nhiều so với cách thông thường (phải ReDim tùm lum cả)
-------------
Em ví dụ dùng Dictionary Object để lấy phần tử duy nhất nha:
PHP:
Sub Unique()
Dim Clls As Range, Dic
On Error Resume Next
With Application
Set Dic = CreateObject("Scripting.Dictionary")
For Each Clls In .InputBox("Chon vung chua du lieu", Type:=8)
If Not IsEmpty(Clls) Then Dic.Add Clls.Value, ""
Next
ActiveCell.Resize(Dic.Count) = .Transpose(Dic.Keys)
End With
End Sub
Thử chạy code và chọn 1 cột nào đó có dử liệu xem
Tất nhiên với bài toán này ta có thể dùng Advanced Filter, nhưng nếu dử liệu được bố trí ngang hoặc có từ 2 cột trở lên thì Advanced Filter "xơi" nó đâu có dể ---> Trong khi đó Dictionary làm tất tần tật
1> Để dùng Dictionary thì đầu tiên anh phải khởi tạo cho nó bằng lệnh: Set object = CreateObject("Scripting.Dictionary") 2> Câu lệnh quan trong nhất và thường dùng nhất trong Dictionary là phương thức Add
Cú pháp object.Add key, item Ý nghĩa: Add 1 key nào đó và 1 Item nào đó vào Object
Trong đó ta phải lưu ý 1 điều quan trọng:
- Item có thể bỏ qua nhưng Key bắt buộc phải có
- Key luôn là 1 phần tử duy nhất ---> Tức nếu anh add 1 key đã tồn tại trước đó thì nó sẽ... cằn nhằn ----> Người ta tận dụng đặc điểm này để lọc dử liệu duy nhất đấy
3> Sau khi đã hoàn tất việc Add dử liệu vào Object, cuối cùng ta được 2 mãng:
Object.Keys và Object.Items
.......
Mã:
Sub Unique()
Dim Clls As Range, Dic
On Error Resume Next
With Application
Set Dic = CreateObject("Scripting.Dictionary")
For Each Clls In .InputBox("Chon vung chua du lieu", Type:=8)
If Not IsEmpty(Clls) Then Dic.[COLOR=Red][B]Add Clls[/B][/COLOR].Value, ""
Next
ActiveCell.Resize(Dic.Count) = .Transpose([COLOR=Red][B]Dic.Keys[/B][/COLOR])
End With
Test đoạn code này mới nhớ tới bài lọc duy nhất đã xem lâu rồi nhưng vẫn bỏ đó, nếu không bài này thì có lẽ chẳng bao giờ mình hiểu được để vận dụng. Bây giờ thì hơi hơi hiểu: vậy trong đoạn code trên Clls có phải là Keys không (chỉ thấy Add Clls chứ không thấy Add Keys). Nếu đúng thì Keys trong Dic.Keyslà như thế nào ? Rất mong các bạn vui lòng giúp tiếp. Thanks!
Test đoạn code này mới nhớ tới bài lọc duy nhất đã xem lâu rồi nhưng vẫn bỏ đó, nếu không bài này thì có lẽ chẳng bao giờ mình hiểu được để vận dụng. Bây giờ thì hơi hơi hiểu: vậy trong đoạn code trên Clls có phải là Keys không (chỉ thấy Add Clls chứ không thấy Add Keys). Nếu đúng thì Keys trong Dic.Keyslà như thế nào ? Rất mong các bạn vui lòng giúp tiếp. Thanks!
Đúng rồi ---> Clls.Value là key đấy ---> Key nằm trong nhóm Keys
Ý nghĩa đoạn code của em là: Vòng lập duyệt qua các cell (Clls) ---> Nếu đạt điều kiện thì add Clls.Value vào Dic
Như cú pháp em đã đưa ở trên Object.Add Key, Item ---> Key và Item anh muốn là gì thì tự điền vào thôi
--------------
Còn Keys trong Dic.Keys nghĩa là nguyên 1 đóng bao gồm tất cả các key đã add vào Dic
Giống vầy nè anh Set Rng = Range("A1:A10") Rng.Cells là tất cả các cell có trong Rng
--------------- Anh để ý Keys và Key... Item và Items : Khác nhau chử s Trong Dic có 2 mãng (tạm gọi là 2 nhóm)
Nhóm Keys bao gồm tất cả các Key
Nhóm Items bao gồm tất cả các Item
@ Ndu: Cảm ơn bạn rất nhiều, bây giờ thì mình tạm hiểu rồi đặc biệt là: "Keys và Key... Item và Items : Khác nhau chử s". Sử dụng Dictionary Object để làm việc với mảng thì ngoài việc lọc dử liệu duy nhất còn ứng dụng vào các trường hợp nào là phổ biến? bạn có thể gợi ý giúp tôi một trường hợp, tôi sẽ tự làm xem sao có gì chưa hiểu tôi sẽ hỏi tiếp.
Thân!
@ Ndu: Cảm ơn bạn rất nhiều, bây giờ thì mình tạm hiểu rồi đặc biệt là: "Keys và Key... Item và Items : Khác nhau chử s". Sử dụng Dictionary Object để làm việc với mảng thì ngoài việc lọc dử liệu duy nhất còn ứng dụng vào các trường hợp nào là phổ biến? bạn có thể gợi ý giúp tôi một trường hợp, tôi sẽ tự làm xem sao có gì chưa hiểu tôi sẽ hỏi tiếp.
Thân!
Mục đích sử dụng chỉ có thể là: "Thu gom" mọi thứ dựa vào 1 tiêu chỉ lọc nào đó
- Nếu anh dùng mãng thông thường, anh phải mất công Dim và ReDim đủ các kiểu
- Nếu anh dùng phương pháp nối chuổi, anh sẽ mất công cắt những phần thừa ở cuối quá trình
Với Dictionary thì hầu như anh chẳng phải làm gì ---> Đúng điều kiện thì anh Add vào (Dic.Add) ---> Kết thúc quá trình, muốn lấy ra thì mang cái Dic.Keys hoặc Dic.Items ra "xử"
Ví dụ nhỏ: "thu gom" tên các sheet
PHP:
Function SheetCol()
Dim Sh As Worksheet, Temp As New Dictionary
For Each Sh In ThisWorkbook.Worksheets
Temp.Add Sh.Name, "A"
Next
SheetCol = Temp.Keys
End Function
PHP:
Sub Test()
With Range("A1").Resize(UBound(SheetCol) + 1)
.Value = WorksheetFunction.Transpose(SheetCol)
End With
End Sub
Thêm 1 ví dụ nữa: Lấy số cell rổng lớn nhất nằm liền nhau trong 1 cột
PHP:
Function MaxBlank(Vung As Range)
Dim Clls As Range, Max As Long, Dic
Set Dic = CreateObject("Scripting.Dictionary")
For Each Clls In Vung
If IsEmpty(Clls) Then
Max = Max + 1
Else
Dic.Add Clls, Max
Max = 0
End If
Next
MaxBlank = WorksheetFunction.Max(Dic.Items)
End Function
vân vân và vân vân ---> Tùy theo khả năng anh có thể nghĩ ra được
Dim MyRng As Range, RngFound As Range, iA As Long
Dim ei As Long, iFind As String, Dem As Long
Dim MyArr() As Variant
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")
End With
Next
Next
thưa anh, chị
Trong đoạn code trên có đoạn sau em chưa hiểu, kính mong được chỉ dạy
PHP:
Set MyRng = Range("A1:A" & Er)
Set RngFound = MyRng(1)
ở trên ta set range MyRng, nhưng em chưa hiểu chỗ MyRng(1) có ý nghĩa gì
--
Em xin phép hỏi thêm một câu nữa
Trong đoạn code trên nếu phương thức FInd Previous thay bằng Find Next thì có ảnh hưởng gì không?
thưa anh, chị
Trong đoạn code trên có đoạn sau em chưa hiểu, kính mong được chỉ dạy
PHP:
Set MyRng = Range("A1:A" & Er)
Set RngFound = MyRng(1)
ở trên ta set range MyRng, nhưng em chưa hiểu chỗ MyRng(1) có ý nghĩa gì
--
Em xin phép hỏi thêm một câu nữa
Trong đoạn code trên nếu phương thức FInd Previous thay bằng Find Next thì có ảnh hưởng gì không?
Trong PT Find, RngFound là vùng range tìm thấy, ta Set RngFound = MyRng(1) nghĩa là ta bắt đầu tìm từ ô đầu tiên của MyRng. ở đây là tìm từ A1 tìm và tìm ngựoc FInd Previous A1 -> A er, A er -1. Bạn có thể thay thành Find Next. Bạn cứ thử xem.
Xin chào các cao thủ Excel, mình có một câu hỏi muốn nhờ tất cả mọi người giúp đỡ.
mình có 2 hàng dữ liệu (hàng 2 và hàng 3). Bây giờ mình muốn gộp 2 hàng dữ liệu này thành một hàng (như hàng 6) thì mình phải làm thế nào. Mong các bạn chỉ giúp. Mình xin cảm ơn trước.
Mình có 2 hàng dữ liệu (hàng 2 và hàng 3). Bây giờ mình muốn gộp 2 hàng dữ liệu này thành một hàng (như hàng 6) thì mình phải làm thế nào. Mong các bạn chỉ giúp. Mình xin cảm ơn trước.
View attachment 34588
Xin chào các cao thủ Excel, mình có một câu hỏi muốn nhờ tất cả mọi người giúp đỡ.
mình có 2 hàng dữ liệu (hàng 2 và hàng 3). Bây giờ mình muốn gộp 2 hàng dữ liệu này thành một hàng (như hàng 6) thì mình phải làm thế nào. Mong các bạn chỉ giúp. Mình xin cảm ơn trước.
Mình có 1 bài toán về thanh toán lương cho nhân viên, có 1 ô tên là tạm ứng, người ta chỉ cho phép nhập vào ô tạm ứng khi người dùng nhập con số nhỏ hơn số lương người ấy nhận trong 1 tháng.
Vd lương 1 tháng là 1tr.Vậy nếu nhập trong ô tạm ứng là 1tr100 thì ko cho phép, 900k thì cho phép, vậy mình muốn hỏi các bạn dùng cách nào để làm đc như vậy
Nhờ mọi người viết lệnh để chạy một chương trình trên máy tính. Ví dụ tôi cần mở một file như sau:
D:\My document\yahoo.bat
Dùng lệnh gì để chạy được chương trình theo đường dẫn trên.
Thanks!
Nhờ mọi người viết lệnh để chạy một chương trình trên máy tính. Ví dụ tôi cần mở một file như sau:
D:\My document\yahoo.bat
Dùng lệnh gì để chạy được chương trình theo đường dẫn trên.
Thanks!
Shell ("D:\my document\yahoo.bat")
Không có tác dụng gì hết. File yahoo.bat chỉ là ví dụ, anh có thể thay bằng các chương trình khác để thử giúp em. Nghĩa là lệnh sẽ chạy một chương trình nào đó theo một đường dẫn có sẵn.
Nhờ mọi người viết lệnh để chạy một chương trình trên máy tính. Ví dụ tôi cần mở một file như sau:
D:\My document\yahoo.bat
Dùng lệnh gì để chạy được chương trình theo đường dẫn trên.
Thanks!
Shell ("D:\my document\yahoo.bat")
Không có tác dụng gì hết. File yahoo.bat chỉ là ví dụ, anh có thể thay bằng các chương trình khác để thử giúp em. Nghĩa là lệnh sẽ chạy một chương trình nào đó theo một đường dẫn có sẵn.
Có chạy đấy ---> Có điều file list.txt nó cứ chạy thẳng vào My Documents mà nằm, khác với phản ứng khi ta double click (điều này tôi không biết tại sao)
Muốn biết file list.txt có tồn tại hay không sau khi chạy code, bạn có thể search
Mình thấy chạy bình thường mà bạn, bạn có enable macro chưa ? và có chắc là đường dẫn đến file của bạn có đúng chưa. Báo lỗi như thế nào bạn có thể ghi hình xem thử nhé.
Có chạy đấy ---> Có điều file list.txt nó cứ chạy thẳng vào My Documents mà nằm, khác với phản ứng khi ta double click (điều này tôi không biết tại sao)
Muốn biết file list.txt có tồn tại hay không sau khi chạy code, bạn có thể search
Đúng rùi, nó cứ chạy vào trong mục my documents thảo nào không thể tìm thấy trong thư mục hiện hành. Em sẽ thử với những chương trình khác xem sao. Cám ơn anh!
Mình thấy chạy bình thường mà bạn, bạn có enable macro chưa ? và có chắc là đường dẫn đến file của bạn có đúng chưa. Báo lỗi như thế nào bạn có thể ghi hình xem thử nhé.
Là thế này nè:
- Double click vào file list.bat, nó sẽ cho ra kết quả là 1 file list.txt nằm cùng thư mục
- Vậy nếu dùng code để gọi file list.bat mà nó cho kết quả y chang như chạy bằng tay là xem như thành công (thực chất có khi không đúng)
---------------------
Đúng rùi, nó cứ chạy vào trong mục my documents thảo nào không thể tìm thấy trong thư mục hiện hành. Em sẽ thử với những chương trình khác xem sao. Cám ơn anh!
Đây chính là vấn đề tôi suy nghĩ nảy giờ... Code thì.. cả thế giới cũng chỉ xài quanh quẩn bao nhiêu đó thôi... Nhưng sao trong trường hợp file của bạn kết quả của code lại khác với kết quả chạy bằng tay nhỉ?
Khó hiểu thật
có bác nào chỉ cho mình cách thức sử dụng form trong menu toolbar với. mình thấy cai này rât hay nhưng không biết các dong lệnh để sử dụng. mong các bác giúp mình với nha
có bác nào chỉ cho mình cách thức sử dụng form trong menu toolbar với. mình thấy cai này rât hay nhưng không biết các dong lệnh để sử dụng. mong các bác giúp mình với nha
Sub Macro1()
Dim Sh As Worksheet
For Each Sh In Worksheets
Sh.Select: Range("AM1").Select
Selection.FormulaR1C1 = "=CELL(""filename"",RC)"
Next Sh
End Sub
Sub Macro1()
Dim Sh As Worksheet
For Each Sh In Worksheets
Sh.Select: Range("AM1").Select
Selection.FormulaR1C1 = "=CELL(""filename"",RC)"
Next Sh
End Sub