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:
Chính xác ban đầu giá trị = 0 , mà vụ này bạn dùng worksheetFunction.Max(ran) là được mà !

p/s : bạn mới vào diễn đàn, + mới học vba , mình có chút kinh nghiệm học tập chia sẻ như sau :
*các cụ có câu "học thầy không tày học bạn " <--- bạn cố gắng giao lưu , nhiệt tình , sôi nổi trên GPE,
* Anh ndu và anh Nghĩa là các thành viên có tên tuổi và số má trên diễn đàn, những bài viết nhận xét ,góp ý của các anh ý đều có giá trị nhất định đấy bạn ah
Hôm nay đọc lại. Lần nữa cảm ơn bạn và AC trên diễn đàn rất nhiều.Nhất định găn bó với GPE vì cũng là đam mê...
 
Upvote 0
Tôi có một đoạn code sau:
Private Sub cmdThem_Click()Dim RowCount As Long
Dim ctl As Control
Range("BB2:BH2").ClearContents
'Write data to worksheet
RowCount = Worksheets("THULY").Range("BB1").CurrentRegion.Row s.Count
With Worksheets("THULY").Range("BB1")
.Offset(RowCount, 0).Value = Me.cbxNguoinhanBC.Value
.Offset(RowCount, 1).Value = Me.txtNguoilapBC.Value
.Offset(RowCount, 2).Value = Me.txtNguoiduyetBC.Value
.Offset(RowCount, 3).Value = Me.cbxChucdanhduyetBC.Value
.Offset(RowCount, 4).Value = Me.txtNgaylapBC.Value
.Offset(RowCount, 5).Value = Me.txtSothangBC.Value
.Offset(RowCount, 6).Value = Me.txtThoigianBC.Value
End With
Unload Me
End Sub

Nhờ GPE hướng dẫn cách giúp để đoạn code trên (phần chữ màu đỏ) không Clear tất cả thông tin ở Range BB2:BH2
Mà yêu cầu là nó chỉ Replace cho những thông tin nào có thay đổi ở Range BB2:BH2
Cảm ơn mọi người ah!
 
Upvote 0
em cũng có câu hỏi muốn thầy giải thích ạ
label.Caption = Format(listbox.ListCount, "#,##0")
nhờ thầy giải thích code này hộ em với
 
Upvote 0
em cũng có câu hỏi muốn thầy giải thích ạ
label.Caption = Format(listbox.ListCount, "#,##0")
nhờ thầy giải thích code này hộ em với
Trong câu lệnh trên có 2 Controls, có thể là cái tên, nhưng tạm gọi nó là controls Label và controls ListBox. Khi viết gì đó trên Label thì thuộc tính này gọi là Caption; khi đếm số hàng của ListBox thì ListCount là thuộc tính của nó; Format là hàm định dạng số thành một chuỗi có cấu trúc là Format(Number, FormatType).
 
Upvote 0
Tôi có một đoạn code sau:


Nhờ GPE hướng dẫn cách giúp để đoạn code trên (phần chữ màu đỏ) không Clear tất cả thông tin ở Range BB2:BH2
Mà yêu cầu là nó chỉ Replace cho những thông tin nào có thay đổi ở Range BB2:BH2
Cảm ơn mọi người ah!
Nhìn code, tôi thấy không cần Clear thì nó cũng đã thay đổi toàn bộ Range BB2:BH2 này rồi. Vậy cho nên xóa hẳn luôn cái Range("BB2:BH2").ClearContents này cũng được.
 
Upvote 0
Nhìn code, tôi thấy không cần Clear thì nó cũng đã thay đổi toàn bộ Range BB2:BH2 này rồi. Vậy cho nên xóa hẳn luôn cái Range("BB2:BH2").ClearContents này cũng được.
Nếu yêu cầu đặc ra là không phải thay đổi toàn bộ Range BB2:BH2, mà chỉ thay đổi những thông tin nào mới được nhập (nếu có) trong Range BB2:BH2 thì phải chỉnh sửa code như thế nào ah?
 
Upvote 0
Nếu yêu cầu đặc ra là không phải thay đổi toàn bộ Range BB2:BH2, mà chỉ thay đổi những thông tin nào mới được nhập (nếu có) trong Range BB2:BH2 thì phải chỉnh sửa code như thế nào ah?

Với RowCount = 1

With Worksheets("THULY").Range("BB1")
BB2: .Offset(RowCount, 0).Value = Me.cbxNguoinhanBC.Value
BC2: .Offset(RowCount, 1).Value = Me.txtNguoilapBC.Value
BD2: .Offset(RowCount, 2).Value = Me.txtNguoiduyetBC.Value
BE2: .Offset(RowCount, 3).Value = Me.cbxChucdanhduyetBC.Value
BF2: .Offset(RowCount, 4).Value = Me.txtNgaylapBC.Value
BG2: .Offset(RowCount, 5).Value = Me.txtSothangBC.Value
BH2: .Offset(RowCount, 6).Value = Me.txtThoigianBC.Value

Các cell màu đỏ tương ứng với các dòng code đấy, bạn muốn để dòng nào và xóa dòng nào tùy bạn!
 
Lần chỉnh sửa cuối:
Upvote 0
Với RowCount = 1

With Worksheets("THULY").Range("BB1")
BB2: .Offset(RowCount, 0).Value = Me.cbxNguoinhanBC.Value
BC2: .Offset(RowCount, 1).Value = Me.txtNguoilapBC.Value
BD2: .Offset(RowCount, 2).Value = Me.txtNguoiduyetBC.Value
BE2: .Offset(RowCount, 3).Value = Me.cbxChucdanhduyetBC.Value
BF2: .Offset(RowCount, 4).Value = Me.txtNgaylapBC.Value
BG2: .Offset(RowCount, 5).Value = Me.txtSothangBC.Value
BH2: .Offset(RowCount, 6).Value = Me.txtThoigianBC.Value

Các cell màu đỏ tương ứng với các dòng code đấy, bạn muốn để dòng nào và xóa dòng nào tùy bạn!
Đoạn Code này em chạy để nhập dữ liệu từ Form ah, làm theo cách của Bác thì nó vẫn xóa những thông tin cũ và nhập thông tin mới theo Cell tương ứng ah.
Nhu cầu của em là Thông tin trước đó đã được nhập từ Form đầy đủ, đến kỳ báo cáo sau chỉ có nhu cầu thay đổi thoigianBC (BH2) và NgaylapBC (BF2) còn các thông tin ở Cell khác thì vẫn giữ nội dung cũ không có thay đổi gì nên không phải nhập lại.
Có nghĩa là chỉnh sửa Code như thế nào để khi nhập thông tin từ Form để đáp ứng yêu cầu: nếu Cell nào có thông tin mới thì thay thế, nếu Cell nào không có thay đổi giữ lại thông tin cũ mà không bị xóa ah?
 
Upvote 0
Đoạn Code này em chạy để nhập dữ liệu từ Form ah, làm theo cách của Bác thì nó vẫn xóa những thông tin cũ và nhập thông tin mới theo Cell tương ứng ah.
Nhu cầu của em là Thông tin trước đó đã được nhập từ Form đầy đủ, đến kỳ báo cáo sau chỉ có nhu cầu thay đổi thoigianBC (BH2) và NgaylapBC (BF2) còn các thông tin ở Cell khác thì vẫn giữ nội dung cũ không có thay đổi gì nên không phải nhập lại.
Có nghĩa là chỉnh sửa Code như thế nào để khi nhập thông tin từ Form để đáp ứng yêu cầu: nếu Cell nào có thông tin mới thì thay thế, nếu Cell nào không có thay đổi giữ lại thông tin cũ mà không bị xóa ah?

Cho tôi hỏi, bạn chỉ nhập mỗi hàng 2? Nếu thay đổi thì chỉ thay đổi ở các cell thuộc hàng này và không thay đổi thì vẫn giữ lại?
 
Upvote 0
Cho tôi hỏi, bạn chỉ nhập mỗi hàng 2? Nếu thay đổi thì chỉ thay đổi ở các cell thuộc hàng này và không thay đổi thì vẫn giữ lại?
Đúng rồi ah, thông tin chỉ nhập vào hàng 2 (từ BB2 đến BH2) thôi ah, nếu có thông tin mới cần thay đổi thì cũng chỉ thay đổi ở hàng số 2 này, nhưng có thể chỉ có 1 Cell thay đổi hoặc tất cả các Cell của hàng 2 này thay đổi ah (có nghĩa là có thể thay đổi tùy ý hoặc không). Và nếu có thay đổi ở Cell nào thì lấy thông tin mới, nếu ko có thông tin mới thì vẫn giữ lại.
 
Upvote 0
Đúng rồi ah, thông tin chỉ nhập vào hàng 2 (từ BB2 đến BH2) thôi ah, nếu có thông tin mới cần thay đổi thì cũng chỉ thay đổi ở hàng số 2 này, nhưng có thể chỉ có 1 Cell thay đổi hoặc tất cả các Cell của hàng 2 này thay đổi ah (có nghĩa là có thể thay đổi tùy ý hoặc không). Và nếu có thay đổi ở Cell nào thì lấy thông tin mới, nếu ko có thông tin mới thì vẫn giữ lại.
Vậy thì thủ tục của bạn như thế này đi:

Mã:
Private Sub cmdThem_Click()
    Dim c As Byte
    Dim ArrSheet(), ArrControls()
    ArrSheet = Sheets("THULY").Range("BB2:BH2")
    ArrControls = Array(cbxNguoinhanBC, txtNguoilapBC, txtNguoiduyetBC, _
                        cbxChucdanhduyetBC, txtNgaylapBC, txtSothangBC, _
                        txtThoigianBC)
    For c = 1 To 7
        If ArrControls(c - 1).Value > "" Then
            ArrSheet(c) = ArrControls(c - 1).Value
        End If
    Next
    Worksheets("THULY").Range("BB2:BH2") = ArrSheet
    Unload Me
End Sub
 
Upvote 0
Trong câu lệnh trên có 2 Controls, có thể là cái tên, nhưng tạm gọi nó là controls Label và controls ListBox. Khi viết gì đó trên Label thì thuộc tính này gọi là Caption; khi đếm số hàng của ListBox thì ListCount là thuộc tính của nó; Format là hàm định dạng số thành một chuỗi có cấu trúc là Format(Number, FormatType).
cám ơn thầy đã giải thích hộ em. nhưng nếu em muốn tính tổng số lượng của 1 cột trong listbox và hiển thị ra Label thì phải làm sao ạ.ví dụ như cột thứ 7.nhờ thầy giúp ạ
 
Lần chỉnh sửa cuối:
Upvote 0
cám ơn thầy đã giải thích hộ em. nhưng nếu em muốn tính tổng số lượng của 1 cột trong listbox và hiển thị ra Label thì phải làm sao ạ.ví dụ như cột thứ 7.nhờ thầy giúp ạ
Rất dễ bạn à. Dùng thủ tục này:

Giả sử có 1 ListBox1 và 1 Label1 thì code sẽ như sau:

Mã:
Sub TongCot7()
    Dim r As Long, c As Long, SumCot7 As Double
    c = ListBox1.ListCount
    If c > 0 Then
        For r = 0 To c - 1
            SumCot7 = SumCot7 + ListBox1.List(r, 6)
        Next
    End If
    Label1.Caption = Format(SumCot7, "#,##0")
End Sub
 
Upvote 0
Rất dễ bạn à. Dùng thủ tục này:

Giả sử có 1 ListBox1 và 1 Label1 thì code sẽ như sau:

Mã:
Sub TongCot7()
    Dim r As Long, c As Long, SumCot7 As Double
    c = ListBox1.ListCount
    If c > 0 Then
        For r = 0 To c - 1
            SumCot7 = SumCot7 + ListBox1.List(r, 6)
        Next
    End If
    Label1.Caption = Format(SumCot7, "#,##0")
End Sub


em có file nhờ thầy chỉnh sưa dùm em.sẵn tiện chỉ em cách tạo tiêu đề trong litsbox theo từng combobox nha.cám ơn thầy nhìu
 
Upvote 0
chào cả nhà,
em có 1 đoạn code, run bi fail, không biết fix thê nào, nhờ các Thầy và bậc đàn anh help với:

Sub master_format()
Dim ws As Worksheet
Set ws = Sheets("RvMasterPickTask")
ws.Columns("B").ColumnWidth = 13
ws.Columns("E").ColumnWidth = 31.8
ws.Columns("B:I").Select
Selection.Font.Bold = True
With Selection.Font
.Name = "Arial"
.Size = 12
End With
With ws.PageSetup
.RightHeader = "Page &P of &N"
End With
ws.Range("A10:A2000").RowHeight = 13.5 'chua xac dinh duoc vung chua du lieu
ws.Columns("K:L").EntireColumn.Hidden = True
End Sub
 
Upvote 0
chào cả nhà,
em có 1 đoạn code, run bi fail, không biết fix thê nào, nhờ các Thầy và bậc đàn anh help với:

Sub master_format()
Dim ws As Worksheet
Set ws = Sheets("RvMasterPickTask")
ws.Columns("B").ColumnWidth = 13
ws.Columns("E").ColumnWidth = 31.8
ws.Columns("B:I").Select
Selection.Font.Bold = True
With Selection.Font
.Name = "Arial"
.Size = 12
End With
With ws.PageSetup
.RightHeader = "Page &P of &N"
End With
ws.Range("A10:A2000").RowHeight = 13.5 'chua xac dinh duoc vung chua du lieu
ws.Columns("K:L").EntireColumn.Hidden = True
End Sub

Căn bản thì code này không có lỗi gì cả. Muốn sửa được lỗi phải có file.
 
Upvote 0
Vậy thì thủ tục của bạn như thế này đi:

Mã:
Private Sub cmdThem_Click()
    Dim c As Byte
    Dim ArrSheet(), ArrControls()
    ArrSheet = Sheets("THULY").Range("BB2:BH2")
    ArrControls = Array(cbxNguoinhanBC, txtNguoilapBC, txtNguoiduyetBC, _
                        cbxChucdanhduyetBC, txtNgaylapBC, txtSothangBC, _
                        txtThoigianBC)
    For c = 1 To 7
        If ArrControls(c - 1).Value > "" Then
            ArrSheet(c) = ArrControls(c - 1).Value
        End If
    Next
    Worksheets("THULY").Range("BB2:BH2") = ArrSheet
    Unload Me
End Sub

Em chạy đoạn Code trên thì có Debug, Em gửi File đính kèm, nhờ bác xem giúp!
 

File đính kèm

  • CHAYTHU-2.rar
    141.5 KB · Đọc: 23
Upvote 0
Cac Anh Chi fix dum em code file dinh kem, code nay em lam chi ap dung dc 1 sheet, nhung khi enable (addin) qua file khac thi ko duoc, em muon khi addin qua sheet khac thi van run binh thuong.

Thank (Em xin loi unikey may co quan ko run duoc)
 

File đính kèm

  • mas jit -test.rar
    59 KB · Đọc: 7
Upvote 0
xin giải thích đoạn code

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]
e đang mày mò vba mà không hiểu ý nghia đoạn code này mong các bác giải thích giùm. cảm ơn các bác

Public Sub LOC_GV()
Dim sArr(), dArr(), TenGV As String, K As Long, I As Long, J As Long
With Sheets("DIEMDANH_GV")
sArr = .Range(.[B5], .[B65536].End(xlUp)).Resize(, 13).Value2
End With
ReDim dArr(1 To UBound(sArr, 1), 1 To 12)
With Sheets("LOC")
TenGV = UCase(.[C2])
For I = 1 To UBound(sArr, 1)
If UCase(sArr(I, 1)) = TenGV Then
K = K + 1: dArr(K, 1) = K
For J = 3 To 13
dArr(K, J - 1) = sArr(I, J)
Next J
End If
Next I
.[A4:L100].ClearContents
.[A4:L100].Borders.LineStyle = xlNone
If K Then
.[A4].Resize(K, 12) = dArr
.[A4].Resize(K, 12).Borders.LineStyle = xlContinuous
End If
End With
End Sub
 
Upvote 0
D1: Khai báo các biến cần thiết cho chương trình
D2: Tuyên cáo sẽ làm việc với trang tính có tên "DIEMANH_GV"
D3: Lấy vùng dữ liệu có ở cột [B:B] bắt đầu từ [B5] đem gám vô biến mảng đã khai báo
D4: Kết thúc tuyên cáo
D5: Khai báo 1 biến mảng gồm 12 cột & số dòng bằng với số dòng trong mảng đã nhận số liệu (sArr())
D6: Tuyên cáo làm việc với trang tính tên 'Loc'
D7: Lấy trị chuỗi ở ô [C2], cho nó trở thành kiểu việt hoa & đem gán vô biến TenGV
D8: Tạo vòng lặp duyệt theo toàn bộ các dòng trong biến mảng sArr() theo cột đầu của nó
(Vòng lặp này kết thúc tại D15)
D9: Điều kiện: Nếu kiểu viết hoa của trị đang duyệt trùng với trị chứa trong biến TenGV thì (thực hiện các lệnh sau)
D10: Tăng biến (đếm) K lên 1 đơn vị
Lấy trị K này gán vô biến mảng đã khai báp
(Xem tiếp bên dưới. . .)
PHP:
Public Sub LOC_GV()
 Dim sArr(), dArr(), TenGV As String, K As Long, I As Long, J As Long
2 With Sheets("DIEMDANH_GV")
    sArr = .Range(.[B5], .[B65536].End(xlUp)).Resize(, 13).Value2
4 End With
 ReDim dArr(1 To UBound(sArr, 1), 1 To 12)
6 With Sheets("LOC")
    TenGV = UCase(.[C2])
8    For I = 1 To UBound(sArr, 1)
        If UCase(sArr(I, 1)) = TenGV Then
10            K = K + 1:         dArr(K, 1) = K
            For J = 3 To 13
12                dArr(K, J - 1) = sArr(I, J)
            Next J
14        End If
    Next I
16    .[A4:L100].ClearContents
    .[A4:L100].Borders.LineStyle = xlNone
18    If K Then
         .[A4].Resize(K, 12) = dArr
20         .[A4].Resize(K, 12).Borders.LineStyle = xlContinuous
    End If
22 End With
End Sub
D11: Tạo tiếp 1 vòng lặp theo J, biến thiên tử 3 cho tới 13
D12: Đem các trị tương ứng trong hàng gán vô mảng sau (tạm hiểu là mảng đích)
D13: Kết thúc vòng lặp
D15: Kết thúc điều kiện (Đ9)
D16: Xóa vùng dữ liệu từ [A4:L100]
D17: Format vùng này không kẻ dòng
D18: Điều kiện: Nếu K>0 thì (thực thi các dòng lệnh trước dòng 21)
D19: Lấy trị chứa trong mảng đích gán vô ô [A4]; mở rọng K dòng & 12 cột
D20: Vùng vừa được gán dữ liệu được format kẻ dòng nét mảnh
. . . .

Mong đã giúp bạn ít nhiều!
 
Upvote 0
Web KT
Back
Top Bottom