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

  • CHECK PRICE PR.xlsm
    540.8 KB · Đọc: 7
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
Đư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.
Vâng tại ban đầu em không đặt trường hợp hai nhà hoặc ba nhà báo đồng giá. Em gửi anh xem nhé :)
 

File đính kèm

  • CHECK PRICE PR.xlsm
    530 KB · Đọc: 3
Upvote 0

Hay quá, em không nghĩ vấn đề được giải quyết nhanh chóng và đơn giản vậy. Code của anh rất dễ áp dụng cho các tình huống khác. Cảm ơn anh nhiều nhé!
 
Upvote 0
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.
Cho mình hỏi thêm. Mình khai báo biến như thế nào để khi mình chọn một vùng dữ liệu thì vào mãng, thì dữ liệu đó vẫn tồn tại trong mãng dù mình tắt file đi. Dữ liệu chỉ thay đổi khi mình chọn lại dữ liệu.
 
Upvote 0
Cho mình hỏi thêm. Mình khai báo biến như thế nào để khi mình chọn một vùng dữ liệu thì vào mãng, thì dữ liệu đó vẫn tồn tại trong mãng dù mình tắt file đi. Dữ liệu chỉ thay đổi khi mình chọn lại dữ liệu.
Bạn thử đặt Define Name cho vùng dữ liệu rồi gán mảng bằng Name thử xem
 
Upvote 0
Cho mình hỏi thêm. Mình khai báo biến như thế nào để khi mình chọn một vùng dữ liệu thì vào mãng, thì dữ liệu đó vẫn tồn tại trong mãng dù mình tắt file đi. Dữ liệu chỉ thay đổi khi mình chọn lại dữ liệu.
Biến thuộc về vùng nhớ của phần mềm. Khi tắt file thì phần mềm tắt theo. Vùng nhớ của phần mềm bị trả về cho hệ thống. Muốn giữ trị của biến lại thì phải chịu khó học qua các phương pháp giữ dữ liệu (persistent data)
 
Upvote 0
Các bạn giúp mình với, mình mới nghiên cứu excel nên cũng còn gà, mình lập 1 cái userform gồm có:
+ 2 Nút nhấn : thêm và thêm mới.
+ 1 lisboxt mình dùng definame đưa vào listbox và đặt tên là "DSD" (ở phần rowsouce mình điền "DSD" mình chỉ biết dùng cách này thôi các bạn có cách khác hay hơn xin hướng dẫn dùm)
+ 4 textboxt: 1 cái là dùng để tìm kiếm dữ liệu nhanh từ listbox, 3 cái còn lại để thêm mới vào dữ liệu trong "DSD"
mình muốn viết code như sau:
sau khi add dữ liệu vào listboxt thì nhấn nút "THÊM" dữ liệu trên listbox sẽ nạp nhu sau:
+Cột "DANH MỤC" trong listbox sẽ nộp vào cột B phía dưới hàng có tên "SCOPE OF WORK" trong sheet "ELECTRICAL SYSTEM".
+Cột "VẬT TƯ" trong listbox sẽ nộp vào cột M phía dưới hàng có tên "MATERIAL" trong sheet "ELECTRICAL SYSTEM".
+Cột "NHÂN CÔNG" trong listbox sẽ nộp vào cột N phía dưới hàng có tên "LABOUR" trong sheet "ELECTRICAL SYSTEM".
khi nạp vào như vậy thì sẽ tự động nạp vào dòng tiếp theo.
+ khi chọn mục để nạp mình có thể chọn được nhiều mục để nạp cùng lúc.
- 3 ô Texbox khi nhập dữ liệu vào 3 ô, khi nhấn nút "THÊM" dữ liệu sẽ được nạp mới vào dòng tiếp theo của "DSD".
- ô tìm kiếm khi gõ vào ký tự cần tìm thì listbox chỉ xuất hiện những mục mình cần nạp.
- Mình muốn tạo thêm 1 combobox sử dụng userform để nạp cho các sheet còn lại, khi chọn sheet nào trên userform thì sẽ di chuyển đến sheet đó và nhập liệu.(mình chưa tạo combobox).
Thanks mọi người!
 

File đính kèm

  • SUNSTARTECH - BOQ - form.xls
    174 KB · Đọc: 3
Upvote 0
Các bác cho em hỏi là em muốn tự động nhập vào thời gian và ngày giờ ở cột F bằng code sau dưới đây. Nhưng em không chạy file này được.
Các bác kiểm tra giúp em sai ở đâu và chỉ cách sửa giúp em với ạ.
Em cảm ơn.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer
For i = 2 To 5
    If Cells(i, "B").Value <> "" And Cells(i, "C").Value <> "" And Cells(i, "D").Value <> "" And Cells(i, "E").Value <> "" Then
    Cells(i, "F").Value = Date & Time
    Cells(i, "F").NumberFormat = "d/m/yyyy h:mm AM/PM"
    Range("F:F").EntireColumn = AutoFit
    End If
Next
End Sub
 

File đính kèm

  • file xuat nhap.xlsm
    14.5 KB · Đọc: 6
Upvote 0
Các bác cho em hỏi là em muốn tự động nhập vào thời gian và ngày giờ ở cột F bằng code sau dưới đây. Nhưng em không chạy file này được.
Các bác kiểm tra giúp em sai ở đâu và chỉ cách sửa giúp em với ạ.
Em cảm ơn.
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer
For i = 2 To 5
    If Cells(i, "B").Value <> "" And Cells(i, "C").Value <> "" And Cells(i, "D").Value <> "" And Cells(i, "E").Value <> "" Then
    Cells(i, "F").Value = Date & Time
    Cells(i, "F").NumberFormat = "d/m/yyyy h:mm AM/PM"
    Range("F:F").EntireColumn = AutoFit
    End If
Next
End Sub
Bạn thử:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i&
    If Not Intersect(Target, Range("C2:E500")) Is Nothing Then
        If Target.Count = 1 Then
            i = Target.Row
            If Application.WorksheetFunction.CountA(Range("C" & i).Resize(, 3)) = 3 Then
                Range("F" & i).Value = Date
                ' Range("F" & i).NumberFormat = "dd/mm/yyyy hh:mm:ss"
                 Range("F" & i).NumberFormat = "d/m/yyyy h:mm AM/PM"
            Else
                Range("F" & i).ClearContents
            End If
        End If
    End If
End Sub
 
Upvote 0
Bạn thử:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i&
    If Not Intersect(Target, Range("C2:E500")) Is Nothing Then
        If Target.Count = 1 Then
            i = Target.Row
            If Application.WorksheetFunction.CountA(Range("C" & i).Resize(, 3)) = 3 Then
                Range("F" & i).Value = Date
                ' Range("F" & i).NumberFormat = "dd/mm/yyyy hh:mm:ss"
                 Range("F" & i).NumberFormat = "d/m/yyyy h:mm AM/PM"
            Else
                Range("F" & i).ClearContents
            End If
        End If
    End If
End Sub
Cảm ơn bạn.
Sub đã chạy được rồi nhưng bạn có thể giải thích giúp mình sao code của mình không chạy được vậy ?
 
Upvote 0
Cảm ơn bạn.
Sub đã chạy được rồi nhưng bạn có thể giải thích giúp mình sao code của mình không chạy được vậy ?
Code bạn không chạy chính xác do khi nội dung sheet thay đổi thì thủ tục sự kiện chạy gây ra thay đổi nội dung sheet lại kích hoạt thủ tục. Nói chung sự kiện worksheet_change nên gắn với lệnh application.enableevents=false
 
Upvote 0
Em mới tập tẹ viết VBA. Các bác giúp em với, Em quanh co mãi mà không biết sử lý thế nào được. Tks mọi người.
 

File đính kèm

  • Nhap_lich_xe_2018.rar
    54 KB · Đọc: 3
Upvote 0
(1) em muốn ở Form khi gõ ở textBoxt trên cùng sẽ lọc ra các dữ liệu cần tìm ở vùng từ cột B đến cột AL mà không cần pahit Click vào Button ALL
Ở trang 'NhapLich' đó, bạn có dữ liệu ở các cột từ [A:A] cho đến [Al:AL]
Vậy TextBox trên cùng cần gõ vô để tìm là trường (cột) nào trong nớ.
Không lẽ tìm trên ngấn í cột để mõi mệt thì nghỉ?
Thông thường, 1 CSDL thường có chí ít 1 cột mà người ta dựa vô đó để xác lập toàn bộ dữ liệu mà nó làm đại diện (toàn bộ dòng dữ liệu)
Vậy bạn cần xác định trước chuyện nhập vô TextBox này dữ liệu thuộc trường/cột nào?
và ở Textboxt NVKD duyệt giá khi gõ vào phải trùng tên với Textboxt NVKD ký Hợp đồng nếu không đúng ko cho nhập và hiển thị ra thông báo
Cái này nên xài ComboBox theo 1 danh sách định trước thì hơn
Em muốn bỏ Textboxt maxKH đi thay vào đó là ComboBox "cbdskhncc" và nó sẽ lấy hiển thị ra chọn tên các mã KH để chọn Khi chọn xong thì Textboxt Tên khách hàng, họ tên khách hàng, số dien thoại sẽ lấy dựa trên Combobox đã chọn
Đây sẽ fải là iêu cầu hàng đầu của bạn mới đúng.
Việc này sẽ thực hiện nhờ trang mà bạn gọi là 'DS_KH_NCC' với những trường được gán tên.
(Nên đổi tên trang tính này lại thành 'DMuc' là đạt rồi, theo mình.)
 
Upvote 0
Web KT
Back
Top Bottom