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:
Em có đoạn code ntn.. và e muốn khi chạy đoạn mã này nó sẽ hiện ra 1 ô thông báo để mình chọn số đơn vị muốn làm tròn vd: 3;0;-3. Vì trong code này nó mặc định bằng 0 nên nhiều lúc phải chỉnh tay khá mất công.. e xin cảm ơn ạ.

Mã:
Public Sub ChenRound()
Dim Vung, Cll, Tam
Set Vung = Application.InputBox("Nhap vung muon chen ham ROUND", , , , , , , 8)
For Each Cll In Vung
Tam = Replace(Cll.Formula, "=", "")
Cll.Formula = "=ROUND(" & Tam & ",0)"
Next Cll
End Sub
 
Upvote 0
Em có đoạn code ntn.. và e muốn khi chạy đoạn mã này nó sẽ hiện ra 1 ô thông báo để mình chọn số đơn vị muốn làm tròn vd: 3;0;-3. Vì trong code này nó mặc định bằng 0 nên nhiều lúc phải chỉnh tay khá mất công.. e xin cảm ơn ạ.

Mã:
Public Sub ChenRound()
Dim Vung, Cll, Tam
Set Vung = Application.InputBox("Nhap vung muon chen ham ROUND", , , , , , , 8)
For Each Cll In Vung
Tam = Replace(Cll.Formula, "=", "")
Cll.Formula = "=ROUND(" & Tam & ",0)"
Next Cll
End Sub
Sửa thế này.
Mã:
Public Sub ChenRound()
    Dim Vung, Cll, Tam
    Dim iNum As Integer
   
    Set Vung = Application.InputBox("Nhap vung muon chen ham ROUND", , , , , , , 8)
    iNum = Application.InputBox("Nh" & ChrW(7853) & "p s" & ChrW(7889) & " làm tròn.", _
            "B" & ChrW(7841) & "n ph" & ChrW(7843) & "i nh" & ChrW(7853) & "p s" & ChrW(7889) & " nguyên.", , , , , , 1)
    For Each Cll In Vung
        Tam = Replace(Cll.Formula, "=", "")
        Cll.Formula = "=ROUND(" & Tam & "," & iNum & ")"
    Next Cll
End Sub
 
Upvote 0
Sửa thế này.
Mã:
Public Sub ChenRound()
    Dim Vung, Cll, Tam
    Dim iNum As Integer
  
    Set Vung = Application.InputBox("Nhap vung muon chen ham ROUND", , , , , , , 8)
    iNum = Application.InputBox("Nh" & ChrW(7853) & "p s" & ChrW(7889) & " làm tròn.", _
            "B" & ChrW(7841) & "n ph" & ChrW(7843) & "i nh" & ChrW(7853) & "p s" & ChrW(7889) & " nguyên.", , , , , , 1)
    For Each Cll In Vung
        Tam = Replace(Cll.Formula, "=", "")
        Cll.Formula = "=ROUND(" & Tam & "," & iNum & ")"
    Next Cll
End Sub
Dạ e cảm ơn a nhiều ạ.. trước e thay bằng i chứ k phải inum nên chạy chả được.. k rành VBA nó chán thế đấy @@
 
Upvote 0
Mọi người cho mình hỏi, ngoài cách dùng vòng lặp for, có cách nào để insert công thức cho nhiều ô trong không ạ?
ví dụ như vòng for như này. Thanks all
Dim i As Integer
For i = 1 To 50
Range("a" & i) = Range("b" & i) + Range("c" & i)
Next
 
Upvote 0
Mọi người cho mình hỏi, ngoài cách dùng vòng lặp for, có cách nào để insert công thức cho nhiều ô trong không ạ?
ví dụ như vòng for như này. Cảm ơn all
Dim i As Integer
For i = 1 To 50
Range("a" & i) = Range("b" & i) + Range("c" & i)
Next
Bạn tham khảo đoạn code dưới
Mã:
Sheet1.Range("A1:A50") = "=RC[1]+RC[2]"
 
Upvote 0
Bạn tham khảo đoạn code dưới
Mã:
Sheet1.Range("A1:A50") = "=RC[1]+RC[2]"
Thanks bác, em biết thêm 1 phương thức mới. cho em hỏi thêm là em muốn cell ở cột A chỉ insert lệnh khi cell cột B và C có giá trị thì phải làm như nào ạ, khi cell cột B hoặc C "" thì cell cột A cũng trống tương ứng.
 
Upvote 0
Bạn thử vầy:
Sub TinhTongKhongTrong()
Sheet1.Range("A2:A50") = "=IF(AND(RC[1]<>"""", RC[2]<>"""" ),RC[1]+RC[2],"""")"
End Sub
 
Upvote 0
Bạn thử vầy:
Sub TinhTongKhongTrong()
Sheet1.Range("A2:A50") = "=IF(AND(RC[1]<>"""", RC[2]<>"""" ),RC[1]+RC[2],"""")"
End Sub
Thanks bác, ý em muốn hỏi là nó trống luôn chứ k fai hiển thị trống ạ?
Có cách nào chuyển về dạng applitcation ko bác. Kiểu như code dưới này, nhưng em chưa làm nó chạy dc
If Target.Address = "$A$x" Then
Range("A" & x) = Range("B" & x) + Range("C" & x)
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bác, ý em muốn hỏi là nó trống luôn chứ k fai hiển thị trống ạ?
Có cách nào chuyển về dạng applitcation ko bác
Dạng applitcation là sao?
Ý muốn này chỉ có thể trở về cách For... Next
PHP:
For I = DòngĐầu To DòngCuối
    If Range("B" & I) + Range("C" & I) > 0 Then
        Range("A" & I) = "=RC[1]+RC[2]"
    End If
Next I
 
Upvote 0
Ý em là không muốn hiển thị công thức trong cell ý
Bài đã được tự động gộp:

Dạng applitcation là sao?
Ý muốn này chỉ có thể trở về cách For... Next
PHP:
For I = DòngĐầu To DòngCuối
    If Range("B" & I) + Range("C" & I) > 0 Then
        Range("A" & I) = "=RC[1]+RC[2]"
    End If
Next I
Ý em là không muốn hiển thị công thức trong cell ý
 
Lần chỉnh sửa cuối:
Upvote 0
Dạng applitcation là sao?
Ý muốn này chỉ có thể trở về cách For... Next
PHP:
For I = DòngĐầu To DòngCuối
    If Range("B" & I) + Range("C" & I) > 0 Then
        Range("A" & I) = "=RC[1]+RC[2]"
    End If
Next I
Em sửa như này sao lại lỗi ạ ?
For I = DòngĐầu To DòngCuối
If Range("B" & I) + Range("C" & I) > 0 Then
Range("A" & I) = range("B"& i ).value + range("C"& i ).value
End If
Next I
Bài đã được tự động gộp:

Vậy là bạn chỉ đọc và "hiểu" code chứ chưa thử?
Vậy là bạn chỉ đọc và "hiểu" code chứ chưa thử?
Em thử rồi, nhưng trong cell có giá trị thực tế vẫn là công thức, tất nhiên cách của bác đã gần đúng với mong muốn của em nhất, nhưng nếu k hiện công thức thì trông nó càng pro hơn :D.
 
Upvote 0
Em sửa như này sao lại lỗi ạ ?
For I = DòngĐầu To DòngCuối
If Range("B" & I) + Range("C" & I) > 0 Then
Range("A" & I) = range("B"& i ).value + range("C"& i ).value
End If
Next I
Bài đã được tự động gộp:



Em thử rồi, nhưng trong cell có giá trị thực tế vẫn là công thức, tất nhiên cách của bác đã gần đúng với mong muốn của em nhất, nhưng nếu k hiện công thức thì trông nó càng pro hơn :D.
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).Value = Range("B" & I).Value + Range("C" & I).Value
   End If
Next I
Tôi không hiểu được, "k", "pro" là gì.
 
Lần chỉnh sửa cuối:
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ì.
Đúng là kk thì chắc bác sẽ hiểu
Nhưng không hiểu mà bác vẫn làm?
 
Upvote 0
Đú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

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

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

Back
Top Bottom