Chuyên đề giải đáp những thắc mắc về code VBA

tueyennhi

Thành viên tích cực
Tham gia ngày
18 Tháng mười 2010
Bài viết
1,137
Được thích
97
Điểm
420
Tuổi
31
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
 

Khoakv.vp

Thành viên mới
Tham gia ngày
6 Tháng năm 2016
Bài viết
5
Được thích
0
Điểm
163
Tuổi
32
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.
 

Ba Tê

Gội Rồi Mới Cạo
Tham gia ngày
5 Tháng năm 2009
Bài viết
11,650
Được thích
16,666
Điểm
1,860
Tuổi
61
Nơi ở
An Giang
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.
 

HieuCD

Chuyên gia GPE
Tham gia ngày
14 Tháng chín 2010
Bài viết
6,997
Được thích
13,656
Điểm
1,560
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ì?
 

Khoakv.vp

Thành viên mới
Tham gia ngày
6 Tháng năm 2016
Bài viết
5
Được thích
0
Điểm
163
Tuổi
32
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ỉ ?
 

HieuCD

Chuyên gia GPE
Tham gia ngày
14 Tháng chín 2010
Bài viết
6,997
Được thích
13,656
Điểm
1,560
Đâ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
 

Ba Tê

Gội Rồi Mới Cạo
Tham gia ngày
5 Tháng năm 2009
Bài viết
11,650
Được thích
16,666
Điểm
1,860
Tuổi
61
Nơi ở
An Giang
Đâ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

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,516
Được thích
53,207
Điểm
11,910
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?
 

Khoakv.vp

Thành viên mới
Tham gia ngày
6 Tháng năm 2016
Bài viết
5
Được thích
0
Điểm
163
Tuổi
32
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é !
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
9,550
Được thích
11,434
Điểm
1,560
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
 

keke355992

Thành viên thường trực
Tham gia ngày
19 Tháng một 2008
Bài viết
310
Được thích
20
Điểm
685
Tuổi
33
Nơi ở
Hoà Bình
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
 

chisinhvnn

Thành viên tiêu biểu
Tham gia ngày
7 Tháng ba 2008
Bài viết
401
Được thích
85
Điểm
695
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
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
9,550
Được thích
11,434
Điểm
1,560
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.
 

tueyennhi

Thành viên tích cực
Tham gia ngày
18 Tháng mười 2010
Bài viết
1,137
Được thích
97
Điểm
420
Tuổi
31
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.
 

Ba Tê

Gội Rồi Mới Cạo
Tham gia ngày
5 Tháng năm 2009
Bài viết
11,650
Được thích
16,666
Điểm
1,860
Tuổi
61
Nơi ở
An Giang
Lần chỉnh sửa cuối:

tueyennhi

Thành viên tích cực
Tham gia ngày
18 Tháng mười 2010
Bài viết
1,137
Được thích
97
Điểm
420
Tuổi
31
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?
 
Top Bottom