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:
Liệu có code như này không anh chị
Find("<>1", LookIn:=xlValues, LookAt:=xlWhole)
Em điền thì không thấy có tác dụng gì cả. Em muốn tìm giá trị khác 1
 
Upvote 0
Mọi Người Giúp Mình với:
Mình mới tìm hiểu VBA cho excel. Mình viết 1 hàm đơn giản tính đơn giá cước VC như này:

Mã:
Public Function Don_gia(culi) As Double
' tính don giá cuoc Van chuyen Bê tông
bang_gia = Sheets(1).Ranges("E56:E65")
If culi <= 2 Then
Don_gia = Application.Index(bang_gia, 1)
Exit Function
ElseIf culi <= 5 Then
    Don_gia = Application.Index(bang_gia, 2)
    Exit Function
    ElseIf culi >= 41 Then
        Don_gia = Application.Index(bang_gia, 10)
        Exit Function
        Else: Don_gia = Application.Index(bang_gia, Application.RoundUp(culi / 5, 0))
End If

End Function
Ban đầu save nó yêu cầu save vào file Macro Enable lưu ngon lành ko báo lỗi gì, nhưng khi dùng thì kết quả toàn là #name .... giúp Mình Với.
 
Upvote 0
Mọi Người Giúp Mình với:
Mình mới tìm hiểu VBA cho excel. Mình viết 1 hàm đơn giản tính đơn giá cước VC như này:

Mã:
Public Function Don_gia(culi) As Double
' tính don giá cuoc Van chuyen Bê tông
bang_gia = Sheets(1).Ranges("E56:E65")
If culi <= 2 Then
Don_gia = Application.Index(bang_gia, 1)
Exit Function
ElseIf culi <= 5 Then
    Don_gia = Application.Index(bang_gia, 2)
    Exit Function
    ElseIf culi >= 41 Then
        Don_gia = Application.Index(bang_gia, 10)
        Exit Function
        Else: Don_gia = Application.Index(bang_gia, Application.RoundUp(culi / 5, 0))
End If

End Function
Ban đầu save nó yêu cầu save vào file Macro Enable lưu ngon lành ko báo lỗi gì, nhưng khi dùng thì kết quả toàn là #name .... giúp Mình Với.
Gởi file và giải thích yêu cầu bạn muốn làm gì mới biết được.
 
Upvote 0
Mọi Người Giúp Mình với:
Mình mới tìm hiểu VBA cho excel. Mình viết 1 hàm đơn giản tính đơn giá cước VC như này:

Mã:
Public Function Don_gia(culi) As Double
' tính don giá cuoc Van chuyen Bê tông
bang_gia = Sheets(1).Ranges("E56:E65")
If culi <= 2 Then
Don_gia = Application.Index(bang_gia, 1)
Exit Function
ElseIf culi <= 5 Then
    Don_gia = Application.Index(bang_gia, 2)
    Exit Function
    ElseIf culi >= 41 Then
        Don_gia = Application.Index(bang_gia, 10)
        Exit Function
        Else: Don_gia = Application.Index(bang_gia, Application.RoundUp(culi / 5, 0))
End If

End Function
Ban đầu save nó yêu cầu save vào file Macro Enable lưu ngon lành ko báo lỗi gì, nhưng khi dùng thì kết quả toàn là #name .... giúp Mình Với.
Bạn lưu file với tên và phần mở rộng là gì? Mở file để nhập công thức với tên và phần mở rộng là gì?
 
Upvote 0
Gởi file và giải thích yêu cầu bạn muốn làm gì mới biết được.
MÌnh muốn viết Hàm tính đơn giá cước vận chuyển biến là cự li vận chuyển, Bảng giá là Vùng dữ liệu trong bảng tính có đơn giá cho từng cự li.
Mọi người check code giúp mình xem code đúng không và sao kết quả là lỗi #name nhỉ ?
 
Upvote 0
Đây file đây ak. Giúp em nhé !
Do trùng tên module, ngoài ra còn bị lổi range
Mã:
Public Function Don_gia1(culi) As Double
' tính don giá cuoc Van chuyen Bê tông
  Dim Bang_Gia As Range
  Set Bang_Gia = Sheets(1).Range("E56:E65")
  If culi <= 2 Then
      Don_gia1 = Application.Index(Bang_Gia, 1)
    ElseIf culi <= 5 Then
      Don_gia1 = Application.Index(Bang_Gia, 2)
    ElseIf culi >= 41 Then
      Don_gia1 = Application.Index(Bang_Gia, 10)
    Else
      Don_gia1 = Application.Index(Bang_Gia, Application.RoundUp(culi / 5, 0) + 1)
  End If
End Function
 
Upvote 0
Đây file đây ak. Giúp em nhé !
Sửa tên Module cho khác với tên Function.
Cho vào mảng gọn hơn.
PHP:
Public Function Don_gia(Culy As Double) As Double
' tính don giá cuoc Van chuyen Bê tông
Dim Bang_gia()
Bang_gia = Sheets("Gia_cuoc").Range("E56:E65").Value
If Culy <= 2 Then
    Don_gia = Bang_gia(1, 1)
ElseIf Culy >= 41 Then
    Don_gia = Bang_gia(10, 1)
Else
    Don_gia = Bang_gia(Application.WorksheetFunction.RoundUp(Culy / 5, 0) + 1, 1)
End If
End Function
 

File đính kèm

  • VD.xlsm
    78.2 KB · Đọc: 9
Upvote 0
Sửa tên Module cho khác với tên Function.
Cho vào mảng gọn hơn.
PHP:
Public Function Don_gia(Culy As Double) As Double
' tính don giá cuoc Van chuyen Bê tông
Dim Bang_gia()
Bang_gia = Sheets("Gia_cuoc").Range("E56:E65").Value
If Culy <= 2 Then
    Don_gia = Bang_gia(1, 1)
ElseIf Culy >= 41 Then
    Don_gia = Bang_gia(10, 1)
Else
    Don_gia = Bang_gia(Application.WorksheetFunction.RoundUp(Culy / 5, 0) + 1, 1)
End If
End Function
File của anh vẫn báo lỗi #NAME?
 
Upvote 0
Sửa tên Module cho khác với tên Function.
Cho vào mảng gọn hơn.
PHP:
Public Function Don_gia(Culy As Double) As Double
' tính don giá cuoc Van chuyen Bê tông
Dim Bang_gia()
Bang_gia = Sheets("Gia_cuoc").Range("E56:E65").Value
If Culy <= 2 Then
    Don_gia = Bang_gia(1, 1)
ElseIf Culy >= 41 Then
    Don_gia = Bang_gia(10, 1)
Else
    Don_gia = Bang_gia(Application.WorksheetFunction.RoundUp(Culy / 5, 0) + 1, 1)
End If
End Function

Cảm ơn Bác nhiều nhé !
 
Upvote 0
2
Do trùng tên module, ngoài ra còn bị lổi range
Mã:
Public Function Don_gia1(culi) As Double
' tính don giá cuoc Van chuyen Bê tông
  Dim Bang_Gia As Range
  Set Bang_Gia = Sheets(1).Range("E56:E65")
  If culi <= 2 Then
      Don_gia1 = Application.Index(Bang_Gia, 1)
    ElseIf culi <= 5 Then
      Don_gia1 = Application.Index(Bang_Gia, 2)
    ElseIf culi >= 41 Then
      Don_gia1 = Application.Index(Bang_Gia, 10)
    Else
      Don_gia1 = Application.Index(Bang_Gia, Application.RoundUp(culi / 5, 0) + 1)
  End If
End Function

Bạn chỉ tham chiếu vào 1 ô của 1 range. Nếu dùng 1 biến tính ra ô này thì code dễ hiểu hơn

If culi <= 2 Then
oThamChieu = 1
ElseIf ....
...
End If
Don_gia1 = Sheets(1).Range("E56:E65").Cells(oThamChieu, 1).Value

Lưu ý là dùng cells sẽ tự động vượt ra khỏi range nếu oThamChieu > 10 (tức là khi trị culi > 50)
Nếu bạn muốn nó trả về lỗi khi vượt range thì dùng hàm index
Don_gia1 = Application.Index(Sheets(1).Range("E56:E65"), oThamChieu).Value
 
Upvote 0
Xin chào mọi người. Mình có thắc mắc về hàm
Function Filter2DArray(ByVal SourceArray, ByVal ColIndex As Long, ByVal FindStr As String, ByVal HasTitle As Boolean) của thầy @ndu96081631

Ở phần mình bôi đen, chỉ có thể tìm kiếm theo 1 cột và mình định trước. Giả dụ dữ liệu mình có 5 cột, Vậy có thể tìm kiếm, hoặc cột 1, hoặc cột 2 không
 
Upvote 0
Chào cả nhà, cho mình hỏi.
1. Mình sử dụng lệnh khai biến gì để khai biến một mãng mãng này có giá trị trong toàn bộ module. Mình vi dụ lấy mãng arr = range(A1:b1) và mãng này sử dụng trong module.
2. Mình có 1 mãng arr, sau khi dữ liệu đưa ra mãng sarr. Sau đó mình lấy arr = sarr. Cho mình hỏi như vậy có được không? và ảnh hưởng đến kết quả không? Xin cảm ơn
 
Upvote 0
Chào cả nhà, cho mình hỏi.
1. Mình sử dụng lệnh khai biến gì để khai biến một mãng mãng này có giá trị trong toàn bộ module. Mình vi dụ lấy mãng arr = range(A1:b1) và mãng này sử dụng trong module.
2. Mình có 1 mãng arr, sau khi dữ liệu đưa ra mãng sarr. Sau đó mình lấy arr = sarr. Cho mình hỏi như vậy có được không? và ảnh hưởng đến kết quả không? Xin cảm ơn

1. Gồm 2 phần:
Phần thứ nhất thì rất dễ, chỉ cần đặt 1 lệnh sau ngay đầu Module:
Public arr
Phần thứ hai hơi rắc rối. Cần xác định rõ tầm vực sử dụng.

2. Nếu arr được Dim là mảng thì không thể được, nếu Dim là Variant thì được.
 
Upvote 0
PHP:
Sub Min_vendor()
    Dim arr()
    Dim lastRow As Long, lastCol As Long, i As Long, j As Long, k As Long, Min As Long
    Cells.Interior.ColorIndex = no

    lastRow = Range("A" & Rows.Count).End(xlUp).Row

    lasCol = Range("A" & Columns.Count).End(xlToLeft).Row

    MsgBox lastRow

    MsgBox lastCol

    For i = 5 To lastRow

        Min = Cells(i, 10)

        k = 10

        For j = 10 To lastCol - 3 Step 3

            If IsNumeric(Cells(i, j)) > 0 Then

                If Cells(i, j).Value2 < Min Then

                    Min = Cells(i, j)

                    k = j

                End If

            End If

        Next j

        Cells(i, k).Interior.Color = 49407

    Next i

End Sub

Cho em hỏi code tìm cột cuối cùng của em có gì sai mà chỉ báo là 0.
 
Upvote 0
Vâng code này em sưu tầm trên mạng. Vậy giờ em phải sửa như nào anh ơi?
 
Upvote 0
Web KT
Back
Top Bottom