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:
Tuyệt cú mèo, yêu thế cơ chứ! Cảm ơn Chị nhé!
 
Upvote 0
Dạ chào các anh chị
Em mới tìm hiểu lập trình VBA, khi chạy đoạn code này nó báo lỗi. Em không biết lỗi thế nào, anh chị giúp em với
1540107708615.png
 
Upvote 0
Nhờ mọi người giúp đỡ, bổ sung thêm tính năng cho các lệnh có sắn trong excell
Em có gửi file và đoạn record macro ghi lại tính năng lọc sẵn có của excell.
Mặc định của excell cho phép lọc với 2 điều kiện (ở đây là không bắt đầu với "Quyet dinh" và không bắt đầu với "Hop dong")
Giờ em muốn bổ sung thành 3 điều kiện (thêm không bắt đầu với "To trinh") thì phải làm sao ạ?
Mã:
Sub Loc3Lan()
'' Loc3Lan Macro

    ActiveSheet.Range("$A$6:$H$13").AutoFilter Field:=8, Criteria1:= _
        "<>Quyet dinh*", Operator:=xlAnd, Criteria2:="<>Hop dong*"
End Sub

Thank and best regards.
 

File đính kèm

  • mau02.xlsm
    29.4 KB · Đọc: 2
Upvote 0
Nhờ các cao thủ giúp mình vụ này với.

Mình copy được đoạn VBA dưới đây, để copy tự động sheet đầu tiên của các file được chọn. (Mình sử dụng để tổng hợp dữ liệu từ các file dữ liệu của nhiều đơn vị khi làm báo cáo)

Tuy nhiên, sheet đầu tiên của các file được chọn có công thức link số liệu sang các sheet khác hoặc các file khác (và ko hiển thị đúng số liệu), mình muốn thêm chức năng Break link hoặc chỉ copy Value của các sheet đó. Nhờ mọi người sửa giúp. Cám ơn mọi người rất nhiều


Sub GopFileExcel()
Dim FilesToOpen
Dim x As Integer
Dim wb As Workbook

On Error GoTo ErrHandler
Application.ScreenUpdating = False

FilesToOpen = Application.GetOpenFilename _
(FileFilter:="Microsoft Excel Files (*.xlsx), *.xlsx", MultiSelect:=True, Title:="Files to Merge")

If TypeName(FilesToOpen) = "Boolean" Then
MsgBox "No Files were selected"
GoTo ExitHandler
End If

x = 1
While x <= UBound(FilesToOpen)
Set wb = Workbooks.Open(Filename:=FilesToOpen(x))

If x = 1 Then
wb.Sheets(1).UsedRange.Copy ThisWorkbook.Sheets(1).Range("A1")
Else
lr = ThisWorkbook.Sheets(1).UsedRange.Rows.Count
wb.Sheets(1).UsedRange.Offset(1).Copy ThisWorkbook.Sheets(1).Range("A" & lr + 1)
End If

wb.Close False
x = x + 1
Wend

ExitHandler:
Application.ScreenUpdating = True
Set wb = Nothing
Exit Sub

ErrHandler:
MsgBox Err.Description
Resume ExitHandler
End Sub
 
Upvote 0
Các anh chị cho em hỏi chút.
Em có đoạn code dưới để xoá các sheet ẩn. Nhưng dòng code While không chạy được.Em nhờ các anh chị sửa giúp em được không ạ

Sub deletehidden()
Dim a As Integer
a = 1
While a <= worksheets=\"\" count=\"\" span=\"\">
If Not Worksheets(a).Visible Then
Worksheets(a).Delete
Else
a = a + 1
End If
Wend
End Sub
 
Upvote 0
Các anh chị cho em hỏi chút.
Em có đoạn code dưới để xoá các sheet ẩn. Nhưng dòng code While không chạy được.Em nhờ các anh chị sửa giúp em được không ạ

Sub deletehidden()
Dim a As Integer
a = 1
While a <= worksheets=\"\" count=\"\" span=\"\">
If Not Worksheets(a).Visible Then
Worksheets(a).Delete
Else
a = a + 1
End If
Wend
End Sub
Cho những cái gì là công thức, là code vào chỗ này này.

1540655470539.png
-------
Code trên kia copy ở đâu mà ra nông nỗi thế?

PHP:
While a<= Thisworkbook.worksheets.count
 
Upvote 0
...
Code trên kia copy ở đâu mà ra nông nỗi thế?

PHP:
While a<= Thisworkbook.worksheets.count
Chắc cóp trên mạng nào đó.
Code While-Wend là cũ lắm rồi. Khoảng đời VBA mới vừa được cho thẳng vào Excel 97. (Trước đó Excel 5 thì phải lắp thêm VBA mới có mà xài.)

Chú: trước đây tôi cũng hay dùng While-Wend, và đó là thói quen cũ từ thời thượng.
 
Upvote 0
Code đó xưa rồi. Mà cũng không đúng nguyên tắc.
Nguyên tắc delete phần tử của collection là phải dò theo chỉ số ngược (từ lớn đến nhỏ)

For i = WorkSheets.Count To 1 Step -1
' xét WorkSheets(i) và delete nếu cần
Next i
 
Upvote 0
e cần chép data từ file source sang file collect. cột F của file source có giá trị bao nhiêu thì data sẽ đưa vào sheet tương ứng trong file collect
- có nút nhấn để chọn file source
- dữ liệu trong file collect được chép thêm vào chứ không bị đè lên

cảm ơn anh chị trước
 

File đính kèm

  • collect.xlsx
    9.7 KB · Đọc: 3
  • source.xlsx
    86.6 KB · Đọc: 3
Upvote 0
Mình đang gặp vấn đề về việc checkbox trên excel (thực thi bằng code vba).
Hiện tại, khi mình click vào checkbox nó sẽ chạy một condition (mình record macros và chép vào vba ok),
Private Sub CheckBox1_Click()
If CheckBox1.Value = True Then Range("D5").Select
ActiveWindow.SmallScroll Down:=33
Range("D5:AF49").Select
Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=IF(WEEKDAY(D$5)=1,TRUE,FALSE)"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 5296274
.TintAndShade = 0
End With

If CheckBox1.Value = False Is Nothing Then
End If
End Sub
Bây giờ nếu mình bỏ tick checkbox, mình muốn nó clear các condition trong phần vùng mình chỉ định đó thì viết code như thế nào.
Và không bị lặp lại các condition khi tick và bỏ tick nhiều lần.
DO mình tự tìm hiểu và mò nên có gì mấy bạn hướng dẫn giúp
THanks.
 
Upvote 0
Nhờ mọi người giúp đỡ bài này
Ô C9 là tổng của các ô từ D9 đến I9. Nếu 1 ô hàng 7 có giá trị là X và ô dưới nó hàng 8 có giá trị là 1 thì các ô hàng 9 từ cột đó về trước sẽ là 0, ví dụ ô G7=X và G8 =1 thì các ô từ D9 đến G9 sẽ bằng 0. Mình có đoạn code thế này mà chưa được, tại ô C9 sẽ gõ =SumByRow(D7:I7,9).
Function SumByRow(xlrange As range, r As Integer)
If xlrange Is Nothing Then
Set xlrange = Application.ThisCell
End If
With ActiveSheet
Dim ws As Worksheet
Dim lastColumn As Integer
Set ws = ActiveSheet

Dim i As Integer
Dim iCol As Integer
Dim a As Integer
iCol = ActiveCell.Column + 1
i = xlrange.Find("X").Column
'find last column of row
lastColumn = ws.Cells(r, ws.Columns.Count).End(xlToLeft).Column
For a = iCol To i
Cells(r, a).Value = 0
Next
SumByRow = WorksheetFunction.Sum(range(Cells(r, iCol), Cells(r, lastColumn))
End With
End Function

1541649109174.png
 

File đính kèm

  • Book1.xlsx
    10 KB · Đọc: 5
Upvote 0
Nhờ mọi người giúp đỡ bài này
Ô C9 là tổng của các ô từ D9 đến I9. Nếu 1 ô hàng 7 có giá trị là X và ô dưới nó hàng 8 có giá trị là 1 thì các ô hàng 9 từ cột đó về trước sẽ là 0, ví dụ ô G7=X và G8 =1 thì các ô từ D9 đến G9 sẽ bằng 0. Mình có đoạn code thế này mà chưa được, tại ô C9 sẽ gõ =SumByRow(D7:I7,9).
Function SumByRow(xlrange As range, r As Integer)
If xlrange Is Nothing Then
Set xlrange = Application.ThisCell
End If
With ActiveSheet
Dim ws As Worksheet
Dim lastColumn As Integer
Set ws = ActiveSheet

Dim i As Integer
Dim iCol As Integer
Dim a As Integer
iCol = ActiveCell.Column + 1
i = xlrange.Find("X").Column
'find last column of row
lastColumn = ws.Cells(r, ws.Columns.Count).End(xlToLeft).Column
For a = iCol To i
Cells(r, a).Value = 0
Next
SumByRow = WorksheetFunction.Sum(range(Cells(r, iCol), Cells(r, lastColumn))
End With
End Function

View attachment 207255
C9=SUM(OFFSET(D9,,IFERROR(LOOKUP(2,1/(D7:I7="X")/(D8:I8=1),ROW(1:6)),0)):I9)
 
Upvote 0
C9=SUM(OFFSET(D9,,IFERROR(LOOKUP(2,1/(D7:I7="X")/(D8:I8=1),ROW(1:6)),0)):I9)
Bạn cho hỏi sao hàm For dưới đây không hoạt động, không set giá trị các cell bằng 0 được?
Function SumByRow(xlrange As Range, r As Integer)
If xlrange Is Nothing Then
Set xlrange = Application.ThisCell
End If
With ActiveSheet
Dim ws As Worksheet
Dim lastColumn As Integer
Set ws = ActiveSheet

Dim i As Integer
Dim iCol As Integer
Dim a As Integer
iCol = ActiveCell.Column + 1
i = xlrange.Find("M").Column
'find last column of row
lastColumn = ws.Cells(r, ws.Columns.Count).End(xlToLeft).Column

For a = iCol To i
Cells(r, a).Value = 0
Next a

SumByRow = WorksheetFunction.Sum(Range(Cells(r, iCol), Cells(r, lastColumn)))
End With
End Function
 
Upvote 0
Web KT
Back
Top Bottom