Chuyên đề giải đáp những thắc mắc về code VBA

Liên hệ QC

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Đúng là kk thì chắc bác sẽ hiểu
Nhưng không hiểu mà bác vẫn làm?
Tiếng lóng và tiếng Tây bồi nó rắc rối lắm. Không hiểu tức là không hiểu người ta móc mình hay còn ẩn ý gì khác.
Nhất là khi gặp tiếng Tây bồi. Có những trường hợp hiểu theo đúng ngữ cảnh tiếng Tây thì nó là nói móc, mà mình thì không biết là người dùng cố tình hay do dốt tiếng Tây.

Chú: Từ kk, kaka, là cách nói trại của caca tiếng Pháp thời tôi còn nhỏ, và có nghĩa là chửi tục.
 
Upvote 0
Bạn phải gán DòngĐầu = bao nhiêu, Dòng Cuối = bao nhiêu chứ. Ví dụ For I=10 to 30
Tôi chỉ là gợi ý thôi chứ bạn bê nguyên xi thì ai biết DòngĐầu là cái quái gì.
Muốn dọn sạch cột A trước khi chạy code thì bạn thêm dòng lệnh này trước vòng For
PHP:
Range("A" & DongDau & ":A" & DongCuoi).Clearcontents   'Them dong nay'
For I = DongDau To DongCuoi
   If Range("B" & I) + Range("C" & I) > 0 Then
      Range("A" & I) = "=RC[1]+RC[2]"
   End If
Next I
Tôi không hiểu được, "k", "pro" là gì.
Em nhầm, em có thay dòng đầu và dòng cuối rồi, nhưng em lại add code vào worksheet_change nên nó báo lỗi.
Còn em có viết KK gì đâu nhỉ, hay em viết ": D" nó lại hiện là kK. còn pro thì tất nhiên là trông nó chuyên nghiệp rồi.
Sau khi kết hợp ideal của mọi người thì em cũng hoàn thành được mòng muốn của mình với cái code này. Thanks all
For i = 1 To 50
Application.EnableEvents = False
If Range("B" & i) + Range("C" & i) <> 0 Then
Range("A" & i) = Range("B" & i).Value + Range("C" & i).Value
End If
Next i
Application.EnableEvents = True
 

File đính kèm

  • Untitled.png
    Untitled.png
    25.1 KB · Đọc: 2
Upvote 0
Em chào anh chị ạ. Em có thực hiện file VBA bằng cách Record Marco, khi chạy file báo lỗi đoạn code lệnh Privot Table.
Anh chị coi giúp em với ạ. Em cảm ơn anh chị ạ
ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
"So sanh chi tiet!R2C1:R1471C28", Version:=xlPivotTableVersion14). _
CreatePivotTable TableDestination:="So sanh tong hop!R1:R1048576", TableName _
:="PivotTable2", DefaultVersion:=xlPivotTableVersion14
 
Upvote 0
File dưới e tham khảo của một pro trong forum về cách tạo ngẫu nhiên dữ liệu số ngẫu nhiên không trùng, em thêm được đoạn mã chạy tự động sau mỗi 10s, nhưng mục đích của em cuối cùng là: cứ sau 10s, Sub tự động chạy cho đến khi H1 đến J1 hiển thị giá trị "true" thì dừng lại 30s, nhờ các pro giúp e với ạ!

Sub Test() Range("A1:A30").Value = UniqueRandomNum(1, 1000, 30) alertTime = Now + TimeValue("00:00:10") Application.OnTime alertTime, "Test" End Sub Function UniqueRandomNum(Bottom As Long, Top As Long, Amount As Long) 'Application.Volatile '<--- Neu muon gia tri thay doi khi bam F9 On Error Resume Next If Amount > Top - Bottom + 1 Then Amount = Top - Bottom + 1 With CreateObject("Scripting.Dictionary") Do .Add Int(Rnd() * (Top - Bottom + 1)) + Bottom, "" Loop Until .Count = Amount UniqueRandomNum = WorksheetFunction.Transpose(.Keys) End With End Function
 

File đính kèm

  • GetUniqueRandNum.xls
    41 KB · Đọc: 7
Lần chỉnh sửa cuối:
Upvote 0
File dưới e tham khảo của một pro trong forum về cách tạo ngẫu nhiên dữ liệu số ngẫu nhiên không trùng, em thêm được đoạn mã chạy tự động sau mỗi 10s, nhưng mục đích của em cuối cùng là: cứ sau 10s, Sub tự động chạy cho đến khi H1 đến J1 hiển thị giá trị "true" thì dừng lại 30s, nhờ các pro giúp e với ạ!

Sub Test() Range("A1:A30").Value = UniqueRandomNum(1, 1000, 30) alertTime = Now + TimeValue("00:00:10") Application.OnTime alertTime, "Test" End Sub Function UniqueRandomNum(Bottom As Long, Top As Long, Amount As Long) 'Application.Volatile '<--- Neu muon gia tri thay doi khi bam F9 On Error Resume Next If Amount > Top - Bottom + 1 Then Amount = Top - Bottom + 1 With CreateObject("Scripting.Dictionary") Do .Add Int(Rnd() * (Top - Bottom + 1)) + Bottom, "" Loop Until .Count = Amount UniqueRandomNum = WorksheetFunction.Transpose(.Keys) End With End Function
Chạy đến khi nào thì thôi?
 
Upvote 0
Dạ, chạy mãi mãi ạ, kiểu như chỉ tạm dừng 30s khi các ô từ H1 đến J1 có xuất hiện "true" ạ
Sửa lại 1 tí cho nhanh.
Bạn có thể sửa lại giá trị của tm = bao nhiêu thì tùy.
Cái này nếu thích dừng có thể nhấn phím Esc

Mã:
#If VBA7 Then
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal Milliseconds As LongPtr)
#Else
Public Declare Sub Sleep Lib "kernel32" (ByVal Milliseconds As Long)
#End If


Sub Test()
Dim tm

Range("A1:A30").Value = UniqueRandomNum(1, 1000, 30)
tm = 100
If Range("H1") = True Then
    If Range("I1") = True Then
        If Range("J1") = True Then
            tm = 300
        End If
    End If
End If
Sleep (tm)
Test

'alertTime = Now + TimeValue("00:00:10")
'Application.OnTime alertTime, "Test"

End Sub
Function UniqueRandomNum(Bottom As Long, Top As Long, Amount As Long)
  'Application.Volatile '<--- Neu muon gia tri thay doi khi bam F9
  On Error Resume Next
  If Amount > Top - Bottom + 1 Then Amount = Top - Bottom + 1
  With CreateObject("Scripting.Dictionary")
    Do
      .Add Int(Rnd() * (Top - Bottom + 1)) + Bottom, ""
    Loop Until .Count = Amount
    UniqueRandomNum = WorksheetFunction.Transpose(.Keys)
  End With
End Function
 
Upvote 0
Sửa lại 1 tí cho nhanh.
Bạn có thể sửa lại giá trị của tm = bao nhiêu thì tùy.
Cái này nếu thích dừng có thể nhấn phím Esc

Mã:
#If VBA7 Then
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal Milliseconds As LongPtr)
#Else
Public Declare Sub Sleep Lib "kernel32" (ByVal Milliseconds As Long)
#End If


Sub Test()
Dim tm

Range("A1:A30").Value = UniqueRandomNum(1, 1000, 30)
tm = 100
If Range("H1") = True Then
    If Range("I1") = True Then
        If Range("J1") = True Then
            tm = 300
        End If
    End If
End If
Sleep (tm)
Test

'alertTime = Now + TimeValue("00:00:10")
'Application.OnTime alertTime, "Test"

End Sub
Function UniqueRandomNum(Bottom As Long, Top As Long, Amount As Long)
  'Application.Volatile '<--- Neu muon gia tri thay doi khi bam F9
  On Error Resume Next
  If Amount > Top - Bottom + 1 Then Amount = Top - Bottom + 1
  With CreateObject("Scripting.Dictionary")
    Do
      .Add Int(Rnd() * (Top - Bottom + 1)) + Bottom, ""
    Loop Until .Count = Amount
    UniqueRandomNum = WorksheetFunction.Transpose(.Keys)
  End With
End Function
Em cảm ơn nhiều ạ, nhưng khi em ấn vào nút button click thì chỉ chay liện tục mà không dừng lại khi H1 hiện true a ạ, còn không bấm vào button thì không thấy tự động chọn ngẫu nhiên tập số sau 10s ạ,
Nếu không được thì em muốn nó chạy đến khi ô H1 xuất hiện giá trị true thì dừng hẳn, a giúp e với ạ!
 
Lần chỉnh sửa cuối:
Upvote 0
Em cảm ơn nhiều ạ, nhưng khi em ấn vào nút button click thì chỉ chay liện tục mà không dừng lại khi H1 hiện true a ạ, còn không bấm vào button thì không thấy tự động chọn ngẫu nhiên tập số sau 10s ạ
Bạn bấm vào thì nó mới chạy. Ít nhất phải bấm 1 lần.
Theo yêu cầu màu xanh của bài trước, khi H1=true & I1=true & J1=true thì sẽ dừng lâu hơn.
Có phải ý của bạn như phần chữ xanh?
File dưới e tham khảo của một pro trong forum về cách tạo ngẫu nhiên dữ liệu số ngẫu nhiên không trùng, em thêm được đoạn mã chạy tự động sau mỗi 10s, nhưng mục đích của em cuối cùng là: cứ sau 10s, Sub tự động chạy cho đến khi H1 đến J1 hiển thị giá trị "true" thì dừng lại 30s, nhờ các pro giúp e với ạ!
Bài đã được tự động gộp:

Nếu không được thì em muốn nó chạy đến khi ô H1 xuất hiện giá trị true thì dừng hẳn, a giúp e với ạ!

Mã:
If Range("H1") = True Then
Nếu vậy bạn tìm dòng bên trên.
Chèn thêm phía dưới dòng lệnh dưới đây
Mã:
Exit Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn bấm vào thì nó mới chạy. Ít nhất phải bấm 1 lần.
Theo yêu cầu màu xanh của bài trước, khi H1=true & I1=true & J1=true thì sẽ dừng lâu hơn.
Có phải ý của bạn như phần chữ xanh?
Dạ, chỉ cần bất cứ 1 ô nào trong 3 ô H1,I1, J1 hiển thị giá trị true thì dừng lâu hơn 30s, em thay thế bằng OR được rồi ạ

Nếu vậy bạn tìm dòng bên trên.
Chèn thêm phía dưới dòng lệnh dưới đây
Dạ em cảm ơn, em làm được rồi ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Sub mo_file()
Workbooks.Open Filename:=Range("F9"), Password:=Range("G9")
End Sub
chào anh chị em trong diễn đàn GPE
các anh chị cho mình hỏi là trong đoạn code dưới đây thì sửa làm sao để nó tự nhập mật khẩu ở ô G9 ạ?
 
Upvote 0
Các bác có thể cho em đoạn code lưu 1 vùng chọn trong exel thành 1 sheet mới trong 1 trang tính khác được không ạ. Em mấy hôm tìm mãi mà không thấy. :'(
 
Upvote 0
Các Bạn cho mình hỏi chút
Có cách nào chỉ cho nhập vào TextBox1 thủ công giá trị tương đương với địa chỉ ô trên bảng tính bất kỳ không ??

1/ Giá trị trong TextBox1 là địa chỉ ô bất kỳ trên bảng tính, do mình nhập thủ công
2/ Nếu nhập vào TextBox1 sai so với địa chỉ ô bất kỳ trên bảng tính báo lỗi hay Xóa
3/ Viết code check cái giá trị nhập thủ công trên TextBox1
================
VD nhập Sai: 11, aaa, mmm
VD nhập đúng: A1 To A1048576, hay B1 to B1048576 ...

Code kiểu như sau mà mình chưa hình dung ra cách viết và xử lý lỗi
Mã:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Rem chi cho nhap vào TextBox1 giá tri tuong duong dia chi Cells tren Sheet
    If TextBox1.Value <> Range("????") Then
        TextBox1.Value = Empty
    Else
        Exit Sub
    End If
End Sub

Rất mong sự trợ giúp
xin cảm ơn
 

File đính kèm

  • Book1.xlsb
    13.7 KB · Đọc: 5
Upvote 0
Có 1 cách là bạn tách chữ và số: comboBox cho chữ, textbox cho số. Khi đó bạn có thể đưa danh sách các ký tự cột của bảng tính Exce làm Row Source cho comboBoxl, Textbox thì số thì không lớn hơn 1.048.576
 
Upvote 0
Các Bạn cho mình hỏi chút
Có cách nào chỉ cho nhập vào TextBox1 thủ công giá trị tương đương với địa chỉ ô trên bảng tính bất kỳ không ??

1/ Giá trị trong TextBox1 là địa chỉ ô bất kỳ trên bảng tính, do mình nhập thủ công
2/ Nếu nhập vào TextBox1 sai so với địa chỉ ô bất kỳ trên bảng tính báo lỗi hay Xóa
3/ Viết code check cái giá trị nhập thủ công trên TextBox1
================
VD nhập Sai: 11, aaa, mmm
VD nhập đúng: A1 To A1048576, hay B1 to B1048576 ...

Code kiểu như sau mà mình chưa hình dung ra cách viết và xử lý lỗi
Mã:
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Rem chi cho nhap vào TextBox1 giá tri tuong duong dia chi Cells tren Sheet
    If TextBox1.Value <> Range("????") Then
        TextBox1.Value = Empty
    Else
        Exit Sub
    End If
End Sub

Rất mong sự trợ giúp
xin cảm ơn
Ví dụ
Mã:
On Error Resume Next
a = TypeName(Range(TextBox1.Value))
If Err > 1 Then 'Lổi
  '...
  On Error GoTo 0
End If
 
Upvote 0
Upvote 0
Các Bạn cho mình hỏi chút
Có cách nào chỉ cho nhập vào TextBox1 thủ công giá trị tương đương với địa chỉ ô trên bảng tính bất kỳ không ??
Đưa vào sự kiện BeforeUpdate. Dùng sự kiện KeyDown thì vừa nhấn phím ký tự đầu tiên đã bị chửi. sự kiện BeforeUpdate còn có tham số Cancel cho phép buộc ở lại để sửa nếu sai
PHP:
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    On Error GoTo Loi
    Set Rng = ActiveSheet.Range(TextBox1.Value)
    Set Rng = Nothing: Exit Sub
Loi:
    MsgBox "Do chet tiet! Không phai dia chi o."
    Cancel = True
    Exit Sub
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Đưa vào sự kiện BeforeUpdate. Dùng sự kiện KeyDown thì vừa nhấn phím ký tự đầu tiên đã bị chửi. sự kiện BeforeUpdate còn có tham số Cancel cho phép buộc ở lại để sửa nếu sai
PHP:
Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    On Error GoTo Loi
    Set Rng = ActiveSheet.Range(TextBox1.Value)
    Set Rng = Nothing: Exit Sub
Loi:
    MsgBox "Do chet tiet! Không phai dia chi o."
    Cancel = True
    Exit Sub
End Sub
Em mới thử xong kiểu gì nó củng IM RE hết

1592113848291.png
 
Upvote 0
Web KT
Back
Top Bottom