Chuyên đề giải đáp những thắc mắc về code VBA (13 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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

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

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

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
Xin lỗi, chính xác là Cells(r, a).Value = 0 không chạy
"không chạy" tức là sao?
hỏi mà đưa chi tiết nhỏ giọt vậy ai trả lời nổi?

Đoán già đoán non (*):
Đây là 1 hàm. Người hỏi không hề cho biết hàm được dùng/gọi ở đâu và tham số được nạp vào là gì.
Dựa vào cái lệnh Application.ThisCell thì đoán mò là hàm UDF, được áp dụng vào một cell hay range (hàm mảng) nào đó trên sheet.
Mà luật của hàm UDF thì đương nhiên là không cho sửa bảng tính rồi.

(*) bản thân tôi không thích đoán mò. Tôi chỉ cốt ý giải thích cho bạn ở bài #1591 thôi
 
Upvote 0
"không chạy" tức là sao?
hỏi mà đưa chi tiết nhỏ giọt vậy ai trả lời nổi?

Đoán già đoán non (*):
Đây là 1 hàm. Người hỏi không hề cho biết hàm được dùng/gọi ở đâu và tham số được nạp vào là gì.
Dựa vào cái lệnh Application.ThisCell thì đoán mò là hàm UDF, được áp dụng vào một cell hay range (hàm mảng) nào đó trên sheet.
Mà luật của hàm UDF thì đương nhiên là không cho sửa bảng tính rồi.

(*) bản thân tôi không thích đoán mò. Tôi chỉ cốt ý giải thích cho bạn ở bài #1591 thôi
Cám ơn bạn.
Mình có 1 bài như file đính kèm, thử đoạn code trên nhưng chưa được, bạn có thể giúp đỡ đc ko?
 

File đính kèm

Upvote 0
Có hai kiểu nói chuyện mà tôi từ chối, thứ nhất là dùng tiếng Tây và thứ hai là dùng ngôn ngữ tét - viết tắt tùm lum.
 
Upvote 0
Web KT

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

Back
Top Bottom