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

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
Muốn sửa thì phải thấy file và những yêu cầu làm việc gì, ra kết quả thế nào.
Code nó đã "tào lao" thì sao hiểu được cuối cùng nó ra cái gì.

Em muốn tìm giá trị Price nhỏ nhất của từng dòng rồi đổ màu vào ô đó. Anh xem file đính kèm cho em nhé, sao nghĩ thì đơn giản mà em làm mãi chẳng xong.
 

File đính kèm

Upvote 0
Em muốn tìm giá trị Price nhỏ nhất của từng dòng rồi đổ màu vào ô đó. Anh xem file đính kèm cho em nhé, sao nghĩ thì đơn giản mà em làm mãi chẳng xong.
bạn sửa lại lastrow từ cột A sang cột B xem thử. Chứ cột A dòng cuối 4 lấy đâu mà lặp
 
Upvote 0
Em muốn tìm giá trị Price nhỏ nhất của từng dòng rồi đổ màu vào ô đó. Anh xem file đính kèm cho em nhé, sao nghĩ thì đơn giản mà em làm mãi chẳng xong.
Thử chạy Sub này cho file trên của bạn xem sao, Không cần cột V.
PHP:
Option Explicit

Sub Tim_Min_Price()
Dim I As Long, J As Long, Col As Long, R As Long, MinPrice As Double, X As String
Col = Range("XFD3").End(xlToLeft).Column
R = Range("B1000000").End(xlUp).Row
For I = 5 To R
    MinPrice = 10 ^ 10
    X = ""
    For J = 10 To Col Step 3
        If Cells(I, J).Value > 0 Then
            If Cells(I, J).Value < MinPrice Then
                MinPrice = Cells(I, J).Value
                X = Cells(I, J).Address
            End If
        End If
    Next J
    If Len(X) Then Range(X).Interior.ColorIndex = 6
Next I
End Sub
 
Upvote 0
Thử chạy Sub này cho file trên của bạn xem sao, Không cần cột V.
PHP:
Option Explicit

Sub Tim_Min_Price()
Dim I As Long, J As Long, Col As Long, R As Long, MinPrice As Double, X As String
Col = Range("XFD3").End(xlToLeft).Column
R = Range("B1000000").End(xlUp).Row
For I = 5 To R
    MinPrice = 10 ^ 10
    X = ""
    For J = 10 To Col Step 3
        If Cells(I, J).Value > 0 Then
            If Cells(I, J).Value < MinPrice Then
                MinPrice = Cells(I, J).Value
                X = Cells(I, J).Address
            End If
        End If
    Next J
    If Len(X) Then Range(X).Interior.ColorIndex = 6
Next I
End Sub
Code đã ok anh ạ nhưng em mới nghĩ ra trường hợp nếu hai nhà cùng một mức giá (em muốn đánh dấu cả 2 thì cần làm thêm điều gì anh?)
 
Upvote 0
Code đã ok anh ạ nhưng em mới nghĩ ra trường hợp nếu hai nhà cùng một mức giá (em muốn đánh dấu cả 2 thì cần làm thêm điều gì anh?)
Đưa dữ liệu giống thật, giống những cái nếu, ... chứ tôi sao biết chỗ nào là "nếu ..."
Ý ban đầu đã không xác định, rồi nếu thì "tanh bành" cái code.
 
Upvote 0
Web KT

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

Back
Top Bottom