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

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

Thảo luận 1:

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.

Thảo luận 2:

Lúc viết code mình hay copy đọan khai biến sẵn có và cứ thế mà "phang". Còn một vấn đề nữa, có cách gì để loại bỏ bớt biến đã khai mà không sử dụng. Sợ dư thì cũng phí.
Mình có mẹo vặt sau:
*/ Vô hiệu hóa hoàn toàn các khai báo biến;
*/ Thêm từ Option Explicit vô trên macro;
*/ Thử chạy trình biên dịch để kiểm tra;
*/ Nếu biến nào bị báo thiếu khai báo thì hiệu lực nó lại

Còn muốn dùng lại biến, thì trước tiên ta dùng 'Tìm kiếm' từng biến một. Mục đích là đến chổ nào thì hết dùng nó trong đoạn mã; Đánh dấu '* [TenBien] để biết đến dòng lệnh đó là hết xài nó;
Lưu í các vòng lặp cần kết thúc một cách tường minh
Không phải là


. . . . . .
Next
Next


Mà là


. . . . .
Next GPE
Next Rng



Sau đó, cứ sau dòng lệnh được đánh dấu ta xài biến vô việc khác, nếu cùng kiểu dữ liệu
Dần dần sẽ tích lũy các mẹo này thôi.

Chúc bạn thành công.:-=

Thảo luận 3:

Application.Volatile (False)
..............khi nào thì mình thêm câu lệnh trên??
Bạn đọc hướng dẫn tại đây nhé!
http://www.giaiphapexcel.com/forum/showpost.php?p=7964&postcount=7
http://www.giaiphapexcel.com/forum/showpost.php?p=52699&postcount=12

Thảo luận 4:

cám ơn các bạn, mình chỉ muốn hiểu ý nghĩa của đoạn code thôi, còn làm gì mình ko để ý, vì đây là đoạn code trong 1 source mà mình phải tìm hiểu, mình chỉ biết nó sẽ trả về kết quả là địa chỉ của 1 ô nào đó thôi

Thảo luận 5:

Nhờ các bạn chỉ giúp cách viết câu lệnh cho một biến quét nhiều vùng ?
Ví dụ: để biến j quét trong một vùng từ cột 5 đến cột 20 ta viết J = 5 to 20
Tôi muốn cùng một biến J quét 2 vùng từ cột 5 đến cột 10 và từ cột 15 đến cột 20 thì viết như thế nào ?
Option Explicit
Sub ColorRegions()
Dim Clls As Range

For Each Clls In Range(Cells(2, 5), Cells(45, 20))
If Clls.Column < 11 Or Clls.Column > 15 Then _
Clls.Interior.ColorIndex = 37 ((Clls.Row Clls.Column) Mod 2)
Next Clls
End Sub

cách hai:

Option Explicit
Sub Color2Regions()
Dim Clls As Range

For Each Clls In Union(Range("A2:F12"), Range("H12:K15"))
Clls.Interior.ColorIndex = 39 - ((Clls.Row Clls.Column) Mod 2)
Next Clls
End Sub

Thảo luận 6:

Sub LastSelection()
Range([A3], [B65500].End(xlUp)).Select
MsgBox Cells(Selection.Rows.Count, "A").Address
End Sub

Thảo luận 7:

@ ndu: Cái này nó chọn được 2 vùng riêng biệt nhưng số cột vùng 1 luôn bằng số cột vùng 2. Cách khắc phục. Thanks!
Vùng 2 là chổ .Offset(,9) ---> Mặc định nó có số cột = số cột vùng 1 ---> Nếu anh muốn thay đổi số cột thì them Resize vào
Ví dụ: .Offset(,9).Resize(,6) ---> Sẽ chỉnh vùng 2 thành 6 cột

Thảo luận 8:

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 !

Thảo luận 9:

Anh dùng thử cái này xem:

With Range("K8:O" & [F65536].End(xlUp).Row 1)
Union(.Cells, .Offset(, 9)).Select
End With

@ ndu: Cái này nó chọn được 2 vùng riêng biệt nhưng số cột vùng 1 luôn bằng số cột vùng 2. Cách khắc phục. Thanks!

Thảo luận 10:

Bạn vào đây đọc sẽ biết cách làm.
http://www.giaiphapexcel.com/forum/showthread.php?t=2370
Thân.

Thảo luận 11:

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:



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

Thảo luận 12:

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 ý

Thảo luận 13:

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é@

Thảo luận 14:

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

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

Thảo luận 15:

Vậy thì bổ sung tinh chất lần đầu vào. Nó chỉ chuyển dữ liệu từ cột A vào cột B nếu cột B chưa có dữ liệu thôi và sẽ không chuyển nếu đã có dữ liệu rồi.

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 And Target.Offset(, 1) = "" Then
Target.Offset(, 1) = Target
End If
End Sub
Thân.

Thảo luận 16:

Bạn sửa lại :


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 SubCode 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!!!

Thảo luận 17:

Hi các huynh!

Làm sao để gõ dấu "hỏi" và dấu"nặng" trong excel macro bằng font unicode!

Xin cảm ơn.

Thảo luận 18:

Nhưng ngoài tác dụng cố định cột và dòng thì chẳng còn làm được gì nữa vì con trỏ luôn nhảy về P4
Nó cứ nhảy về P4 là đúng rồi.

Cái việc freeze pane chỉ làm 1 lần cho 1 sheet trong 1 lần mở file, thậm chí để nguyên như vậy mà xài mãi mãi đến khi chán mới thôi. Bạn lại cho nó vào sự kiện selection_change (thay đổi ô chọn)! Thử hỏi bạn làm việc gì với excel mà cả ngày không thay đổi ô chọn (selection)?

Cứ mỗi lần bạn thay đổi ô chọn, code chạy 1 lần, trong code lại có câu lệnh [P4].Select thì anh Bill biết làm gì khác hơn là chạy về P4 ngồi?

Thảo luận 19:

Hii, File của mình cũng chỉ có vậy thôi mà. Tất cả dữ liệu đều ở trong một cột, chính vì vậy mình mới muốn nó chia ra thành 4 cột. Mình gửi file đính kèm nhé!

Thảo luận 20:

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ứ?

Thảo luận 21:

Tôi chưa tìm ra cách bỏ cái [P4].Select, nhưng cũng chưa tìm ra cách thay thế để calendar không bị che khuất.
Vậy hãy dùng tạm bằng cách nới chiều cao dòng 2 hoặc dòng 3 lên cho đủ chiều cao của cái calendar

Thanks ptm0412 ! Tôi sẽ dùng tạm cách của bạn cho đến khi có một giải pháp mới. Mong rằng bạn sẽ nhanh chóng quay lại chủ đề này.

Thảo luận 22:

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.


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.

Thảo luận 23:

Các bác ơi em có đoạn code sau :

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

Thảo luận 24:

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

Thảo luận 25:

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.

Thảo luận 26:

Hông phải PoPikachu ơi, Me đại diện cho cái chỗ code đang đứng:


Chỗ code đứng chứ không phải chỗ ta đứng Pikachu ơi.

Thảo luận 27:

@ Ndu câu này bị lỗi bạn ạ. Bạn vui lòng kiểm tra lại giúp mình với.
Xin lổi... tôi chưa test trường hợp vùng dử liệu không liên tục
Vậy xin bạn cho biết vùng mà bạn muốn clear có chứa cái gì? Có thể clear hết được không?
Hoặc giã bạn gữi ví dụ lên thì càng tốt


@ Ndu mình đã gửi nguyên cả file tại bài trước
Bạn bỏ đoạn SpecialCells(2,23) thử xem
Tức chỉ còn:

[F6:F1000].Offset(, 28).Resize(, 3).ClearContentsSai hay thiếu chổ nào đó thì bạn cứ gia giãm Offset và Resize nhé
Chú ý:
Bạn viết .Resize(0,3) là sai à nha ---> bỏ luôn số 0

Thảo luận 28:

Các bác chỉ dùm em trong VB có hàm nào giống hàm date trong excel không a?

Thảo luận 29:

Xin hỏi trong cửa sổ VBA (Alt F11) có chế độ nào tự động mở không. Không hiểu sao mỗi lần mở máy (sau khi đã khóa máy) thì cửa sổ của VBA luôn luôn hiên lên mặc dù trước đó không hề mở. Có cách nào để bỏ nó đi không các bác?? (nghĩa là cửa sổ VBA không tự động mở mỗi lần mở máy nữa)

Thảo luận 30:

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ỳ:


Selection.Cells(Selection.Rows.Count,1).Select

Thảo luận 31:

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?

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ả!

Thảo luận 32:

À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:


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:


Private Sub CommandButton1_Click()
[A3].End(xlDown).Resize(, 5).Offset(1).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)

Thảo luận 33:

Ý em là sao nó không thống nhất nhỉ?
Em thường thấy là True=1; False=0 sao giờ lại =-1 vậy? Cái đó làm cho nhiều người không để ý thì sẽ dẫn đến kết quả sai ngoài ý muốn đó.
Mong mọi người chú ý khi viết code nha!
Thân.
Cái này là quy định của Micorsoft thôi... chắc chắn phải có nguyên nhân, nhưng là nguyên nhân gì thì mọi người vẫn... đang bàn...

Thảo luận 34:

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
Đưa file đó lên xem thử, quan trọng là MyRng là cột A, begin là A1

Thảo luận 35:

Chào các bác.
Nhờ các bác xem giúp (trong file đính kèm: http://www.giaiphapexcel.com/forum/images/attach/rar.gif BANGGIA boyxin.rar (http://www.giaiphapexcel.com/forum/attachment.php?attachmentid=17348&d=1225037112) )


Sau khi List 1 -> List 2, quay lại chọn lại List 1 thì báo lỗi
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 (http://www.giaiphapexcel.com/forum/showthread.php?t=15329)

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 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

Thảo luận 36:

Cái này là quy định của Micorsoft thôi... chắc chắn phải có nguyên nhân, nhưng là nguyên nhân gì thì mọi người vẫn... đang bàn...

Hằng logic False luôn có giá trị 0 ở tất cả các ngôn ngữ lập trình (chưa thấy ở đâu quy định khác). Riêng hằng True được quy định là <> 0, tuy nhiên nó mang giá trị 1 hay -1 là do tính thứ tự của các giá trị True, False khi khai báo kiểu Enum. Trong VB (và VBA), 2 giá trị này có thứ tự là (TRUE, FALSE), do đó true < false, từ đó VB quy định True có giá trị là -1. Trong Excel thì tính có thứ tự của cặp T, F không mang ý nghĩa đặc biệt, và vì Excel đã quy định thứ tự (False, True) từ trước khi có macro cho nên đến giờ nó không thể thay đổi được.


Ngoài ra, trong VBA và Excel còn có sự khác nhau quan trọng giữa hàm làm tròn ROUND.

Round trong (E) đơn thuần làm tròn đến chữ số thập phân theo nguyên tắc >=5 và <5. Nhưng trong VBA, hàm Round làm tròn theo uy ước phân bố thống kê. Chúng ta thấy rằng, từ 0 đến 10 có 11 giá trị, khi đó 5 đứng giữa của khoảng, khi làm tròn nguyên, các giá trị 1.5, 3.5, 5.5, 7.5, 9.5 sẽ được làm tròn len 2, 4, 6, 8, 10. Nhưng các giá trị 0.5, 2.5, 4.5, 6.5, 8.5 sẽ được làm tròn xuống 0, 2, 4, 6, 8 để tạo sự phân bố đều ra 2 phía của khoảng (0..10).

Từ đó, khi dùng hàm làm tròn Round trong VBA để xử lý kết quả trong (E) thì nên dùng hàm sẵn có của (E) thay cho hàm Round của VBA:

WorksheetFunction.Round(...)

Thảo luận 37:

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:

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?

Thảo luận 38:

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 ?).

Sub CopyError()
Sheets("TaoPw").Range([A2], [B65536].End(xlUp)).Copy
Sheets("DangKy").[A2].PasteSpecial Paste:=xlPasteValues
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

Xin cảm ơn !

Thảo luận 39:

Cám ơn bạn
Thực ra File mình đã gửi ở cả 2 bài trên rồi. Mình gửi lại theo link:
http://www.zshare.net/download/57457519cf24b312/ (http://www.zshare.net/download/57457519cf24b312/)

Thảo luận 40:

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.Delet e
Range("G2:G" & Er).SpecialCells(xlCellTypeBlanks).EntireRow.Delet e

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

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

Thảo luận 41:

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

Thảo luận 42:

Không được rùi. Code này là mình tự record với lệnh "text to clumn" vì vậy khi chạy code của các bác chưa được theo ý muốn.
Đoạn text của mình sẽ như sau:
02/11/2008 08:14 AM MYLIST

Sau khi chạy xong thì mỗi màu text kia sẽ phải chạy ra là một cột nghĩa là chỉ ra 4 cột thôi.
Chạy code của các bác xong thì lại ra 5 cột, cột thời gian nó bị chia ra làm hai

Các bác xem lại giúp nhé!
Bạn cứ đưa file lên đi... nói không không thế thì chẳng biết đường nào mà lần (ví dụ ở trên tôi nhìn vào cũng chẳng đoán được nó là mấy cột)

Thảo luận 43:

Mình muốn bảng tính tự động cố định cột và dòng tại P4 nên đã dùng

Private Sub worksheet_selectionchange(ByVal Target As Range)
...
[P4].Select: ActiveWindow.FreezePanes = True
...
end subNhưng ngoài tác dụng cố định cột và dòng thì chẳng còn làm được gì nữa vì con trỏ luôn nhảy về P4. Nhờ các bạn giúp mình sửa lại câu lệnh này. Thank !

Thảo luận 44:

Tôi chưa tìm ra cách bỏ cái [P4].Select, nhưng cũng chưa tìm ra cách thay thế để calendar không bị che khuất.
Vậy hãy dùng tạm bằng cách nới chiều cao dòng 2 hoặc dòng 3 lên cho đủ chiều cao của cái calendar

Thảo luận 45:

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:


Private Sub CommandButton1_Click()
[A3].End(xlDown).Resize(, 5).Select
End SubMới gọn chứ
Bác giải thích hộ em câu lệnh
[A3].End(xlDown).Resize(, 5).Select
Với

Thảo luận 46:

Chỉ đơn giản vậy thôi! Làm gì mà cao siêu chi cho mệt vậy bác.

Sub chay()
If Sheet2.[C10] = Sheet1.[C10] Then
Sheet3.[C10] = Sheet1.[C10]
Sheet3.[C20] = Sheet2.[C20] * 5
End If
End Sub
Thân.

Thảo luận 47:

Mình có đoạn code như sau:

Sub khanh()
Columns("C:C").Select
Selection.TextToColumns Destination:=Range("C1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(11, 1), Array(22, 1), Array(34, 1)), _
TrailingMinusNumbers:=True
End Sub

Code này chạy trên toàn bộ cột C. Bây giờ mình muốn sửa code để nó chỉ chạy trên vùng lựa chọn thì làm thế nào (Vùng lựa chọn chỉ nằm trong một cột), vùng lựa chọn là vùng mà mình bôi đen tren excel.

Các bác giúp với.
Tôi nghĩ có lẽ chỉ cần vầy là được:


Sub khanh()
With Selection
.TextToColumns .Cells(1, 1), 2
End With
End Sub
Bạn thử xem! Nếu có trục trặc hãy đưa file lên nhé

Thảo luận 48:

Em dùng code còn phát hiện 1 lỗi nữa. Đó là lúc AutoFilter bằng code thì có 1 trường hợp như sau:
Nếu định dạng trong Windows là "d/m/yyyy" và tất nhiên trong Excel vẫn hiểu định dạng này (tức là 31/12/2007 vẫn nằm bên phải, và hàm Month vẫn cho kết quả là 12).
Nhưng nếu ngày nhỏ hơn 12 (1,2,3,...,12) thì khi qua dòng lệnh:

Sheet2.Range("B1:M" & HC).AutoFilter Field:=2, Criteria1:=">=" & [G5], Operator:=xlAnd, Criteria2:="<=" & [I5]Với: [G5]=1/12/2007 và [I5]=10/12/2007
Thì xem lại trong Sheet2 không có dữ liệu. Mặt dù biết rằng vẫn có vùng thời gian này.
Xét đến tận cùng thì phát hiện trong Custom (AutoFilter) nó báo rằng 12/1/2007, 12/10/2007.
Vậy xin hỏi làm sao để có được 1/12/2007 và 10/12/2007.
Mọi người có thể tự làm thử. Điều này hình như là luôn đúng nữa rồi.
Thân.
Đây không phải là lỗi đâu Po_Pi ạ. Định dạng ngày tháng trong system không hề ảnh hưởng gì đến VBA. Trong VBA nếu làm việc với kiểu dữ liệu Ngày/Tháng thì nên dùng hàm Date******, còn nếu là kiểu chuỗi thì phải theo định dạng "Tháng/Ngày/Năm" hoặc "Năm/Tháng/Ngày". Tôi vẫn thích dùng theo định dạng "Năm/Tháng/Ngày" hơn.

Thảo luận 49:

Nhờ bạn viết dùm mình code để liên kết 2 file excel :
- File A có 01 form, có nút để đóng, lưu file A và mở file B.
- File B tương tự.
- Làm sao để bỏ qua mọi masgbox.
Thank.


Có phải ý bạn muốn thế này không? Xem file http://www.giaiphapexcel.com/forum/images/attach/rar.gif MyFolder.rar (http://www.giaiphapexcel.com/forum/attachment.php?attachmentid=24429&stc=1&d=1238255550) (16.1 KB)

Thảo luận 50:

Mình có đoạn code như sau:

Sub khanh()
Columns("C:C").Select
Selection.TextToColumns Destination:=Range("C1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(11, 1), Array(22, 1), Array(34, 1)), _
TrailingMinusNumbers:=True
End Sub

Code này chạy trên toàn bộ cột C. Bây giờ mình muốn sửa code để nó chỉ chạy trên vùng lựa chọn thì làm thế nào (Vùng lựa chọn chỉ nằm trong một cột), vùng lựa chọn là vùng mà mình bôi đen tren excel.

Các bác giúp với.

Thảo luận 51:

Bác không để ý chứ 1 chức năng có thể quét các vấn đề này là Debug -> Debug cho phép quét xem code có đúng hay không thôi. Bác có thể thấy nó kế lệnh Run trên menu VBA đó -> Click vào và chọn Compile VBAProject. Và nếu có dư hoặc thiếu thì nó sẽ báo ngay.
Còn việc dùng như thế nào thì còn tùy thuộc vào tình huống nữa bác ơi, nói khơi khơi thì không thể hiểu được đâu.
Đành phải chờ dịp khác vậy!
Thân.

Chỉ thiếu nó mới báo (Khi có Option Explicit) chứ dư thì nó đâu có báo đâu.

Thân!

Thảo luận 52:

HI các huynh!

Mong các huynh chỉ giáo dùm: Trong Cell A1 nhập AaaaaaaaaR (trong đó R format superscript), khi copy paste trực tiếp thì R vẫn bảo toàn ở trạng thái là superscript; Còn khi tiểu đệ qua cell khác gõ: =A1 thì chữ R không còn ở trạng thái superscript nữa.
Mong các huynh cho giải pháp để Tđ giải quyết vđ của mình, chân thành cảm ơn!
Điều đó đương nhiên, vì công thức chỉ làm nhiệm vụ lấy kết quả, không can thiệp các vấn đề khác như Format ---> Muốn được việc bạn phải dùng cách khác (copy chẳng hạn)... Muốn tự động hơn cho công việc thì dùng macro vậy!

Thảo luận 53:

Doạn mã trên được sửa lại như sau:

Mình đã kết nối thành công và có thể đưa bất cứ điều kiện nào vào để lấy ra dữ liệu theo ý muốn.
Nếu có thể bạn cho 1 ví dụ. Rất cám ơn! Mấy cái này mình rất muốn nghiên cứu mà khó hiểu quá.

Thảo luận 54:

Private Sub Cmd_Loc_Click()
On Error GoTo ErrorHandling
Dim ConnStr As String, conn As Object
Dim strSQL As String
Dim rs
ConnStr = "driver={Microsoft ODBC for Oracle}; server=QLT; uid=qlt_read; pwd=qlt_read"
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = ConnStr
conn.Open
strSQL = "SELECT QLT_CTU_HDR.TIN, QLT_CTU_HDR.TEN_DTNT, QLT_CTU_DTL.CCG_MA_CAP, QLT_CTU_DTL.CCG_MA_CHUONG, QLT_CTU_DTL.TMT_MA_MUC, QLT_CTU_DTL.TMT_MA_TMUC, QLT_CTU_HDR.SO_CTU, QLT_CTU_DTL.SO_TIEN, QLT_CTU_HDR.NGAY_NOP_KB, QLT_CTU_HDR.DCT_LOAI FROM QLT_OWNER.QLT_CTU_DTL QLT_CTU_DTL, QLT_OWNER.QLT_CTU_HDR QLT_CTU_HDR WHERE QLT_CTU_HDR.ID = QLT_CTU_DTL.CTH_ID AND ((QLT_CTU_HDR.NGAY_NOP_KB Between {ts '2008-11-01 00:00:00'} And {ts '2008-11-30 00:00:00'}) AND (QLT_CTU_HDR.DCT_LOAI='05'))"
Set rs = CreateObject("ADODB.Recordsets")
rs.Open strSQL
If rs Is Nothing Then
MsgBox "Kh«ng cã b¶n ghi nµo tho¶ m·n!", vbExclamation, ThisWorkbook.Name
Else
'Worksheets.Select
Cells(1, 1).Select
n = 0
Do Until n = rs.Fields.Count
Cells(1, n 1) = rs.Fields.Item(n).Name
n = n 1
Loop
Cells(2, 1).CopyFromRecordset rs
End If
rs.Close
conn.Close
Exit Sub
ErrorHandling:
MsgBox Err.Description
End Sub
Đoạn code trên bị lỗi khi mở recordset, Ai làm vấn đề này rồi giúp mình với!

Thảo luận 55:

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?

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.

Thảo luận 56:

Sub xoa()
For i = [H65000].End(xlUp).Row To 2 Step -1
If Cells(i, 8) = "Delete" Then
Rows(i).EntireRow.Delete
End If
Next
End Sub
Macro này còn có thể tăng tốc bằng các cách sau:
* Không cho lay động màn hình; (Phụ :-=)
* Dùng phương thức tìm kiếm, dấu hiệu tìm là từ 'Delete' nêu trên, phạm vi tìm là cột 'H'
Tìm thấy thì gôm vô biến đã khai báo, sau giai đoạn tìm chỉ xóa 1 lần. Riêng chuyện gôm vô rồi xóa 1 lần cũng nhanh hơn là xóa từng hàng như macro trên. (--=0 Chính)

Thảo luận 57:

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?
Thay chử Select thành Row ---> Sẽ ra được chỉ số dòng

Thảo luận 58:

Tôi xem bài này http://www.giaiphapexcel.com/forum/showthread.php?t=13005
thấy có nhiều câu từ rất lạ (không thấy trong Macro bao giờ) Tôi muốn nhờ các bạn dịch nôm theo từng dòng xen kẽ (nôm na dòng code đó nói gì). Đặc biệt những từ tôi không hiểu là những từ được tô đậm, màu đỏ. Thanks !


Option Explicit
Sub SelectExpandSelectionToLastUsedRow()
Dim lRow As Long, Rng As Range
If WorksheetFunction.CountA(Cells) > 0 Then
Set Rng = Selection
lRow = Cells.Find(What:="*", After:=Cells(1, 1), SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
Set Rng = Rng.Resize(lRow, Rng.Columns.Count)
lRow = Rng.Find(What:="*", After:=Rng.Cells(1, 1), SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
Rng.Resize(lRow - Rng.Cells(1, 1).Row 1, Rng.Columns.Count).Select
End If
End Sub

Thảo luận 59:

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

Thảo luận 60:

Hic, quên mất là file của mình lại không phải là cột A và cột B.
Bạn sửa lại giúp mình để chạy với cột D va cột F, nghĩa là cột F lấy giá trị từ cột D.
Thanks!

Thảo luận 61:

Trong lệnh Call , Nếu vì 1 lý do nào đó Sub đó bị Delete đi, khi đó sẽ báo lỗi như sau:

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 nhưng vẫn không có bẫy được lỗi này.
Mong các bạn chỉ giáo cho? Thanks

Thảo luận 62:

Vậy thực ra bác muốn như thế nào chứ? Bác toàn viết hiện trạng ra không thì làm sao giải quyết được?
Và yêu cầu cuối là nên đưa file đó lên đi?
Việc xóa dòng đâu nhất thiết phải gõ Delete như vậy? Vì dùng chuột chọn 1 dòng rồi nhấn Delete chẳng phải nhanh hơn không?
Thân.

Thảo luận 63:

Chào anh, chị
Khi mình thực hiện phép nhân (*) trong VBA. Thì VBA tự đọng làm tròn số đàng sau số thập phân
VD: Giá trị trên sheets.cells(1,1)=0.23
thực hiện trong code:
sheets.cells(1,1) * 1000= 0 ??
Dù format hoặc chuyển dịnh dạng nhưng kết quả vẫn =0
Mong anh chị chỉ dùm lỗi ở đâu?

Chân thành cám ơn

Thảo luận 64:

Đâ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ó

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?

iRow = Data.Rows.Count
iRow = UBound(Data.Value, 1)
Sự khác biệt của 2 lệnh trên là gi?

Thảo luận 65:

Phải chăng Offset(, ,.).Resize(, ,.) chỉ áp dụng được cho từng dòng và phải dùng vòng lặp để quét?
Tức là mỗi 1 câu lệnh có những quy luật riêng của nó...
Như bạn thấy, Resize chỉ chấp nhận 1 vùng liên tục ---> Với 1 vùng dử liệu nằm cách biệt nhau thì nó không làm việc được ---> Thế thôi (Offset thì OK)

Thảo luận 66:

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!!!!

Bạn xen thử file đính kèm xem sao!

Thảo luận 67:

Đoạn code này:


Private Sub CommandButton1_Click()
[A3].End(xlDown).Resize(, 5).Select
End Sublà 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:


Private Sub CommandButton1_Click()
[A3].End(xlDown).Resize(, 5).Offset(1).Select
End SubCú 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?

Thảo luận 68:

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

Thảo luận 69:

------> 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.




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.Delet e

' 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

Thảo luận 70:

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


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à


rc= rc-1


Các anh chỉ giáo

ST

Thảo luận 71:

Hi các huynh!

Tôi có 3 sheet (sheet 1, 2,3). Làm sao để thể hiện:

If sheet2.cells(10,3)=1 then
sheet3.cells(10,3)=1 & sheet3.cells(20,3)=sheet2.cells(20,3)*5
end if

P/S: 1 là lấy dữ liệu từ sheet1

Xin chân thành cảm ơn quý AE giúp dùm! Mong reply

Thảo luận 72:

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é

Thảo luận 73:

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

Thảo luận 74:

Em mới bắt đầu tìm hiểu về VBA, em có đoạn code này không biết nó sử dụng làm gì, các đại ca chỉ dùm em với.
Sub Macro1()
'
' Macro1 Macro
' Hoc Macro
'
' Keyboard Shortcut: Ctrl y
'
Application.Run "PERSONAL.XLS!Macro1"
Application.Run "PERSONAL.XLS!Macro1"
Range("J10").Select
Application.Run "PERSONAL.XLS!Macro1"
Range("K7").Select
Application.WindowState = xlMinimized
Range("F6:M12").Select
ActiveCell.FormulaR1C1 = "gfg"
Range("F6:M12").Select
Range("F7").Activate
ActiveCell.FormulaR1C1 = "hg"
Range("F6:M12").Select
Range("F8").Activate
ActiveCell.FormulaR1C1 = "hg"
Range("F6:M12").Select
Range("F9").Activate
ActiveCell.FormulaR1C1 = "hg"
Range("F6:M12").Select
Range("F10").Activate
ActiveCell.FormulaR1C1 = "jh"
Range("F6:M12").Select
Range("F11").Activate
ActiveCell.FormulaR1C1 = "k"
Range("F6:M12").Select
Range("F12").Activate
ActiveCell.FormulaR1C1 = "jk"
Range("F6:M12").Select
Range("G6").Activate
ActiveCell.FormulaR1C1 = "j"
Range("F6:M12").Select
Range("G7").Activate
ActiveCell.FormulaR1C1 = "jk"
Range("F6:M12").Select
Range("G8").Activate
ActiveCell.FormulaR1C1 = "jk"
Range("F6:M12").Select
Range("G9").Activate
ActiveCell.FormulaR1C1 = "jk"
Range("F6:M12").Select
Range("G10").Activate
ActiveCell.FormulaR1C1 = "j"
Range("F6:M12").Select
Range("G11").Activate
ActiveCell.FormulaR1C1 = "kj"
Range("F6:M12").Select
Range("G12").Activate
ActiveCell.FormulaR1C1 = "kj"
Range("H6").Select
ActiveCell.FormulaR1C1 = "kj"
Range("H7").Select
ActiveCell.FormulaR1C1 = "kj"
Range("H8").Select
ActiveCell.FormulaR1C1 = "jk"
Range("H9").Select
ActiveCell.FormulaR1C1 = "jk"
Range("H10").Select
ActiveCell.FormulaR1C1 = "jk"
Range("H11").Select
ActiveCell.FormulaR1C1 = "kj"
Range("H12").Select
ActiveCell.FormulaR1C1 = "kj"
Range("H13").Select
ActiveCell.FormulaR1C1 = "jk"
Range("H14").Select
ActiveCell.FormulaR1C1 = "jk"
Range("H13").Select
Selection.ClearContents
Range("H14").Select
Selection.ClearContents
Range("H7").Select
End Sub

Thảo luận 75:

cho em đựoc hỏi --> em có thể viết thành


Cám ơn các anh

Đượ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)

Chúc vui

Thảo luận 76:

Mình đang muốn giải thích 2 câu này mà
[F6:F1000].SpecialCells(2, 23).Offset(0, 28).ClearContents
[F6:F1000].SpecialCells(2, 23).Offset(0, 29).ClearContents
tức là 2 cột cột AH và AI

Thảo luận 77:

Em dùng code còn phát hiện 1 lỗi nữa. Đó là lúc AutoFilter bằng code thì có 1 trường hợp như sau:
Nếu định dạng trong Windows là "d/m/yyyy" và tất nhiên trong Excel vẫn hiểu định dạng này (tức là 31/12/2007 vẫn nằm bên phải, và hàm Month vẫn cho kết quả là 12).
Nhưng nếu ngày nhỏ hơn 12 (1,2,3,...,12) thì khi qua dòng lệnh:

Sheet2.Range("B1:M" & HC).AutoFilter Field:=2, Criteria1:=">=" & [G5], Operator:=xlAnd, Criteria2:="<=" & [I5]Với: [G5]=1/12/2007 và [I5]=10/12/2007
Thì xem lại trong Sheet2 không có dữ liệu. Mặt dù biết rằng vẫn có vùng thời gian này.
Xét đến tận cùng thì phát hiện trong Custom (AutoFilter) nó báo rằng 12/1/2007, 12/10/2007.
Vậy xin hỏi làm sao để có được 1/12/2007 và 10/12/2007.
Mọi người có thể tự làm thử. Điều này hình như là luôn đúng nữa rồi.
Thân.
Thử sửa lại điều kiện thành:
Criteria1:=">=" & Format([G5], "#")

Criteria2:="<=" & Format([I5], "#")
xem thế nào!
Hoặc:
Criteria1:=">=" & CDbl([G5])
và:
Criteria2:="<=" & CDbl([I5])

Thảo luận 78:

em muốn tính ngày cuối cùng của tháng là ngày nào, trong excel thì em làm được như sau: day(date(year(x),month(x) 1,0)
nhưng em không biết làm thế nào trong VB, vì không có hàm date.
Em thử hàm now của bác nhưng chưa được, nhờ bác chỉ chi tiết với a!
Ah... xin lổi... đọc nhoáng qua, cứ tưởng là TODAY()... Vậy thì dùng DATESERIAL như Rollover79 vừa nói

Thảo luận 79:

Hii, File của mình cũng chỉ có vậy thôi mà. Tất cả dữ liệu đều ở trong một cột, chính vì vậy mình mới muốn nó chia ra thành 4 cột. Mình gửi file đính kèm nhé!
Chắc là vầy:


Sub Tach()
With Selection
If .Columns.Count = 1 Then .TextToColumns .Cells(1, 1), xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(10, 1), Array(21, 1), Array(33, 1))
End With
End Sub
Bạn thử lại xem

Thảo luận 80:

Cảm ơn ndu sáng nay mất điện bây giờ mới xem được bài, Tôi đã test thử cách của bạn kết quả OK.

Trước khi bạn giúp tôi phải dùng hạ sách là cho vùng chọn xuống dưới đường vạch của Freeze Panes
(đổi L2:AU2 -> L4:AU4)sau đó selection.offset(-2,0).Value = Calendar1 kết quả cũng được nhưng người khác thì làm sao biết mà dùng.

Tôi cũng đã xem qua các bài theo đường link của bạn, thì ra vấn đề Freeze Panes không đơn giản chút nào.

Thảo luận 81:

Lần này thì đúng rồi, thanks bạn!

Thảo luận 82:

Chưa đúng rồi, cột D và cột F mà bạn ơi.
Marco của bạn là cho cột D và cột E mà. Bạn sửa lại là cho cột D và cột F nhé!

Thảo luận 83:

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

Thảo luận 84:

Hii, mình cũng không rõ là cột đó là công thức hay gì nữa vì cột đó là do một chương trình tự tạo ra.
Nhưng mình thử với công thức của Po_Pikachu rôi, vẫn chạy được.
Cám ơn bạn đã quan tâm

Thảo luận 85:

@ Ndu: nếu bỏ SpecialCells(2,23) thì nó sẽ xóa cả cột đích trong khi đó Tôi chỉ muốn xóa những dòng mà cột điều kiện (F, G) có dữ liệu như kết quả bài đầu tôi gửi.

Thảo luận 86:

Tôi thường hay phải khai rất nhiều biến, ví dụ iMa01 as long, iMa02 as long,...,iMa99 as long.
Vậy có thể rút gọn khai biến = for i = 1 to 99 được không?
Xin cám ơn!
Câu hỏi rất hay nhưng cũng.. hơi.. buồn cười...
Tôi thì làm khác: Cố gắng hạn chế càng ít biến càng tốt (trong 1 vài trường hợp With.. End With có thể làm tốt việc này)

Thảo luận 87:

Đơ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
À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?

Thảo luận 88:

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

Thảo luận 89:

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 là

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

Thảo luận 90:

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!

Thảo luận 91:

HI các huynh,
Làm ơn giúp cái hàm macro xử lý cái phần superscript với vì viết code copy paste thì phần superscript nó nhảy xuống luôn huhuhuh!
Xin cảm ơn!
Vậy kết luận cuối cùng là bạn muốn sao? Muốn giử nguyên Format của cell gốc hay bỏ Format
- Muốn giử nguyên thì copyPaste bình thường
- Muốn bỏ Format, chỉ lấy value thì copypaste specialvalue
Cuối cùng: đưa file lên cho nhanh gọn

Thảo luận 92:

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.

Thảo luận 93:

Vầy thì chỉnh lại như vầy ha!

Sub xoa()
For i = [H65000].End(xlUp).Row To 2 Step -1
If Cells(i, 8) = "Delete" Then
Rows(i).EntireRow.Delete
End If
Next
End Sub
Thân.

Thảo luận 94:

Tôi thường hay phải khai rất nhiều biến, ví dụ iMa01 as long, iMa02 as long,...,iMa99 as long.
Vậy có thể rút gọn khai biến = for i = 1 to 99 được không?
Xin cám ơn!
Sao Thu Nghi không khai báo biến mảng?

Dim Ma As Variant
For i = 1 to 99
Ma(i) = ...
Next

Nếu lấy giá trị trên sheet còn khoẻ nữa:


Dim Ma As Variant
Ma=Range("A1:A100").Value

Thảo luận 95:

Tmp = Trim(Cells(i, 1))
Cells(i, 1) = Tmp


cho em đựoc hỏi --> em có thể viết thành


Cells(i,1) = Trim(cells(i,1))


Cám ơn các anh

Thảo luận 96:

Hi, không phải là xóa dữ liệu mà là xóa cả dòng đó đi luôn. Nhưng bác nhớ để lại dòng đầu tiên lại nhé!

Thảo luận 97:

Khi làm việc trên sheet hiện hành thì câu lệnh như sau:

Sub Macro1()
Range("F3:F26").Select
Selection = "=SUM(RC[-3]:RC[-1])"
Selection.Value = Selection.Value
End SubNếu muốn làm tương tự cho một sheet khác (không phải sheet hiện hành hoặc có thể là sheet ẩn) thì viết như thế nào ? Mục đích dùng Selection là để xoá công thức

Thanks!

Thảo luận 98:

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.

Thảo luận 99:

đây cũng là đoạn code tạo shortcut nhưng em khong biet thực hiện như thế nào cho đúng nhờ các bác giải hộ.
Bạn sưu tầm code ở đâu mà sai từa lưa vậy!
Sửa tạm code số 2 nhé:

Sub MakeShortcut2()
Dim WSH As Object
Dim WSHShortcut As Object
Dim strPath As String
Set WSH = CreateObject("WScript.Shell")

strPath = WSH.SpecialFolders("Desktop") & "" & "notepad.lnk"
Set WSHShortcut = WSH.CreateShortcut(strPath)
With WSHShortcut
.TargetPath = Environ("WINDIR") & "" & "notepad.exe"
.Description = "make shortcut to notepad"
.IconLocation = "c:windows otepad.exe"
.RelativePath = "c:temp"
.WorkingDirectory = "c:"
.Hotkey = "Ctrl Alt Q"
.Save
End With
End Sub
Còn code số 1, bạn cứ theo thông báo mà tìm
Ví dụ: Nó thông báo rằng:

You Must Choose a Station Name from the Drop Down BoxMở code ra xem, thì ra nguyên nhân là do:

If strStationName = "" Then...Vậy bạn phải xem strStationName nó là cái giống gì
???
Trong code, nó chính là Sheet1.Range("B25").Value
Vậy Cell B25 của bạn phải gõ vào tên file nào đó mà bạn muốn tạo shortcut
vân vân... và.. vân vân... Còn nhiều cái phải sửa lắm, chẳng hạn như ĐƯỜNG DẨN CHỨA FILE
Theo ý kiến riêng của tôi: Dùng 1 code nào đó vượt quá xa tầm hiểu biết thì tốt nhất đừng xài ---> Học lại từ CƠ BẢN sẽ tốt cho bạn hơn!

Thảo luận 100:

Chào ThuNghi!
Mình cũng mới code VBA, ngày trước mình chẳng bao giờ động đến cả, do nhu cầu công việc nên đành phải làm thôi, nếu bạn quan tâm tới các ví dụ kết nối Oracle thì có thể xem một vài ví dụ của mình, bao gồm:
- Tác nghiệp với dữ liệu oracle
- an toàn dữ liệu, quyền truy cập, cho phép hay không cho phép mang dữ liệu ra ngoài hệ thống,....!
- Vì Việt Nam mình đa số được FPT cung cấp Oracle nên phát triển theo hướng đó là có lợi, SAP thì còn lâu lâu vì họ không thèm quan tâm ở VN mặc dù SAP đẳng cấp hơn Oracle 2 bậc.
Vì ở đây mình không có quyền post with attachment file, nên bạn vào www.gocrieng.com/quangle (http://www.gocrỉeng.com/quangle) để xem nhé!
Thực ra ở đây toàn các anh chị cao thủ VBA cả, mình mới tập thôi! :d

Thảo luận 101:

chân thàh cám ơn

Rất biết ơn bạn, nếu bạn đưa thêm file lên; Còn như thế này thì chỉ mò & mò mà thôi. . .

Xin chờ tin bạn!

Thảo luận 102:

Mình có đoạn code tự record như sau. Bình thường vẫn chạy tốt nhưng không hiểu sao được một vài hôm thì lại bị hỏng. Nguyên nhân có lẽ là do đoạn code màu đỏ đã không được thực hiện. Các bác xem hộ tại sao nhé

Sub Mergging1()
'
' Mergging Macro
' Macro recorded 2/5/2009 by thuy.dinh
'
' Keyboard Shortcut: Ctrl Shift K
'
.....
Columns("B:B").Select
Selection.Replace What:=",", Replacement:=" ", _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:= _
False, ReplaceFormat:=False
......
End Sub

Đoạn code màu đỏ dùng để thay thế ký tự "," bằng ký tự " " có trong tất cả các chuỗi trong vùng B:B. Lỗi có thể do nhiều nguyên nhân.

Để có thể biết chính xác nguyên nhân thì bạn vui lòng đính kèm file theo nha. Có file mới biết đước là Bạn muốn làm gì, trong vùng B:B có dữ liệu gì và báo lỗi như thế nào. Nhiều khi nhìn code cũng chưa thật sự hiểu đúng nguyên nhân của vấn đề.

Thảo luận 103:

Các bác chỉ dùm em trong VB có hàm nào giống hàm date trong excel không a?
Có đấy... là hàm NOW

Thảo luận 104:

Bạn vào VBA nhấn Ctrl G rồi gõ thử đoạn sau:

?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.

Thảo luận 105:

Từ câu lệnh chọn 2 vùng không liên tục: Range("K8:O28,T8:Y28").Select
Tôi muốn thay số dòng cuối 28 trong câu lệnh này thành & [F65536].End(xlUp).Row 1 thì phải viết như thế nào ?

Nếu viết là Range("K8:O" & [F65536].End(xlUp).Row 1, "T8:Y" & [F65536].End(xlUp).Row 1).Select thì máy chấp nhận nhưng nó chọn luôn 2 vùng thành 1. Nhờ các bạn chỉ giúp chỗ sai trong câu lệnh hoặc viết lại giúp câu lệnh, Thanks!
Anh dùng thử cái này xem:

Union(Range("K8:O" & [F65536].End(xlUp).Row 1), Range("T8:Y" & [F65536].End(xlUp).Row 1)).Select
Hoặc


With Range("K8:O" & [F65536].End(xlUp).Row 1)
Union(.Cells, .Offset(, 9)).Select
End With

Thảo luận 106:

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.

Thảo luận 107:

HI các huynh!

Mong các huynh chỉ giáo dùm: Trong Cell A1 nhập AaaaaaaaaR (trong đó R format superscript), khi copy paste trực tiếp thì R vẫn bảo toàn ở trạng thái là superscript; Còn khi tiểu đệ qua cell khác gõ: =A1 thì chữ R không còn ở trạng thái superscript nữa.
Mong các huynh cho giải pháp để Tđ giải quyết vđ của mình, chân thành cảm ơn!

Thảo luận 108:

Mình gửi file đính kèm nhé! Mình muốn xóa bỏ tất cả những dòng bôi hồng đi và sẽ căn cứ theo cột H để xóa (gần như là xóa tiêu đề của mỗi bảng đi vậy). Mình dùng phần mềm để trộn rất nhiều file vào một file vì vậy sẽ có Form rất giống nhau. Nếu mình phải tìm từng dòng một để xóa thì lâu nắm. Bác giữ lại dòng đầu nhé!

Thanks!

Thảo luận 109:

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
Sheets("DangKy").[A2].PasteSpecial Paste:=xlPasteValues
MsgBox "Copy thanh cong"
End Sub

Thảo luận 110:

Mình có đoạn code như sau:

Sub khanh()
Columns("C:C").Select
Selection.TextToColumns Destination:=Range("C1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(11, 1), Array(22, 1), Array(34, 1)), _
TrailingMinusNumbers:=True
End Sub

Code này chạy trên toàn bộ cột C. Bây giờ mình muốn sửa code để nó chỉ chạy trên vùng lựa chọn thì làm thế nào (Vùng lựa chọn chỉ nằm trong một cột), vùng lựa chọn là vùng mà mình bôi đen tren excel.

Các bác giúp với.
Theo em thì có thể viết như vầy.

Sub thu()
Application.InputBox("Quet chon vung", Type:=8).Columns(1).TextToColumns Cells(1, 1), 2
End Sub
Thân.

Thảo luận 111:

Tôi thường hay phải khai rất nhiều biến, ví dụ iMa01 as long, iMa02 as long,...,iMa99 as long.
Vậy có thể rút gọn khai biến = for i = 1 to 99 được không?
Xin cám ơn!

Thảo luận 112:

Vì một lý do là ngay trên đường freezepanes tôi dùng Calendar1 để nhập ngày tháng và dưới đường này có một dòng ẩn vì vậy Calendar1 bị co lại không sử dụng được nếu bỏ freezepanes thì OK.
Vì vậy tôi định dùng giải pháp khi Calendar1 được gọi ra thì cũng đồng thời freezepanes = false và sau khi Click Calendar1 thì freezepanes = True và sau đó di chuyển con trỏ đến ô khác thì freezepanes vẫn luôn = True

Private Sub worksheet_selectionchange(ByVal Target As Range)
With Target
Calendar1.Visible = (Not Intersect([L2:AU2], Target) Is Nothing)
Calendar1.Top = .Top: Calendar1.Left = .Offset(5, 1).Left
Calendar1.Width = 130
Calendar1.Height = 110
ActiveWindow.FreezePanes = False
End With
End sub
Private Sub Calendar1_Click()
Selection.Value = Calendar1
Calendar1.Visible = False
[P4].Select: ActiveWindow.FreezePanes = True
End With
End SubTôi nghĩ nó luôn nhảy về P4 bởi tại P4.Select tôi đã thử bỏ .Select nhưng không bỏ được. Vì vậy tôi muốn hỏi:

1- Có câu lệnh nào khác [P4].Select: ActiveWindow.FreezePanes = True
(với ý tưởng con trỏ không nhảy về P4 nhưng vẫn thực hiện được freezepanes tại P4)

2- Có cách nào để Calendar1 xuất hiện cách [L2:AU2] khoảng 2 dòng (để nó nằm dưới đường FreezePanes).
Thank !

Thảo luận 113:

Nhưng nếu bạn dùng SpecialCells(2,23) thì bạn lại không Resize được
Vậy chỉ còn mỗi cách chia ra từng phần mà làm
Cột F và G nhập chung thành 1

[F6:G1000].SpecialCells(2,23).Offset(, Bao nhiêu đó).ClearContents


[I6:I1000].SpecialCells(2,23).Offset(, Bao nhiêu đó).ClearContents
Bỏ luôn Resize

Phải chăng Offset(, ,.).Resize(, ,.) chỉ áp dụng được cho từng dòng và phải dùng vòng lặp để quét?

Thảo luận 114:

Cám ơn sự nhiệt tình của các bác.
Thực sự là do up trực tiếp lên không được, nhờ các anh chi trên diễn đàn mình đã Upload được File

Thảo luận 115:

Sub MakeShortcut2()
Dim WSH As Object
Dim WSHShortcut As Object
Dim strPath As String
Set WSH = CreateObject("WScript.Shell")

strPath = WSH.SpecialFolders("Desktop") & "" & "notepad.lnk"
Set WSHShortcut = WSH.CreateShortcut(strPath)
With WSHShortcut
.TargetPath = Environ("WINDIR") & "" & "notepad.exe"
.Description = "make shortcut to notepad"
.IconLocation = "c:windowssystemshell32.dll,5"
.RelativePath = "c: emp"
.WorkingDirectory = "c:"
.Hotkey = "Ctrl Alt Q"
.Save
End With
End Sub

đây cũng là đoạn code tạo shortcut nhưng em khong biet thực hiện như thế nào cho đúng nhờ các bác giải hộ.

Thảo luận 116:

Xin hỏi 1 vấn đề hơi đơn giản nhưng không biết là do code sai hay là em hiểu sai về code.
Trường hợp cụ thế như vầy:
Nếu bạn lấy True - False trong công thức (=True-False) thì kết quả là 1.
Nhưng trong VBA, cũng True - False ([biểu thức A=True]-[biểu thức B=False]) thì kết quả lại là -1.
Vậy xin hỏi vấn đề này giải thích ra sao vậy?
Xin chân thành cảm ơn.
(Em biết nó vẫn luôn ra như vậy, nhưng chỉ hỏi là tại sao lại có chuyện lạ kỳ như vậy? Đây có phải là lỗi của Microsoft không hay có điều gì khác ạ!)

Thảo luận 117:

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.


Sub Test()
a = Cells(Cells.Rows.Count, 1).End(xlUp).Row
b = [A65000].End(xlUp).Row
MsgBox a
MsgBox b
End Sub

Thảo luận 118:

xin hỏi cách tạo code để chống move va copy làm như thế nào, xin hướng dẫn cụ thể vì tôi mới vào nghề excel. thanks...

Thảo luận 119:

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ộ.

Thảo luận 120:

Nếu chọn đúng ô có chữ "Delete" thì nó sẽ xóa luôn ô đó và không có gì thay đổi. Nhưng khi Ctrl Z lại lệnh vừa rồi thì nó lại xóa cả dòng luôn. Còn nếu chọn ô nào khác thì không có gì thay đổi cả.

Thảo luận 121:

Có đấy... là hàm NOW
em muốn tính ngày cuối cùng của tháng là ngày nào, trong excel thì em làm được như sau: day(date(year(x),month(x) 1,0)
nhưng em không biết làm thế nào trong VB, vì không có hàm date.
Em thử hàm now của bác nhưng chưa được, nhờ bác chỉ chi tiết với a!

Thảo luận 122:

Tinhnop1()
Dim i As Long, Ma1 As Long, Ma2 As Long
Dim rng As Range
Dim HSL As Double, TL As Double
With Sheets(1)
HSL = .Cells(1, 10) '
TL = .Cells(1, 11)
Set rng = .Range("A1:A" & [A65000].End(xlUp).Row) ' Vung luong toi thieu
rng.Offset(, 2).ClearContents
Ma1 = WorksheetFunction.Match(.Cells(1, 8), rng, 1) ' s.cells(1,8) cua Tu thang
Ma2 = WorksheetFunction.Match(.Cells(1, 9), rng, 1) ' S.cells(1,8) den thang
If Ma1 = Ma2 Then
.Cells(Ma1, 3) = DateDiff("m", .Cells(1, 8), .Cells(1, 9))
.Cells(Ma1, 4) = .Cells(Ma1, 3) * HSL * TL * .Cells(Ma1, 2)
Else
'Sua Dk dau de cho dung voi thoi gian Tuthang
.Cells(Ma1, 3) = DateDiff("m", .Cells(1, 8), .Cells(Ma1 1, 1))
.Cells(Ma1, 4) = .Cells(Ma1, 3) * HSL * TL * .Cells(Ma1, 2)

For i = Ma1 1 To Ma2
'Chay vong lap tinh thang cua cac moc trong khoang ma1 - ma2
.Cells(i, 3) = DateDiff("m", .Cells(i, 1), .Cells(i 1, 1))
.Cells(i, 4) = .Cells(i, 3) * HSL * TL * .Cells(i, 2)
Next
'Sua Dk cuoi de cho dung voi thoi gian Denthang
.Cells(Ma2, 3) = DateDiff("m", .Cells(Ma2, 1), .Cells(1, 9))
.Cells(Ma2, 4) = .Cells(Ma2, 3) * HSL * TL * .Cells(Ma2, 2)
End If
End With
End Sub

Thảo luận 123:

Bạn sửa lại thành:

[F6:F1000].SpecialCells(2, 23).Offset(0, 28).Resize(, 3).ClearContents
Đại khái là vậy
Bạn để ý sẽ thấy hàm Offset Resize trong VBA sẽ tương đương với 1 hàm OFFSET trong công thức Excel

@ Ndu câu này bị lỗi bạn ạ. Bạn vui lòng kiểm tra lại giúp mình với.

Thảo luận 124:

Từ một cột có dữ liệu (cột làm điều kiện) tôi muốn dịch sang một số cột để xóa dữ liệu Tôi viết [F6:F1000].SpecialCells(2, 23).Offset(0, 28 , 0 , 3).ClearContents nhưng không được nên phải viết như sau:


[F6:F1000].SpecialCells(2, 23).Offset(0, 28).ClearContents
[F6:F1000].SpecialCells(2, 23).Offset(0, 29).ClearContents
[G6:G1000].SpecialCells(2, 23).Offset(0, 28).ClearContents
[G6:G1000].SpecialCells(2, 23).Offset(0, 26).ClearContents
[I6:I1000].SpecialCells(2, 23).Offset(0, 25).ClearContents
[I6:I1000].SpecialCells(2, 23).Offset(0, 24).ClearContents
Nhờ các bạn sửa giúp đoạn code này. Xin cảm ơn !
Bạn sửa lại thành:

[F6:F1000].SpecialCells(2, 23).Offset(0, 28).Resize(, 3).ClearContents
Đại khái là vậy
Bạn để ý sẽ thấy hàm Offset Resize trong VBA sẽ tương đương với 1 hàm OFFSET trong công thức Excel

Thảo luận 125:

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

application.cutcopymode=false

là ỌK!!!


Thì dòng lệnh
Application.Cutcopymode=False để giải phóng bộ nhớ đó thôi! !!:-=
Đây chính là cách hủy giá trị đang có trong bộ nhớ.
Chúc vui

Thảo luận 126:

Tôi nghĩ có lẽ chỉ cần vầy là được:


Sub khanh()
With Selection
.TextToColumns .Cells(1, 1), 2
End With
End SubBạn thử xem! Nếu có trục trặc hãy đưa file lên nhé

Ta phải khẳng định với nhau, rằng vùng đã chọn chỉ là 1 cột.

If Selection.Columns.Count=1 then .TextToColumns .Cells(1, 1), 2:-=

Thảo luận 127:

Xin các bạn chỉ dùm tôi cách tạo phím tắt bằng một đoạn code
vd: Ctrl Shift M là "Merge and center"
Ctrl Alt F là "Fill color"
Cám ơn nhiều nhé

Thảo luận 128:

Bạn cho hỏi:
- Cột D của bạn là dử liệu nhập hay công thức ---> Nếu là công thức thì không dể ăn đâu nha
Cách hay nhất là bạn nên đưa file lên... đở mất công mọi người đoán sai

Thảo luận 129:

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

Thảo luận 130:

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

Thảo luận 131:

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...

Thảo luận 132:

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.

Thảo luận 133:

Em dùng code còn phát hiện 1 lỗi nữa. Đó là lúc AutoFilter bằng code thì có 1 trường hợp như sau:
Nếu định dạng trong Windows là "d/m/yyyy" và tất nhiên trong Excel vẫn hiểu định dạng này (tức là 31/12/2007 vẫn nằm bên phải, và hàm Month vẫn cho kết quả là 12).
Nhưng nếu ngày nhỏ hơn 12 (1,2,3,...,12) thì khi qua dòng lệnh:

Sheet2.Range("B1:M" & HC).AutoFilter Field:=2, Criteria1:=">=" & [G5], Operator:=xlAnd, Criteria2:="<=" & [I5]
Với: [G5]=1/12/2007 và [I5]=10/12/2007
Thì xem lại trong Sheet2 không có dữ liệu. Mặt dù biết rằng vẫn có vùng thời gian này.
Xét đến tận cùng thì phát hiện trong Custom (AutoFilter) nó báo rằng 12/1/2007, 12/10/2007.
Vậy xin hỏi làm sao để có được 1/12/2007 và 10/12/2007.
Mọi người có thể tự làm thử. Điều này hình như là luôn đúng nữa rồi.
Thân.

Thảo luận 134:

Muốn ngắn hả? Như vầy có ngắn không?

Sub xoa()
Range("H1:H" & [H65000].End(xlUp).Row).AutoFilter 1, "Delete"
Range("H2:H" & [H65000].End(xlUp).Row).SpecialCells(12).EntireRow.Delete
End SubThân.
Ngắn hơn nữa:


Sub Test()
Range([H1], [H65536].End(xlUp)).AutoFilter 1, "Delete"
Range([H1], [H65536].End(xlUp)).SpecialCells(12).EntireRow.Delete
End SubThật ra dùng AutoFilter cho trường hợp này sẽ cho tốc độ rất nhanh ---> Có điều tôi thao tác bằng tay cũng được, cần gì code nhỉ
Này nhé:
- Chọn cell H1, bấm Ctrl Shift mũi tên xuống
- Vào menu DataFilterAutoFilter
- Bấm mũi tên xổ xuống, chọn chử Delete
- Click phải vào vùng vừa Filter, chọn Delete Row --> OK
Vậy là xong!
Ẹc.. Ẹc...

Thảo luận 135:

Khi làm việc trên sheet hiện hành thì câu lệnh như sau:

Sub Macro1()
Range("F3:F26").Select
Selection = "=SUM(RC[-3]:RC[-1])"
Selection.Value = Selection.Value
End SubNếu muốn làm tương tự cho một sheet khác (không phải sheet hiện hành hoặc có thể là sheet ẩn) thì viết như thế nào ? Mục đích dùng Selection là để xoá công thức

Thanks!
Ý anh là sao? Có phải anh đang nói đến trường hợp vùng dử liệu nằm ở sheet khác, còn vùng đặt kết quả lại nằm ở 1 sheet khác?
Vậy thì anh ghi thêm tên sheet vào nữa là được!
Ví dụ: Vùng dử liệu nằm tại sheet 2, C3:E26 .. Cò vùng cần đặt kết quả là Sheet1, F3:F26 ---> Anh viết code như sau:


Sub Macro1()
With Sheet1.Range("F3:F26")
.Value = "=SUM(Sheet2!RC[-3]:RC[-1])"
.Value = .Value
End With
End Sub
Ghi tên sheet rõ ràng để có thể đúng bất cứ nơi đâu gọi macro cũng cho kết quả chính xác...
Thêm nữa: Hạn chế vụ Select, nếu không sẽ bị lổi khi anh đang ở 1 sheet, lại đi select 1 sheet đang ẩn

Thảo luận 136:

Bác test code chưa vậy? Em nghĩ chắc là chưa rồi! hi hihihi
Vì nó xóa luôn dòng đầu tiên mất rồi!

Sub Test()
Range([H1], [H65536].End(xlUp)).AutoFilter 1, "Delete"
Range([H1], [H65536].End(xlUp)).SpecialCells(12).EntireRow.Delete
End Sub
Sữa lại thành:

Sub Test()
Range([H1], [H65536].End(xlUp)).AutoFilter 1, "Delete"
Range([H2], [H65536].End(xlUp)).SpecialCells(12).EntireRow.Delete
End Sub
Thân.

Thảo luận 137:

@ Ndu: nếu bỏ SpecialCells(2,23) thì nó sẽ xóa cả cột đích trong khi đó Tôi chỉ muốn xóa những dòng mà cột điều kiện có dữ liệu.
Nhưng nếu bạn dùng SpecialCells(2,23) thì bạn lại không Resize được
Vậy chỉ còn mỗi cách chia ra từng phần mà làm
Cột F và G nhập chung thành 1

[F6:G1000].SpecialCells(2,23).Offset(, Bao nhiêu đó).ClearContents


[I6:I1000].SpecialCells(2,23).Offset(, Bao nhiêu đó).ClearContents
Bỏ luôn Resize

Thảo luận 138:

Theo tôi trong VBA thì FALSE = 0; còn TRUE <> 0, tuy nhiên True = -1 là giá trị mặc định.

Thảo luận 139:

Chào các bạn , mình có đoạn code này , chẳng biết sai gì mà chạy không đúng ý đồ , mời các bạn xem file và giúp dùm , cảm ơn

Sub DmTG()
dm = 0
For i = 7 To 21
On Error Resume Next
k = Application.WorksheetFunction.Match("*" & Cells(i, 3) & "*", [I8:I10], 0)
If k > 0 Then
h = Cells(i, 4)
End If
dm = h dm
Next
Cells(12, 10) = dm
End Sub

Thảo luận 140:

Thanks ptm0412 ! Tôi sẽ dùng tạm cách của bạn cho đến khi có một giải pháp mới. Mong rằng bạn sẽ nhanh chóng quay lại chủ đề này.
Tôi nghĩ anh nên cho Freeze Panes mặc định tại P4 luôn (khỏi cho vào code)
Việc còn lại là chỉnh Calendar sao cho đỉnh của nó luôn nằm tại P4, tức nằm dưới đường vạch của Freeze Panes ---> Vậy là không bị che rồi
giờ tôi giã định rằng Freeze Panes đã được thiệt lập sẳn tại cell P4, ta sửa code lại thành:


Private Sub worksheet_selectionchange(ByVal Target As Range)
Dim ScrRng As Range
With ActiveWindow
Set ScrRng = ActiveSheet.Cells(.ScrollRow, .ScrollColumn)
End With
With Target
Calendar1.Visible = (Not Intersect([L2:AU2], Target) Is Nothing)
Calendar1.Top = ScrRng.Top: Calendar1.Left = ScrRng.Left
Calendar1.Width = 130
Calendar1.Height = 110
End With
End Sub


Private Sub Calendar1_Click()
Selection.Value = Calendar1
Calendar1.Visible = False
End Sub
Lưu ý: Nếu Freeze Panes chưa được thiết lập thì Calendar sẽ "nhảy" đến cell A1
Tham khảo về Freeze Panes tại bài này:
http://www.giaiphapexcel.com/forum/showthread.php?t=19651

Thảo luận 141:

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:


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

Thảo luận 142:

Bác không để ý chứ 1 chức năng có thể quét các vấn đề này là Debug -> Debug cho phép quét xem code có đúng hay không thôi. Bác có thể thấy nó kế lệnh Run trên menu VBA đó -> Click vào và chọn Compile VBAProject. Và nếu có dư hoặc thiếu thì nó sẽ báo ngay.
Còn việc dùng như thế nào thì còn tùy thuộc vào tình huống nữa bác ơi, nói khơi khơi thì không thể hiểu được đâu.
Đành phải chờ dịp khác vậy!
Thân.

Thảo luận 143:

Mình có file này bạn bè cho dùng để tính thép trong xây dựng, mà nó bị lỗi không biết nguyên nhân. Mình thì không rành mấy cái này lắm nên nhờ các bác cao thủ của GPExel giúp đỡ. Các bác dow về máy rồi kiểm tra sửa chữa cho em cái, rồi up lên cho em hoặc gửi qua em mail của em: minhtranxd@gmail.com
Rất mong sự nhiệt tình của các bác. Chúc các bác sang năm mới nhiều điều thành công mới....

Thảo luận 144:

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.

Thảo luận 145:

Em thì khác khai báo vài biến thôi! Rồi dùng lại các biến này nếu nó đã hết nhiệm vụ trong quá trình xữ lý. Vậy đâu cần nhiều mà vẫn đủ!
Chúc vui.
Thân.

Thảo luận 146:

Cảm ơn các huynh ChanhTQ@ và Po_Pikachu nhiều!
Và làm ơn cho tôi hỏi thêm: Dữ liệu và công thức ở sheet1 được bảo vệ; thì các cells ở sheet2 sheet3 muốn bảo vệ thì không thực hiện được, có cách nào giải quyết xin chỉ dùm!
Chân thành.
NguyenVanSon có đưa ra 1 cách, bạn thử tìm với từ khóa Passwords xem sao?
Mình nhớ quy trình là vầy: (Tất cả bằng VBA)
* Mở khóa các ô cần nhập ở Sheet2 & sheet3;
* Chép dữ liệu từ Sheet1 vô những ô cần thiết;
* Khóa các ô đã mở để trả về nguyên trạng;

(*) Fa lcaffê & chiêm ngưỡng thành quả của mình & mọi người! :-=

Thảo luận 147:

Option Explicit
Sub Sheet123()
Dim Rng As Range
With Sheet2
If .[c10] = Sheet1.[c10] Then
Sheet3.[c10] = .[c10]
Sheet3.[c20] = .[c20] * 5
End If
End With
End Sub



Chúc vui!

Thảo luận 148:

Thử với Sub này xem:


Sub Test()
With Range([D1], [D65536].End(xlUp))
.Offset(, 2).Value = Evaluate("=If(" & .Address & "="""",""""," & .Address & " )")
End With
End Sub

Thảo luận 149:

Ý em là sao nó không thống nhất nhỉ?
Em thường thấy là True=1; False=0 sao giờ lại =-1 vậy? Cái đó làm cho nhiều người không để ý thì sẽ dẫn đến kết quả sai ngoài ý muốn đó.
Mong mọi người chú ý khi viết code nha!
Thân.

Thảo luận 150:

em muốn tính ngày cuối cùng của tháng là ngày nào, trong excel thì em làm được như sau: day(date(year(x),month(x) 1,0)
nhưng em không biết làm thế nào trong VB, vì không có hàm date.
Em thử hàm now của bác nhưng chưa được, nhờ bác chỉ chi tiết với a!
Trong VB bạn có thể dùng hàm này DateSerial. Cấu trúc cũng giống với hàm Date của excel.

Thảo luận 151:

Chắc có lẽ cách viết code có lỗi gì đó, Bạn xem giùm theo File đính kèm
http://www.zshare.net/download/57316693d8fec3de/ (http://www.zshare.net/download/57316693d8fec3de/)
http://myfreefilehosting.com/f/fd51510eee_0.01MB

Cells(i, 3) = DateDiff("m", .Cells(1, 8), .Cells(1, 9))
Mà Cells(1, 8) thì = Cells(1, 9)
==> DateDiff("m", .Cells(1, 8), .Cells(1, 9)) phải luôn =0
==> .Cells(1, 11) = Hsluong * tlBHXH * .Cells(i, 3) * .Cells(i, 4) đương nhiên cũng = 0 là đúng rồi còn gì
--------
Thêm nữa, trong code có nhiều chổ hơi khó hiểu, ví dụ:
1> Thứ nhất
Bạn định nghĩa:
Ma1 = WorksheetFunction.Match(.Cells(1, 8), rng, 1)
Ma2 = WorksheetFunction.Match(.Cells(1, 9), rng, 1)
Mà trong code lại có đoạn
If Ma1 = Ma2 Then
vậy cần gì vòng lập FOR ---> Vì đàng nào cũng chỉ xét có 1 vị trí ---> 2 Mã này bằng nhau khi Cells(1, 8) = Cells(1, 9)
2> Thứ hai:
Hsluong = .Cells(1, 10) = 0.33 ---> Vậy sao bạn lại khai báo biến Hsluong As Integer được chứ ---> Lý ra phải là Hsluong As Double (Integer là số nguyên cơ mà)
--------
Bạn hãy nói rõ bạn đang cần tính cái gì? Tính như thế nào? Chúng ta sẽ sửa lại code đúng ý đồ của bạn
(tôi nghĩ bài toán này không cần khai báo biến nhiều đến thế)

Thảo luận 152:

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?

Mấy câu khác các cao thủ đã trả lời rồi, riêng câu này đã bàn luận khá sôi nổi trên diển đàn.. Bạn có thể tham khảo tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=13195
và đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=13255

Thảo luận 153:

Cám ơn bạn

Mình đang tạo thủ tục theo yêu cầu của bài này (http://www.giaiphapexcel.com/forum/showthread.php?t=20734)
hiện đã viết được sub tạm ưng ý nhưng muốn chuyển thanh UDF để tiện sử dụng nhưng không được.
Mong bạn có thể sửa dùm và sửa giúp mình thủ tục tại File đính kèm theo link dưới:

http://myfreefilehosting.com/f/f0fa46e729_0.01MB
http://www.zshare.net/download/57363029ebed3e35/ (http://www.zshare.net/download/57363029ebed3e35/)

Chân thành cám ơn.

Thảo luận 154:

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é!

Thảo luận 155:

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]

Thảo luận 156:

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:


Sub TestCopy()
Sheets("Sheet1").[A1:B2].Copy: Sheets("Sheet2").[B2].PasteSpecial _
Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End Sub

Thảo luận 157:

Yêu cấu công việc của mình như sau dùng VBA
- Mở một bản vẽ CAD có sẵn--> Scale xuỗng tỉ lệ a/b trong đó: a là kích thước của đoạng thẳng tùy chọn ghi trong bản vẽ (có thể đo). b là kích thước nhập từ bàn phím.
- Lần lượt đo kích thước một số đoạn thẳng ---> tự động đưa giá trị sang một file Exel.
Nhờ các cao nhân chỉ giáo giúp cho !$@!!
KHông có ai giúp mình được vấn đề này à? hicc các cao nhân đâu hết rồi????!!!
Các Pro chịu thua với bai toán này rồi sao???!!!

Thảo luận 158:

Chào các bạn , khi thực hiện 1 sub ta dùng lệnh Call hoặc không .Tốc độ thấy như nhau .
Vậy 2 trường hợp này có gì khác nhau . Cảm ơn

Call Statement
Transfers control to a Sub procedure, Function procedure, or dynamic-link library (DLL) (http://www.giaiphapexcel.com/forum/ms-help://MS.EXCEL.DEV.12.1033/EXCEL.DEV/content/HV01200929.htm) procedure (http://www.giaiphapexcel.com/forum/ms-help://MS.EXCEL.DEV.12.1033/EXCEL.DEV/content/HV01200929.htm).
Syntax
[Call] name [argumentlist]
The Call statement syntax has these parts:
PartDescriptionCallOptional; keyword (http://www.giaiphapexcel.com/forum/ms-help://MS.EXCEL.DEV.12.1033/EXCEL.DEV/content/HV01200929.htm). If specified, you must enclose argumentlist in parentheses. For example:
Call MyProc(0)
nameRequired. Name of the procedure to call.argumentlistOptional. Comma-delimited list of variables (http://www.giaiphapexcel.com/forum/ms-help://MS.EXCEL.DEV.12.1033/EXCEL.DEV/content/HV01200929.htm), arrays (http://www.giaiphapexcel.com/forum/ms-help://MS.EXCEL.DEV.12.1033/EXCEL.DEV/content/HV01200929.htm), or expressions (http://www.giaiphapexcel.com/forum/ms-help://MS.EXCEL.DEV.12.1033/EXCEL.DEV/content/HV01200929.htm) to pass to the procedure. Components of argumentlist may include the keywords ByVal or ByRef to describe how the arguments (http://www.giaiphapexcel.com/forum/ms-help://MS.EXCEL.DEV.12.1033/EXCEL.DEV/content/HV01200929.htm) are treated by the called procedure. However, ByVal and ByRef can be used with Call only when calling a DLL procedure. On the Macintosh, ByVal and ByRef can be used with Call when making a call to a Macintosh code resource.
Remarks
You are not required to use the Call keyword when calling a procedure. However, if you use the Call keyword to call a procedure that requires arguments, argumentlist must be enclosed in parentheses. If you omit the Call keyword, you also must omit the parentheses around argumentlist. If you use either Call syntax to call any intrinsic or user-defined function, the function's return value is discarded.
Không bắt buộc phải dùng từ khóa Call khi gọi một thủ tục, nếu dùng từ khóa Call mà có đối số thì các đối số này cần phải được bao đóng trong cặp ngoặc (). Nếu dùng Call với hàm thì giả trị trả lại của hàm bị hủy bỏ.

To pass a whole array to a procedure, use the array name followed by empty parentheses.
Example

This example illustrates how the Call statement is used to transfer control to a Sub procedure, an intrinsic function, and a dynamic-link library (DLL) procedure.DLLs are not used on the Macintosh.
' Call a Sub procedure.Call PrintToDebugWindow("Hello World") ' The above statement causes control to be passed to the following' Sub procedure.Sub PrintToDebugWindow(AnyString) Debug.Print AnyString ' Print to the Immediate window.End Sub' Call an intrinsic function. The return value of the function is' discarded.Call Shell(AppName, 1) ' AppName contains the path of the ' executable file.

Thảo luận 159:

Xin lỗi có lẽ do mình nói chưa rõ: Mình muốn từ cột F dịch sang phải 28 cột và xóa dữ liệu ở 2 cột 28 và 29 thì viết như thế nào ?

Nói vậy vẫn khó hình dung


Từ cột F (cột 6) dịch sang phải 28 cột ta được cột 34 (cột AH)
Vậy muốn xoá 2 cột AH và AI hay là xoá hai cột 28 và 29 (cột AB và AC)

Thảo luận 160:

Theo em thì có thể viết như vầy.

Sub thu()
Application.InputBox("Quet chon vung", Type:=8).Columns(1).TextToColumns Cells(1, 1), 2
End SubThân.
Viết sao cũng được... nhưng vì tác giả có nói rằng:


Bây giờ mình muốn sửa code để nó chỉ chạy trên vùng lựa chọn thì làm thế nào (Vùng lựa chọn chỉ nằm trong một cột), vùng lựa chọn là vùng mà mình bôi đen tren excel.
i.

Ta phải khẳng định với nhau, rằng vùng đã chọn chỉ là 1 cột.

If Selection.Columns.Count=1 then .TextToColumns .Cells(1, 1), 2
Vậy em sửa lại


Sub khanh()
With Selection
if .Columns.Count = 1 then .TextToColumns .Cells(1, 1), 2
End With
End Sub

Thảo luận 161:

Mình vận dụng hướng dẫn bài học VBA trên diễn đàn để tạo sổ chi tiết,nhưng làm hoài mà không được ,xin SỬA lại dùm maccro INOSOCHITIET1 để nó có thể chạy được.Chân thành cảm ơn

Thảo luận 162:

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.

Thảo luận 163:

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

Thảo luận 164:

HI các huynh,
Làm ơn giúp cái hàm macro xử lý cái phần superscript với vì viết code copy paste thì phần superscript nó nhảy xuống luôn huhuhuh!
Xin cảm ơn!

Thảo luận 165:

Bác test code chưa vậy? Em nghĩ chắc là chưa rồi! hi hihihi
Vì nó xóa luôn dòng đầu tiên mất rồi!

Sub Test()
Range([H1], [H65536].End(xlUp)).AutoFilter 1, "Delete"
Range([H1], [H65536].End(xlUp)).SpecialCells(12).EntireRow.Delete
End SubSữa lại thành:

Sub Test()
Range([H1], [H65536].End(xlUp)).AutoFilter 1, "Delete"
Range([H2], [H65536].End(xlUp)).SpecialCells(12).EntireRow.Delete
End SubThân.
Thì dòng đầu cũng có chử Delete ---> Xóa luôn đi chứ để làm gì ---> Nếu H1 không phải là chử Delete thì tính tiếp...
Ẹc...Ẹc...
Ý tôi không phải nói về code (vì lòng vòng vẩn là AutoFilter) ---> Mà tôi muốn nói yêu cầu này quá dể dàng để thao tác bằng tay ---> KHÔNG CẦN CODE

Thảo luận 166:

Hi All,

Hai doan code nay minh hoc duoc tren giaiphapexcel, nhung khi ap dung vao cung 1 workbook thi khong biet ghep nhu the nao cho dung. Cac ban xem giup voi nhe. (Minh khong ranh lam ve VBA.. :-)). Many thanks, lnt

** doan code nay dung de xoa cac sheet trong workbook neu ngay hien tai nho hon ngay duoc chi dinh
Private Sub Workbook_Open()
Dim ws As Worksheet
Application.DisplayAlerts = False
If Date > #12/30/2008# Then
For Each ws In Worksheets
On Error Resume Next
ws.Delete
Next
Range("a:o").Clear
Application.DisplayAlerts = True
End If
End Sub

** Doan code nay cho phep su dung tinh nang Group and Outline tren bang tinh bi khoa
Private Sub Workbook_Open()
With Sheet1
.Protect Password:="Secret", UserInterfaceOnly:=True
.EnableOutlining = True
End With
End Sub

Thảo luận 167:

Thú thật do trình độ nên không dám dùng lại biến, mà không khai thì nó không chạy, nhất là các biến endRow hoặc EndR dễ nhầm lẫn giữa các sheet. Lúc viết code mình hay copy đọan khai biến sẵn có và cứ thế mà "phang".
Rất cám ơn các bạn.
Còn một vấn đề nữa, có cách gì để loại bỏ bớt biến đã khai mà không sử dụng. Sợ dư thì cũng phí.

Thảo luận 168:

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!!!!

Thảo luận 169:

Xin cảm ơn ! nguyên đoạn code là như sau :


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

Thảo luận 170:

Mình muốn select lần lượt từng ô dạng: Cells(i, j) i = X->A; j = Y->B để gán công thức;
Mình dùng code: Range(...). Slelect nhưng thấy nó chỉ cho range ô cụ thể.
Có thể cho Range(...). Select chạy với dạng ô (i,j) ở trên được ko nhỉ. Hay có code tương đương ko ?
Các bạn chỉ giúp.
Thanks a lot

Thảo luận 171:

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ụ:


Dim GGGGGGGGGGGGGGGPPPPPPPPPPPPPPPPPEEEEEEEEEEE As String
GGGGGGGGGGGGGGGPPPPPPPPPPPPPPPPPEEEEEEEEEEE = "AAA" & _
GGGGGGGGGGGGGGGPPPPPPPPPPPPPPPPPEEEEEEEEEEE & ".COM"

Thảo luận 172:

Tại ô B1 tôi có công thức như sau:
=IF(A1="","",A1). Sau đó kéo xuống cho toàn bộ cột B1
Nghĩa là giá trị cột B luôn bằng cột A nếu ô A có giá trị.
Nếu copy toàn bộ cột B1 thành giá trị thì tôi có thể record một marco. Nhưng nếu chỉ copy những ô tại cột B mà có giá trị thì làm thế nào vậy, những ô bằng "" thì giữ nguyên công thức.

Nếu copy toàn bộ cột B1 thành giá trị thì sẽ có marco như này:

Sub paste_special()
Columns("B:B").Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Range("A1").Select
End Sub

Các bác giúp viết lại code nhé!

Thảo luận 173:

Các bác ơi em có đoạn code sau :

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:


Private Sub CommandButton1_Click()
[A3].End(xlDown).Resize(, 5).Select
End Sub
Mới gọn chứ

Thảo luận 174:

Muốn ngắn hả? Như vầy có ngắn không?

Sub xoa()
Range("H1:H" & [H65000].End(xlUp).Row).AutoFilter 1, "Delete"
Range("H2:H" & [H65000].End(xlUp).Row).SpecialCells(12).EntireRow.Delete
End Sub
Thân.

Thảo luận 175:

Mình có đoạn code tự record như sau. Bình thường vẫn chạy tốt nhưng không hiểu sao được một vài hôm thì lại bị hỏng. Nguyên nhân có lẽ là do đoạn code màu đỏ đã không được thực hiện. Các bác xem hộ tại sao nhé

Sub Mergging1()
'
' Mergging Macro
' Macro recorded 2/5/2009 by thuy.dinh
'
' Keyboard Shortcut: Ctrl Shift K
'
Range("B1").Select
ActiveCell.FormulaR1C1 = "=LEFT(R1C[-1],FIND(""X, 0, NO"",R1C[-1],1) 7)"
Range("B2").Select
ActiveCell.FormulaR1C1 = _
"=LEFT(RIGHT(R1C[-1],LEN(R1C[-1])-SUM(OFFSET(R1C[1],,,ROW(R[-1]C[1]),1))),FIND(""X, 0, NO"",RIGHT(R1C[-1],LEN(R1C[-1])-SUM(OFFSET(R1C[1],,,ROW(R[-1]C[1]),1))),1) 7)"
Range("C1").Select
ActiveCell.FormulaR1C1 = "=LEN(RC[-1])"
Range("C2").Select
ActiveCell.FormulaR1C1 = "=LEN(RC[-1])"
Range("B2:C2").Select
Selection.AutoFill Destination:=Range("B2:C209"), Type:=xlFillDefault
Range("B2:C209").Select
ActiveWindow.SmallScroll Down:=-15
Range("B6").Select
Columns("B:B").EntireColumn.AutoFit
Cells.Select
Range("E10").Activate
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Columns("B:B").Select
Selection.Replace What:=",", Replacement:=" ", _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:= _
False, ReplaceFormat:=False
ActiveWindow.SmallScroll Down:=-9
Columns("B:B").Select
Selection.TextToColumns Destination:=Range("B1"), DataType:=xlFixedWidth, _
FieldInfo:=Array(Array(0, 1), Array(28, 1), Array(53, 1), Array(80, 1), Array(112, 1), _
Array(138, 1), Array(172, 1), Array(197, 1), Array(225, 1), Array(252, 1), Array(278, 1), _
Array(325, 1), Array(350, 1), Array(376, 1)), TrailingMinusNumbers:=True
Range("B12").Select
Columns("B:B").EntireColumn.AutoFit
Columns("B:B").ColumnWidth = 17.57
Columns("E:E").ColumnWidth = 12
Columns("D:E").Select
Selection.Delete Shift:=xlToLeft
Columns("E:H").Select
Selection.Delete Shift:=xlToLeft
Selection.ColumnWidth = 9.86
Columns("F:I").Select
Selection.Delete Shift:=xlToLeft
Range("H4").Select
Columns("E:E").ColumnWidth = 12.43
Columns("A:A").ColumnWidth = 10
Range("B1:E50").Select
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
With Selection.Font
.Name = "Tahoma"
.Size = 10
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = xlAutomatic
End With
Range("B1").Select
Columns("B:B").Select
Selection.Replace What:="#VALUE!", Replacement:="", _
LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:= _
False, ReplaceFormat:=False
Range("B1").Select
End Sub

Thảo luận 176:

Các Anh(Chị) có thể giải thích giúp tôi đoạn code màu xanh dưới đây được không?

Option Private Module
Public App As String
Private g_key As String


Function pass()
pass = "your password"
End Function


Function appname()
App = "sys32vb7"
End Function


Function Protectit()
Dim x As Variant
If LCase(Left(Application.OperatingSystem, 3)) <> "mac" And LCase(Left(Application.Version, 3)) <> "8.0" Then
For Each x In ActiveWorkbook.Sheets
If x.Name = "Control" Or x.Name = "Invoice" Or x.Name = "Reports" Then
x.ScrollArea = "scr" & x.Name
x.Protect Password:=pass, DrawingObjects:=True, Contents:=True, Scenarios:=True
End If
Next
ActiveWorkbook.Protect Password:=pass, Structure:=True
End If
End Function


Function Unprotectit()
Dim x As Variant
ActiveWorkbook.Unprotect Password:=pass
For Each x In ActiveWorkbook.Sheets
x.Unprotect Password:=pass
x.ScrollArea = ""
Next
End Function


Function UnProtectbook()
ActiveWorkbook.Unprotect Password:=pass
End Function

Function lockall()
Unprotectit
Dim x As Variant
Range("keyflag").Value = 1
For Each x In ActiveWorkbook.Sheets
x.Protect Password:=pass, DrawingObjects:=True, Contents:=True, Scenarios:=True
Next
End Function


Function unlockall()
Dim x As Variant
For Each x In ActiveWorkbook.Sheets
x.EnableSelection = xlNoRestrictions
x.Unprotect Password:=pass
Next
Range("keyflag").Value = 0
End Function
'-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - '
Function ******()
g_key = "@#ft^ *(^%$#h7A=?(^d-_h.,|{$U2 0(*&][Gs9/*5df@!%#:J`&..?|t8eSP "
End Function
-------------------------------------------
Function EnCrypt(strCryptThis)
Dim strChar, iKeyChar, iStringChar, i
******
For i = 1 To Len(strCryptThis)
iKeyChar = Asc(Mid(g_key, i, 1))
iStringChar = Asc(Mid(strCryptThis, i, 1))
iCryptChar = iKeyChar Xor iStringChar
strEncrypted = strEncrypted & Chr(iCryptChar)
Next
EnCrypt = strEncrypted
End Function
-------------------------------------------
Function DeCrypt(strEncrypted)
Dim strChar, iKeyChar, iStringChar, i
******
For i = 1 To Len(strEncrypted)
iKeyChar = (Asc(Mid(g_key, i, 1)))
iStringChar = Asc(Mid(strEncrypted, i, 1))
iDeCryptChar = iKeyChar Xor iStringChar
strDecrypted = strDecrypted & Chr(iDeCryptChar)
Next
DeCrypt = strDecrypted
End Function
-------------------------------------------
Function CreateCode(emailaddress)
Dim iStringChar, i
For i = 2 To Len(emailaddress)
iStringChar = Asc(Mid(LCase(emailaddress), i, 1))
iStringChar = iStringChar ^ 5.23975
If Left(iStringChar, 1) < 4 Then
strCode = strCode & Chr(48 Right(iStringChar, 1)) & Chr(57 - Left(iStringChar, 1))
ElseIf Left(iStringChar, 1) > 7 Then
strCode = strCode & Chr(97 Right(iStringChar, 1) Left(iStringChar, 1) 5)
Else
strCode = strCode & Chr(97 Right(iStringChar, 1) Left(iStringChar, 1) 10)
End If
strCode = strCode & Chr(48 Mid(iStringChar, 3, 1)) & Chr(97 Mid(iStringChar, 5, 1) Mid(iStringChar, 6, 1))
Next
CreateCode = strCode
End Function

Thảo luận 177:

Xin lỗi có lẽ do mình nói chưa rõ: Mình muốn từ cột F dịch sang phải 28 cột và xóa dữ liệu ở 2 cột 28 và 29 thì viết như thế nào ?

Thảo luận 178:

Thì dòng đầu cũng có chử Delete ---> Xóa luôn đi chứ để làm gì ---> Nếu H1 không phải là chử Delete thì tính tiếp...
Ẹc...Ẹc...
Ý tôi không phải nói về code (vì lòng vòng vẩn là AutoFilter) ---> Mà tôi muốn nói yêu cầu này quá dể dàng để thao tác bằng tay ---> KHÔNG CẦN CODE

Theo em nếu là để học code thì ok, nhưng nếu là để phục vụ công việc thì cứ theo nguyên tắc "thơm, ngon, bổ, rẻ" --> sao cho vừa nhanh vừa tiện thôi.
Thực ra làm bằng tay cũng được mà

Thảo luận 179:

Tôi có một file (c:dulieudoanhso.xls) có trường Doanhso và trường Tenhang, và file (c:dulieu onghop.xls) có trường Tenhang,TongDT. tôi muốn tính tổng doanh số của từng mặt hàng bên file doanhso.xls rồi ghi giá trị sang file tổng hợp nhưng không muốn mở thủ công file doanhso.xls làm cách nào mong bạn và các chuyên gia Excel giúp đỡ.
Có file đính kèm!
Cái này dùng Consolidate là nhanh gọn nhất ---> Khỏi cần Open source file


Sub TongHop()
Dim SrcRng As String
SrcRng = "'" & ThisWorkbook.Path & "[doanhso.xls]Sheet1'!R2C2:R1000C3"
With Range("A1").CurrentRegion.Offset(1)
.Clear
.Consolidate SrcRng, 9, , True
End With
End Sub

Thảo luận 180:

Vậy thì dùng code này đi. Đơn giản là xóa dữ liệu của các dòng đó đi hết là xong chứ gì?

Sub xoa()
For i = [H65000].End(xlUp).Row To 1 Step -1
If Cells(i, 8) = "Delete" Then
Rows(i).ClearContents
End If
Next
End Sub
Thân.

Thảo luận 181:

À quên! Đây mới đúng!

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 4 And Target.Offset(, 2) = "" Then
Target.Offset(, 2) = Target
End If
End Sub
Thân.

Thảo luận 182:

Bạn nhấn vào nút "Đổi sang khung lớn". Rồi bạn kéo thanh trượt xuống -> Nhấn vào nút "Tải file từ máy" -> Rồi nạp file từ máy vào. Xong.
Thân.

Thảo luận 183:

Doạn mã trên được sửa lại như sau:

On Error GoTo ErrorHandling
Dim ConnStr As String, conn As Object
Dim strSQL As String
Dim rs As Object

Range("A10: I2000").Delete ' xóa kết quả cũ đi
Range("A10: I2000").Font.Name = ".VnTime"
Range("A10: I2000").Font.Size = 11
df = Txt_Dfrom.Value
dt = Txt_Dto.Value
tm = Txt_Mst.Text
ConnStr = "driver={Microsoft ODBC for Oracle}; server=QLT; uid=qlt_read; pwd=qlt_read"
Set conn = CreateObject("ADODB.Connection")
conn.ConnectionString = ConnStr
conn.Open
If tm = "" Then
strSQL = "SELECT QLT_CTU_HDR.TIN, QLT_CTU_HDR.TEN_DTNT, QLT_CTU_DTL.CCG_MA_CAP, QLT_CTU_DTL.CCG_MA_CHUONG, QLT_CTU_DTL.TMT_MA_MUC, QLT_CTU_DTL.TMT_MA_TMUC, QLT_CTU_HDR.SO_CTU, QLT_CTU_DTL.SO_TIEN/1, QLT_CTU_HDR.NGAY_NOP_KB FROM QLT_OWNER.QLT_CTU_DTL QLT_CTU_DTL, QLT_OWNER.QLT_CTU_HDR QLT_CTU_HDR WHERE QLT_CTU_HDR.ID = QLT_CTU_DTL.CTH_ID AND ((QLT_CTU_HDR.NGAY_NOP_KB Between '" & df & "' And '" & dt & "') AND (QLT_CTU_HDR.DCT_LOAI='04'))"
Else
strSQL = "SELECT QLT_CTU_HDR.TIN, QLT_CTU_HDR.TEN_DTNT, QLT_CTU_DTL.CCG_MA_CAP, QLT_CTU_DTL.CCG_MA_CHUONG, QLT_CTU_DTL.TMT_MA_MUC, QLT_CTU_DTL.TMT_MA_TMUC, QLT_CTU_HDR.SO_CTU, QLT_CTU_DTL.SO_TIEN/1, QLT_CTU_HDR.NGAY_NOP_KB FROM QLT_OWNER.QLT_CTU_DTL QLT_CTU_DTL, QLT_OWNER.QLT_CTU_HDR QLT_CTU_HDR WHERE QLT_CTU_HDR.ID = QLT_CTU_DTL.CTH_ID AND ((QLT_CTU_HDR.NGAY_NOP_KB Between '" & df & "' And '" & dt & "') AND (QLT_CTU_HDR.DCT_LOAI='04') AND QLT_CTU_HDR.TIN='" & tm & "')"
End If
' Ngày có thể là kiểu: {ts '2008-01-01 00:00:00'} And {ts '2008-11-30 00:00:00'}
Set rs = CreateObject("ADODB.Recordset")
Set rs = conn.Execute(strSQL)
'rs.Open strSQL
If rs Is Nothing Then
MsgBox "Không có dữ liệu nào thỏa mãn!", vbExclamation, ThisWorkbook.Name
Else
'Worksheets.Select
Cells(10, 1).Select ' Ghi dữ liệu từ dòng 10
n = 0
Do Until n = rs.Fields.Count
Cells(10, n 1) = rs.Fields(n).Name
n = n 1
Loop
Cells(11, 1).CopyFromRecordset rs
End If
rs.Close
conn.Close
Range("A10:I10").Delete ' xóa dòng tiêu đề == tên trường
Exit Sub
ErrorHandling:
MsgBox Err.Description ' Msgbox "Không kết nối được CSDL hoặc sai điều kiện"
End Sub

Mình đã kết nối thành công và có thể đưa bất cứ điều kiện nào vào để lấy ra dữ liệu theo ý muốn.

Thảo luận 184:

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 ?).

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

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 !

Thảo luận 185:

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
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:

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

Thảo luận 186:

Không được rùi. Code này là mình tự record với lệnh "text to clumn" vì vậy khi chạy code của các bác chưa được theo ý muốn.
Đoạn text của mình sẽ như sau:
02/11/2008 08:14 AM MYLIST

Sau khi chạy xong thì mỗi màu text kia sẽ phải chạy ra là một cột nghĩa là chỉ ra 4 cột thôi.
Chạy code của các bác xong thì lại ra 5 cột, cột thời gian nó bị chia ra làm hai

Các bác xem lại giúp nhé!

Thảo luận 187:

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
Sheets("DangKy").[A2].PasteSpecial Paste:=xlPasteValues
MsgBox "Copy thanh cong"
End Sub


Bạn sửa lại :


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.

Thảo luận 188:

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:


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.

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

Thảo luận 189:

Xin hỏi 1 vấn đề hơi đơn giản nhưng không biết là do code sai hay là em hiểu sai về code.
Trường hợp cụ thế như vầy:
Nếu bạn lấy True - False trong công thức (=True-False) thì kết quả là 1.
Nhưng trong VBA, cũng True - False ([biểu thức A=True]-[biểu thức B=False]) thì kết quả lại là -1.
Vậy xin hỏi vấn đề này giải thích ra sao vậy?
Xin chân thành cảm ơn.
(Em biết nó vẫn luôn ra như vậy, nhưng chỉ hỏi là tại sao lại có chuyện lạ kỳ như vậy? Đây có phải là lỗi của Microsoft không hay có điều gì khác ạ!)
Vì đơn giản trong VBA, người ta xem TRUE = -1
Bạn vào Help mà xem!

Thảo luận 190:

Từ một cột có dữ liệu (cột làm điều kiện) tôi muốn dịch sang một số cột để xóa dữ liệu Tôi viết [F6:F1000].SpecialCells(2, 23).Offset(0, 28 , 0 , 3).ClearContents nhưng không được nên phải viết như sau:


[F6:F1000].SpecialCells(2, 23).Offset(0,28).ClearContents
[F6:F1000].SpecialCells(2, 23).Offset(0, 29).ClearContents
[G6:G1000].SpecialCells(2, 23).Offset(0, 28).ClearContents
[G6:G1000].SpecialCells(2, 23).Offset(0, 26).ClearContents
[I6:I1000].SpecialCells(2, 23).Offset(0, 25).ClearContents
[I6:I1000].SpecialCells(2, 23).Offset(0, 24).ClearContents
Nhờ các bạn sửa giúp đoạn code này. Xin cảm ơn !



Đoạn code trên thực hiện xoá dữ liệu ở các cột dịch đi số cột so với cột mốc khi dữ liệu ở cột làm mốc là Text
Nếu cột làm mốc là Formmuula (chứa công thức)thì phải thay SpecialCells(2, 23) thành SpecialCells(3, 23)

Thảo luận 191:

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)???

Thảo luận 192:

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?

Thảo luận 193:

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

Thảo luận 194:

Từ câu lệnh chọn 2 vùng không liên tục: Range("K8:O28,T8:Y28").Select
Tôi muốn thay số dòng cuối 28 trong câu lệnh này thành & [F65536].End(xlUp).Row 1 thì phải viết như thế nào ?

Nếu viết là Range("K8:O" & [F65536].End(xlUp).Row 1, "T8:Y" & [F65536].End(xlUp).Row 1).Select thì máy chấp nhận nhưng nó chọn luôn 2 vùng thành 1. Nhờ các bạn chỉ giúp chỗ sai trong câu lệnh hoặc viết lại giúp câu lệnh, Thanks!

Thảo luận 195:

HI ndu96081631,
Làm ơn giúp cái hàm macro xử lý vụ này cái!
Xin cảm ơn!

Thảo luận 196:

Bác Thunghi à

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

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


ST

Thảo luận 197:

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

Thảo luận 198:

Chào các bác.
Nhờ các bác xem giúp (trong file đính kèm: http://www.giaiphapexcel.com/forum/images/attach/rar.gif BANGGIA boyxin.rar (http://www.giaiphapexcel.com/forum/attachment.php?attachmentid=17348&d=1225037112) )


Sau khi List 1 -> List 2, quay lại chọn lại List 1 thì báo lỗi
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

Thảo luận 199:

mình cần hiểu và làm theo nhưng ko biết cách đọc các bạn giúp mình với.
Sub SAVING_data()

If Cells.Find(What:=BL_NO, After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False) Is Nothing Then
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Range("A1").Select
Else
Cells.Find(What:=BL_NO, After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext, _
MatchCase:=False).Activate
End If
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False

Application.CutCopyMode = False
ActiveCell.Select
ActiveWorkbook.Save

End Sub
Sub SAVE_Bien_ban()


BL_NO = Range("s5")
If BL_NO = "" Then
MsgBox ("Yeu cau nhap so BIEN BAN vao S5")
Exit Sub
End If
Range("'Link'!A2:AZ2").Copy
Sheets("Data").Select
Range("A1").Select
Application.Run ("SAVING_data")
Sheets("Bien ban").Select
End Sub
Sub VIEW_bien_ban()
So_xem = Range("a1")
cotdl = 1
Range("s5") = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl 1
Cells(11, 7) = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl 1
Cells(13, 15) = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl 1
Cells(14, 15) = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl 1
Cells(15, 15) = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl 1
Range("f19") = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl 1
Range("o19") = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl 1
Range("u19") = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl 1
Range("f20") = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl 1
Range("o20") = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl 1
Range("u20") = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl 1

For hang = 21 To 29
For cot = 12 To 13
Cells(hang, cot) = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl 1
Next cot
Next hang
cotdl = 30
For hang = 30 To 37
Cells(hang, 12) = Application.Index(Range("data!a3:az10000"), So_xem, cotdl)
cotdl = cotdl 1
Next hang

Range("f5").Select
End Sub

Sub Nhap_Bien_ban_moi()

Sheets("data").Select
Range("a1").Select
Selection.End(xlDown).Select
Bien_ban_moi_so = ActiveCell.Row() - 1
Sheets("Bien ban").Select
Range("g11") = Now()

If Range("a5") = "" Then
MsgBox ("Yeu cau chon LOAI BIEN BAN CAN NHAP roi nhap tiep sau")
Exit Sub
End If
If Range("a5") = 1 Then
Range("S5") = "GX-" & Year(Now) & "-" & Bien_ban_moi_so
Else
If Range("a5") = 2 Then
Range("S5") = "NX-" & Year(Now) & "-" & Bien_ban_moi_so
End If
End If
Range("o15:S15,F19:K20,o19:r20,u19:u20,l21:l29,l21:u29,l3 0:u35").ClearContents
Range("A6").Select
End Sub

Thảo luận 200:

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!:-=

Thảo luận 201:

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ì?

Thảo luận 202:

HI ndu96081631,
Làm ơn giúp cái hàm macro xử lý vụ này cái!
Xin cảm ơn!
Có gì đâu chứ... cũng như bạn làm bằng tay thôi: Copy và Paste ---> Bạn cứ record macro quá trình copy/paste này là thành đoạn code ngay!

Thảo luận 203:

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

Thảo luận 204:

range("H12:I13").Select
Selection.AutoFill Destination:=Range(Cells(12, 8), Cells(n, 9)), Type:=xlFillDefault

Thảo luận 205:

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é)

Thảo luận 206:

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

Thảo luận 207:

Bác Thunghi à

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

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


ST
Code của người ta là
eR = [A65000].End(xlUp).Row
Set MyRng = Range("A1:A" & eR)
Mà Bạn sửa thành
ei = [A65000].End(xlUp).Row
Thì lấy đâu eR mà set.

Thảo luận 208:

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 ạ

Thảo luận 209:

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 :

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)???
Sheet1.Range("A1:B2").Value = Sheet2.Range("B2:C3").ValueKhi đó bạn muốn đứng trên Sheet nào thì chỉ cần cho Sheet đó Active là được.

Xin chào!

Thảo luận 210:

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é!


Sub Test()
MsgBox ActiveSheet.UsedRange.Address
End Sub

Thảo luận 211:

Chào các bạn , khi thực hiện 1 sub ta dùng lệnh Call hoặc không .Tốc độ thấy như nhau .
Vậy 2 trường hợp này có gì khác nhau . Cảm ơn

Thảo luận 212:

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.

Thảo luận 213:

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:

Selection.Resize(, 1)(Selection.Resize(, 1).Count).SelectNhư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

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

Thảo luận 214:

Các huynh ơi giúp tiểu đệ với! Hichic

Thảo luận 215:

Chào các bạn , mình có đoạn code này , chẳng biết sai gì mà chạy không đúng ý đồ , mời các bạn xem file và giúp dùm , cảm ơn

Sub DmTG()
dm = 0
For i = 7 To 21
On Error Resume Next
k = Application.WorksheetFunction.Match("*" & Cells(i, 3) & "*", [I8:I10], 0)
If k > 0 Then
h = Cells(i, 4)
End If
dm = h dm
Next
Cells(12, 10) = dm
End Sub
Sửa lại:


Sub DmTG()
Dim i As Long, dm As Double
For i = 7 To 21
If WorksheetFunction.CountIf([I8:I10], "*" & Cells(i, 3) & "*") > 0 Then
dm = Cells(i, 4) dm
End If
Next
Cells(12, 10) = dm
End Sub
Làm chi mà nhiều biến thế chứ
Thêm nữa... bài này công thức cũng ra mà:

=SUMPRODUCT((COUNTIF($I$8:$I$10,"*"&$C$7:$C$21&"*"))*($D$7:$D$21))

Thảo luận 216:

Mọi người chỉ giáo giùm cách viết code trong excel và Word có khác nhau nhiều không. Mình có đoạn code tự record như sau:
Sub Macro1()
CommandBars("Stop Recording").Visible = False
Selection.TypeParagraph
Selection.MoveDown Unit:=wdLine, Count:=1
Selection.HomeKey Unit:=wdLine
End Sub

Code này chỉ chạy trên file word hiện hành. Các bác có thể sửa giúp để marco có thể chạy trên tất cả các file word đang mở được không. Thanks nhiều!

Thảo luận 217:

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.

Thảo luận 218:

Cám ơn bạn
Thực ra File mình đã gửi ở cả 2 bài trên rồi. Mình gửi lại theo link:
http://www.zshare.net/download/57457519cf24b312/ (http://www.zshare.net/download/57457519cf24b312/)
Bạn gửi trực tiếp file lên đây luôn đi... hoặc up lên trang www.mediafire.com cũng được
(file của bạn down không được rồi)

Thảo luận 219:

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

Thảo luận 220:

Vâng, em làm được rồi! Cảm ơn hai bác nha.
Thân.

Thảo luận 221:

Chào anh, chị
Khi mình thực hiện phép nhân (*) trong VBA. Thì VBA tự đọng làm tròn số đàng sau số thập phân
VD: Giá trị trên sheets.cells(1,1)=0.23
thực hiện trong code:
sheets.cells(1,1) * 1000= 0 ??
Dù format hoặc chuyển dịnh dạng nhưng kết quả vẫn =0
Mong anh chị chỉ dùm lỗi ở đâu?

Chân thành cám ơn
Tôi thí nghiệm thấy đúng mà!


Sub Test()
[B1] = [A1] * 1000
End Sub

Với A1 = 0.23 thì B1 = 230
Có lẻ dử liệu của bạn đang sai chổ nào ấy chứ ---> Đưa lên xem thử

Thảo luận 222:

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.



Function Vnd(SoTien) As String

End Function




Sub DinhDang()

End Sub


Vbavn

Thảo luận 223:

Mình có file này bạn bè cho dùng để tính thép trong xây dựng, mà nó bị lỗi không biết nguyên nhân. Mình thì không rành mấy cái này lắm nên nhờ các bác cao thủ của GPExel giúp đỡ. Các bác dow về máy rồi kiểm tra sửa chữa cho em cái, rồi up lên cho em hoặc gửi qua em mail của em: minhtranxd@gmail.com
Rất mong sự nhiệt tình của các bác. Chúc các bác sang năm mới nhiều điều thành công mới....
Có code này trong file đâu mà "CHẠY"
Chỉ có VIRUS thôi!
Ẹc... Ẹc...

Thảo luận 224:

Nhờ các bác viết hộ bài toán đơn giản như sau:
Nếu tại ô H1="Delete" thì xóa toàn bộ dòng đó luôn, áp dụng cho toàn bộ cột H.

Thanks các bác!

Thảo luận 225:

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

Thảo luận 226:

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

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
Private Sub cmdinput_Click()
txtmshs.Enabled = True
txthoten.Enabled = True
txtngaysinh.Enabled = True
txtmshs = ""
txthoten = ""
txtngaysinh = ""
txtmshs.SetFocus
End Sub
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
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
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
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

Thảo luận 227:

Đây là phần Help của Excel nói như vậy!


UsedRange Property

See AlsoApplies ToExample (mk:@MSITStore:C:Program FilesMicrosoft Offi ceOFFICE111033VBAXL10.CHM::/html/xlproUsedRange1.htm#example)Specifics
Returns a Range (mk:@MSITStore:C:Program FilesMicrosoft Offi ceOFFICE111033VBAXL10.CHM::/html/xlobjRange1.htm) object that represents the used range on the specified worksheet. Read-only.
Example

This example selects the used range on Sheet1.
Worksheets("Sheet1").Activate
ActiveSheet.UsedRange.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

Thảo luận 228:

Bạn bỏ đoạn SpecialCells(2,23) thử xem
Tức chỉ còn:

[F6:F1000].Offset(, 28).Resize(, 3).ClearContentsSai hay thiếu chổ nào đó thì bạn cứ gia giãm Offset và Resize nhé
Chú ý:
Bạn viết .Resize(0,3) là sai à nha ---> bỏ luôn số 0

bỏ SpecialCells thì nó xoá sạch cả vùng đó sao?

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

Xin lỗi có lẽ do mình nói chưa rõ: Mình muốn từ cột F dịch sang phải 28 cột và xóa dữ liệu ở 2 cột 28 và 29 thì viết như thế nào ?
mình đoán chỉ xoá khi cột F có số liệu

nếu đoán đúng thì bạn dùng đoạn code này xem thế nào

Sub Macro2()
With [F6:F1000]
.SpecialCells(4).EntireRow.Hidden = True
.Offset(, 28).Resize(, 2).SpecialCells(12).ClearContents
.EntireRow.Hidden = False
End With
End Sub

Thảo luận 229:

Cám ơn bạn

Mình đang tạo thủ tục theo yêu cầu của bài này (http://www.giaiphapexcel.com/forum/showthread.php?t=17159)
hiện đã viết được sub tạm ưng ý nhưng muốn chuyển thanh UDF để tiện sử dụng nhưng không được.
Mong bạn có thể sửa dùm và sửa giúp mình thủ tục tại File đính kèm theo link dưới:

http://myfreefilehosting.com/f/f0fa46e729_0.01MB

Chân thành cám ơn.
Ai dà... file thì tải không được (báo lổi)... còn topic kia tôi có xem qua nhưng quả thật chưa hiểu gì lắm yêu cầu của bạn (có lẻ không phải chuyên ngành)
----> Nhờ các cao thủ khác giúp 1 tay với!

Thảo luận 230:

Tôi có một file (c:dulieudoanhso.xls) có trường Doanhso và trường Tenhang, và file (c:dulieu onghop.xls) có trường Tenhang,TongDT. tôi muốn tính tổng doanh số của từng mặt hàng bên file doanhso.xls rồi ghi giá trị sang file tổng hợp nhưng không muốn mở thủ công file doanhso.xls làm cách nào mong bạn và các chuyên gia Excel giúp đỡ.
Có file đính kèm!
SUMIF có thể bị lổi nếu tham chiếu nằm trên 1 Workbook khác và Workbook này đang đóng!
Giãi pháp: Dùng SUMPRODUCT

Thảo luận 231:

Cảm ơn các huynh ChanhTQ@ và Po_Pikachu nhiều!

Và làm ơn cho tôi hỏi thêm: Dữ liệu và công thức ở sheet1 được bảo vệ; thì các cells ở sheet2 sheet3 muốn bảo vệ thì không thực hiện được, có cách nào giải quyết xin chỉ dùm!

Chân thành.

Thảo luận 232:

Từ một cột có dữ liệu (cột làm điều kiện) tôi muốn dịch sang một số cột để xóa dữ liệu Tôi viết [F6:F1000].SpecialCells(2, 23).Offset(0, 28 , 0 , 3).ClearContents nhưng không được nên phải viết như sau:


[F6:F1000].SpecialCells(2, 23).Offset(0, 28).ClearContents
[F6:F1000].SpecialCells(2, 23).Offset(0, 29).ClearContents
[G6:G1000].SpecialCells(2, 23).Offset(0, 28).ClearContents
[G6:G1000].SpecialCells(2, 23).Offset(0, 26).ClearContents
[I6:I1000].SpecialCells(2, 23).Offset(0, 25).ClearContents
[I6:I1000].SpecialCells(2, 23).Offset(0, 24).ClearContents

Nhờ các bạn sửa giúp đoạn code này. Xin cảm ơn !

Thảo luận 233:

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-

Thảo luận 234:

Chắc có lẽ cách viết code có lỗi gì đó, Bạn xem giùm theo File đính kèm

http://myfreefilehosting.com/f/f0fa46e729_0.01MB
http://www.zshare.net/download/57363029ebed3e35/ (http://www.zshare.net/download/57363029ebed3e35/)

Thảo luận 235:

Yêu cấu công việc của mình như sau dùng VBA
- Mở một bản vẽ CAD có sẵn--> Scale xuỗng tỉ lệ a/b trong đó: a là kích thước của đoạng thẳng tùy chọn ghi trong bản vẽ (có thể đo). b là kích thước nhập từ bàn phím.
- Lần lượt đo kích thước một số đoạn thẳng ---> tự động đưa giá trị sang một file Exel.
Nhờ các cao nhân chỉ giáo giúp cho !$@!!
KHông có ai giúp mình được vấn đề này à? hicc các cao nhân đâu hết rồi????!!!

Thảo luận 236:

Sub MakeShortcut()
Dim WSH As Object
Dim WSHShortcut As Object
Dim strStationName As String
Dim strPath As String
Dim strDirectory As String
Dim strMsg As String
Set WSH = CreateObject("WScript.Shell")
strStationName = Sheet1.Range("B25").Value
strDirectory = "C:$Workbook Path$ " & strStationName & ".xls"
If strStationName = "" Then ' Checks to see if the user selected a name
MsgBox "You Must Choose a Station Name from the Drop Down Box"
Exit Sub
End If
If Not Len(Dir(strDirectory)) > 0 Then 'Checks to see if File Exists
MsgBox "The $Workbook Name$ for the Selected Station Name does not Exist. The Shortcut cannot be created. Please Ask Someone for Help."
Exit Sub
End If
strPath = WSH.SpecialFolders("Desktop") & "" & "$Workbook Name$ " & strStationName & ".lnk"
Set WSHShortcut = WSH.CreateShortcut(strPath)
With WSHShortcut
.TargetPath = "C:$Workbook Path$ " & strStationName & ".xls"
.Description = "$Workbook Name$ " & strStationName
.IconLocation = "C:Program FilesMicrosoft OfficeOFFICE11EXCEL.EXE,1"
.RelativePath = "C:$Workbook Path$"
.WorkingDirectory = "C:$Workbook Path$"
.Hotkey = ""
.Save
End With
strMsg = "Success! Look for the $Workbook Name$ " & strStationName & " Shortcut on your Desktop" & vbNewLine & _
"This Workbook will now Close. Thank You!"
MsgBox strMsg
ThisWorkbook.Close False
End Sub

Đoạn code trên dùng để tạo một shortcut cho file nhưng em làm không được vì thiếu cái Drop Down Box gì đó, các bác giúp em giải thích nó với, hoàn chỉnh cả chương trình được thì càng tốt

Thảo luận 237:

Các bác ơi em có đoạn code sau :

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à


Range("A" & i & ":E" & i ).Select

Thảo luận 238:

Tôi có một file (c:dulieudoanhso.xls) có trường Doanhso và trường Tenhang, và file (c:dulieu onghop.xls) có trường Tenhang,TongDT. tôi muốn tính tổng doanh số của từng mặt hàng bên file doanhso.xls rồi ghi giá trị sang file tổng hợp nhưng không muốn mở thủ công file doanhso.xls làm cách nào mong bạn và các chuyên gia Excel giúp đỡ.
Có file đính kèm!

Thảo luận 239:

đ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ì?

Thảo luận 240:

Bạn nhấn phải chuột vào tên Sheet -> chọn View Code -> Rồi nạp đoạn code dưới vào trang trắng hiện ra. Rồi bạn thử gõ Delete ở 1 ô nào đó trên cột H xem.

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
If Target.Column = 8 And Target = "Delete" Then
Target.EntireRow.ClearContents
End If
End Sub
Thân.

Thảo luận 241:

Nhờ các bạn chỉ giúp cách viết câu lệnh cho một biến quét nhiều vùng ?

Ví dụ: để biến j quét trong một vùng từ cột 5 đến cột 20 ta viết J = 5 to 20
Tôi muốn cùng một biến J quét 2 vùng từ cột 5 đến cột 10 và từ cột 15 đến cột 20 thì viết như thế nào ?

Xin cảm ơn!

Thảo luận 242:

Application.Volatile (False)


Dạ thưa các Anh, khi nào thì mình thêm câu lệnh trên??

Tks

Thảo luận 243:

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

Thảo luận 244:

Bạn có thể dùng code này để làm việc này. Và khỏi cần phải copy-paste gì hết.

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
Target.Offset(, 1) = Target
End If
End Sub
Code được đặt trong Sheet nào muốn có tính năng này.
Thân.

Thảo luận 245:

Tôi thường hay phải khai rất nhiều biến, ví dụ iMa01 as long, iMa02 as long,...,iMa99 as long.
Vậy có thể rút gọn khai biến = for i = 1 to 99 được không?
Xin cám ơn!

Điều này là không được bác ạ
Tên của 1 biến phải được định danh rõ ràng và xác định, không phụ thuộc vào 1 biến khác (Tức là không có chứa biến ở trong tên)

Thân!

Thảo luận 246:

Chào ThuNghi!
Vì ở đây mình không có quyền post with attachment file, nên bạn vào www.gocrỉeng.com/quangle (http://www.gocrỉeng.com/quangle) để xem nhé!

Bạn co thể mail thunghi0105@gmail.com. Không vào được link. Xin cám ơn.

Thảo luận 247:

Hi, không phải là xóa dữ liệu mà là xóa cả dòng đó đi luôn. Nhưng bác nhớ để lại dòng đầu tiên lại nhé!
Em nói vậy tất nhiên phải có ý chứ!
Bác này thật là!
Thân.

Thảo luận 248:

Cảm ơn ndu: ý mình hỏi là làm thế nào để từ hiện hành (vd đang ở sheet2) mà vẫn thực hiện được trên sheet khác không mở hoặc ẩn (vd sheet1 đang ẩn) mà ra được kết quả như đoạn code trên và đúng như bạn nhắc nhở: đang ở sheet2 tôi muốn xoá công thức ở sheet1 bằng cách dùng selection thì bị lỗi select.

Với đoạn code của bạn tôi chỉ sửa "=SUM(Sheet2!RC[-3]:RC[-1])" -> "=SUM(Sheet1!RC[-3]:RC[-1])" hoặc bỏ Sheet1! -> "=SUM(RC[-3]:RC[-1])" là OK.

Tôi thấy kiểu viết này code chạy cực nhanh (có thể gọi là siêu tốc), tôi đã thử với 10 cột và 65.536 dòng chỉ mất khoảng 0,4 giây.

Điểm mấu chốt ở đây chính là ta đã thực hiện đồng thời gán công thức vào tất cả các ô trong vùng chọn (thay vì dùng vòng lặp quét để gán công thức cho từng ô như vẫn thường làm).


Sub Macro1()
startTime = Timer
With Sheet1.Range("L3:L65536")
.Value = "=SUM(RC[-10]:RC[-1])"
.Value = .Value
End With
EndTime = Timer
MsgBox "Total Time: " & (EndTime - startTime)
End Sub

Thảo luận 249:

Cám ơn Po_Pikachu nhưng cái này không đúng với ý của mình rùi.
Nếu làm theo cái này thì cột B1 luôn luôn bằng cột A1. Ý của mình là sau khi đã paste những ô có giá trị tại cột B thì sẽ cố định luôn những ô đó và những ô này không bị ảnh hưởng bởi cột A nữa, chỉ những ô nào không có giá trị tại cột B thì mới bị ảnh hưởng bởi cột A thôi.
Nếu làm như của bác thì chỉ cần dùng công thức [B1]=A1 là xong. Bác sửa lại giúp nhé, thanks!
Tin khác :