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:
Mình muốn Xin 2 vi dụ đầy đủ cấu trúc, đơn gian hay dùng nhưng dễ hiểu về 2 vấn đề sau:
1----Gán giá trị của các ô trong một vùng ( n dòng, m cột) vào một mảng 2 chiều A(1 to n, 1 to m)
2----Gán ngược lai câu hỏi trên
( mình cứ phải chạy vòng lập khi gán như trên, có cách nào ngắn ngọn chỉ cho mình với)
 
Upvote 0
Mình muốn Xin 2 vi dụ đầy đủ cấu trúc, đơn gian hay dùng nhưng dễ hiểu về 2 vấn đề sau:
1----Gán giá trị của các ô trong một vùng ( n dòng, m cột) vào một mảng 2 chiều A(1 to n, 1 to m)
2----Gán ngược lai câu hỏi trên
( mình cứ phải chạy vòng lập khi gán như trên, có cách nào ngắn ngọn chỉ cho mình với)

Không có gì dễ bằng:
1> Từ Range vào Array
Mã:
Sub Test
  Dim arr
  arr = Range("Gì gì đó").Value
End Sub
2> Từ Array vào Range
Mã:
Sub Test
  Dim arr
  ''Code gì gì đó để có arr
  Range("Gì gì đó").Resize(UBound(arr,1), UBound(arr, 2)).Value = arr
End Sub
 
Upvote 0
Không có gì dễ bằng:
1> Từ Range vào Array
Mã:
Sub Test
  Dim arr
  arr = Range("Gì gì đó").Value
End Sub
2> Từ Array vào Range
Mã:
Sub Test
  Dim arr
  ''Code gì gì đó để có arr
  Range("Gì gì đó").Resize(UBound(arr,1), UBound(arr, 2)).Value = arr
End Sub
Vậy em hiểu thế này có đúng không ạ: Em có mảng A(n,m) và vùng A có a dòng, b cột . Muốn chuyển đổi dữ liệu được thi phải thỏa mãn n= a và m= b phải không ạ. Và lúc đó không phải dùng

.Resize(UBound(arr,1), UBound(arr, 2))
đúng không ạ?
cứ viết là:
Range("-----").value=A
A= range("----").value
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy em hiểu thế này có đúng không ạ: Em có mảng A(n,m) và vùng A có a dòng, b cột . Muốn chuyển đổi dữ liệu được thi phải thỏa mãn n= a và m= b phải không ạ. Và lúc đó không phải dùng

.Resize(UBound(arr,1), UBound(arr, 2))
đúng không ạ?
cứ viết là:
Range("-----").value=A
A= range("----").value

Chính xác là vậy!
Bạn tiến bộ nhanh thật... Mới ngày nào thôi mà bây giờ viết code... ầm ầm
 
Upvote 0
Mình đang tìm hiểu về đoạn code khóa sheet " protect_sheet". Nghĩa là khi sheet được Protect thì sheet đó không thể sửa chữa được mà chỉ ở dạng sem và đọc thôi. Tất nhiên khi prorect_sheet người lập trình đã phải lựa chọn cài đặt lại một số chức năng như được autofilter, ẩn dòng ...để người dùng có thể thao tác được chứ không hẳn như mình nói ở trên là chỉ đọc mà không chỉnh sửa được.Đây là mình hiểu về Protect_sheet
Thế còn đoạn code sau
Mã:
Public Sub Protect_Sheets()
On Error Resume Next
Dim strPass As String
Dim sht_name As Worksheet
InputBox ("tao dang voc")
strPass = InputBox("Enter your Password")
For Each sht_name In Worksheets
    If Not sht_name.ProtectContents Then        ' [COLOR=#ff0000]MÌNH KHÔNG HIỂU TỪ ĐÂY[/COLOR]
        sht_name.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=strPass
    End If
Next sht_name
End Sub
mình không hiểu đoạn cuối. Anh em có thể diễn giải cho mình hiểu thêm với?
 
Upvote 0
Mình đang tìm hiểu về đoạn code khóa sheet " protect_sheet". Nghĩa là khi sheet được Protect thì sheet đó không thể sửa chữa được mà chỉ ở dạng sem và đọc thôi. Tất nhiên khi prorect_sheet người lập trình đã phải lựa chọn cài đặt lại một số chức năng như được autofilter, ẩn dòng ...để người dùng có thể thao tác được chứ không hẳn như mình nói ở trên là chỉ đọc mà không chỉnh sửa được.Đây là mình hiểu về Protect_sheet
Thế còn đoạn code sau
Mã:
Public Sub Protect_Sheets()
On Error Resume Next
Dim strPass As String
Dim sht_name As Worksheet
[COLOR=#ffd700][B]InputBox ("tao dang voc")[/B][/COLOR]
strPass = InputBox("Enter your Password")
For Each sht_name In Worksheets
    If Not sht_name.ProtectContents Then        ' [COLOR=#ff0000]MÌNH KHÔNG HIỂU TỪ ĐÂY[/COLOR]
        sht_name.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True, Password:=strPass
    End If
Next sht_name
End Sub
mình không hiểu đoạn cuối. Anh em có thể diễn giải cho mình hiểu thêm với?

Tôi chả biết cái dòng tôi tô màu vàng để làm cái quái gì nữa!

Từ cái chỗ màu đỏ, bạn cứ ghi macro việc thao tác khóa sheet thì bạn sẽ biết cách mà nó thực hiện.

Riêng cái sht_name.ProtectContents là phương thức để xác định sheet đã khóa hay chưa, nó trả về giá trị Boolean (True/False).

Vòng lặp For Each ... Next trong trường hợp này là xét tất cả các sheet có trong WorkBook và đại diện cho mỗi sheet chính là sht_name.
 
Upvote 0
Tôi chả biết cái dòng tôi tô màu vàng để làm cái quái gì nữa!

Từ cái chỗ màu đỏ, bạn cứ ghi macro việc thao tác khóa sheet thì bạn sẽ biết cách mà nó thực hiện.

Riêng cái sht_name.ProtectContents là phương thức để xác định sheet đã khóa hay chưa, nó trả về giá trị Boolean (True/False).

Vòng lặp For Each ... Next trong trường hợp này là xét tất cả các sheet có trong WorkBook và đại diện cho mỗi sheet chính là sht_name.
Cái chỗ cậu bôi vàng là mình thử dòng code " inputbox" "Vừa học thêm được cái "inputbox" đấy. Thank bạn nhé
Mã:
DrawingObjects:=True, Contents:=True, Scenarios:=True
3 cái này lúc nào cũng phải có để protect sheet hả ban?
 
Lần chỉnh sửa cuối:
Upvote 0
Cái chỗ cậu bôi vàng là mình thử dòng code " inputbox" "Vừa học thêm được cái "inputbox" đấy. Thank bạn nhé
Mã:
DrawingObjects:=True, Contents:=True, Scenarios:=True
3 cái này lúc nào cũng phải có để protect sheet hả ban?

Muốn thí nghiệm thì cứ xóa bỏ nó đi xem thế nào (tức chỉ quan tâm đến Password thôi)
Mã:
sht_name.Protect strPass
 
Upvote 0
Mã:
DrawingObjects:=True, Contents:=True, Scenarios:=True
3 cái này lúc nào cũng phải có để protect sheet hả ban?

Khi bạn thủ công để khóa sheet, sẽ có chỗ cho bạn đặt password và có những checkbox để bạn chọn lựa khóa hoặc không khóa những chọn lựa đó. Thì những thứ trên ghi lại những thao tác mà bạn chọn lựa vào. Tôi đã nói bạn thử ghi macro thao tác của bạn, sẽ thấy tất cả những gì bạn chọn lựa trong đó.
 
Upvote 0
Vậy là qua bài này em hiểu thêm được phương thức kiểm tra sheet đã protect chưa và thủ tục đơn giản nhất để protect 1 sheet " không cần vòng lặp for each..." all sheet trong workbook " dùng vòng lặp for each...."
Em nói lên đây là chốt lại cái hiểu được của em chỗ nào không đúng chỉnh lại cho em chứ không phải em tự đắc đâu đó nhé
 
Upvote 0
Khi chạy code máy lại có hiện tượng treo

Chào AC, em tạo file dưới (file đính kèm - File này đã có lần em đã đề cập với anh rùi đó nhưng chưa xử lý triệt để) để cho nhân viên quản lý kho của em làm. Nhưng khi làm sắp xong rùi nó lại gặp lỗi! Mà lỗi này em rất hay gặp sau mỗi khi em tạo các file ở Office 2007. Cụ thể là lỗi sau:

Trong mục Danh mục khách hàng (cập nhật khách hàng mới), cứ khi em nhập mã mới vào thì nó toàn bị đơ không cho nhập tiếp được? Em tìm hoài mài không biết nó sung thế nào? Hay lỗi ra sao? Em mạnh dạn gửi cho AC xem dùm cho em xem là lỗi gì ah?
Em rất mong AC dành cho em chút ít thời gian xem dùm cho em nhé!
Kính chúc AC nhiều sức khỏe và hạnh phúc!
 

File đính kèm

  • SMS.rar
    199.5 KB · Đọc: 57
Upvote 0
Chào AC, em tạo file dưới (file đính kèm - File này đã có lần em đã đề cập với anh rùi đó nhưng chưa xử lý triệt để) để cho nhân viên quản lý kho của em làm. Nhưng khi làm sắp xong rùi nó lại gặp lỗi! Mà lỗi này em rất hay gặp sau mỗi khi em tạo các file ở Office 2007. Cụ thể là lỗi sau:

Trong mục Danh mục khách hàng (cập nhật khách hàng mới), cứ khi em nhập mã mới vào thì nó toàn bị đơ không cho nhập tiếp được? Em tìm hoài mài không biết nó sung thế nào? Hay lỗi ra sao? Em mạnh dạn gửi cho AC xem dùm cho em xem là lỗi gì ah?
Em rất mong AC dành cho em chút ít thời gian xem dùm cho em nhé!
Kính chúc AC nhiều sức khỏe và hạnh phúc!

Nguyên nhân là do ComboBox tại các sheet PN, PX, THE KHO có ListFillRange liên kết với vùng dữ liệu tại Sheet List ---> Dẫn đến khi bạn nhập liệu ở sheet List thì các ListFillRange này thay đổi để cập nhật làm ảnh hướng quá trình nhập liệu
Không tin bạn có thể thử bằng cách vào 3 sheet ấy, lần lượt xóa hết các ListFillRange của ComboBox, xong nhảy đến Sheet List và nhập liệu sẽ thấy hết lỗi ngay
-------------------------------------------
Tóm lại: Đã viết code VBA thì không nên dùng ListFillRange cho ComboBox mà nên nạp ComboBox bằng List hoặc AddItem
(ListFillRange chỉ dành cho người không biết VBA mà thôi --=0)
Biết nguyên nhân rồi đấy, bạn tự sửa đi
 
Upvote 0
Nguyên nhân là do ComboBox tại các sheet PN, PX, THE KHO có ListFillRange liên kết với vùng dữ liệu tại Sheet List ---> Dẫn đến khi bạn nhập liệu ở sheet List thì các ListFillRange này thay đổi để cập nhật làm ảnh hướng quá trình nhập liệu
Không tin bạn có thể thử bằng cách vào 3 sheet ấy, lần lượt xóa hết các ListFillRange của ComboBox, xong nhảy đến Sheet List và nhập liệu sẽ thấy hết lỗi ngay
-------------------------------------------
Tóm lại: Đã viết code VBA thì không nên dùng ListFillRange cho ComboBox mà nên nạp ComboBox bằng List hoặc AddItem
(ListFillRange chỉ dành cho người không biết VBA mà thôi --=0)
Biết nguyên nhân rồi đấy, bạn tự sửa đi

Quả đúng là vậy. Ui, thích quá anh ah! Thanks a lot!
 
Upvote 0
Em có đoạn code này nhưng nhìn vào có nhiều chỗ chưa hiểu; rất mong được các anh chị giải thích giúp, (chỗ màu đỏ). Em cảm ơn rất nhiều.
Public Sub DiemSo()Dim sArr(), tArr(), dArr(), dArr2(), Dic As Object, I As Long, J As Long, K As Long, Ws As Worksheet, MaSV As String
Set Dic = CreateObject("Scripting.Dictionary")
MaSV = Sheets("So_quanLy").[G4].Value
With Sheets("Tong_hop")
sArr = Range(.[F7], .[F7].End(xlToRight)).Resize(2).Value
End With
ReDim dArr(1 To UBound(sArr, 2), 1 To 2)
For J = 1 To UBound(sArr, 2)
If Not Dic.Exists(sArr(2, J)) Then
Dic.Add sArr(2, J), J
dArr(J, 1) = sArr(2, J)
dArr(J, 2) = sArr(1, J)
End If
Next J '--------------------------------------------------------------
ReDim tArr(1 To 50, 1 To 13)
For Each Ws In ThisWorkbook.Worksheets
If Ws.Name Like "M*" Then
sArr = Ws.Range(Ws.[B13], Ws.[B13].End(xlDown)).Resize(, 14).Value
For I = 1 To UBound(sArr, 1)
If sArr(I, 1) = MaSV Then
tArr(Dic.Item(Ws.Name), 1) = Dic.Item(Ws.Name)
tArr(Dic.Item(Ws.Name), 2) = dArr(Dic.Item(Ws.Name), 2)
For J = 3 To 13
tArr(Dic.Item(Ws.Name), J) = sArr(I, J + 1)
Next J
End If
Next I
End If
Next '--------------------------------------------------------------------
With Sheets("So_QuanLy")
sArr = .[A25:A40].Value
ReDim dArr2(1 To 16, 1 To 10)
For I = 1 To 16
If sArr(I, 1) <> "" Then
For J = 1 To 7
dArr2(I, J) = tArr(sArr(I, 1), J + 1)
Next J
For J = 8 To 10
dArr2(I, J) = tArr(sArr(I, 1), J + 2)
Next J
If tArr(sArr(I, 1), 13) <> "" Then dArr2(I, 10) = tArr(sArr(I, 1), 13)
End If
Next I
.[B25:K40].Value = dArr2 'Nam 1----------------------------------
sArr = .[L25:L40].Value
ReDim dArr2(1 To 16, 1 To 10)
For I = 1 To 16
If sArr(I, 1) <> "" Then
For J = 1 To 7
dArr2(I, J) = tArr(sArr(I, 1), J + 1)
Next J
For J = 8 To 10
dArr2(I, J) = tArr(sArr(I, 1), J + 2)
Next J
If tArr(sArr(I, 1), 13) <> "" Then dArr2(I, 10) = tArr(sArr(I, 1), 13)
End If
Next I
.[M25:V40].Value = dArr2 'Nam 2--------------------------
sArr = .[A49:A64].Value
ReDim dArr2(1 To 16, 1 To 10)
For I = 1 To 16
If sArr(I, 1) <> "" Then
For J = 1 To 7
dArr2(I, J) = tArr(sArr(I, 1), J + 1)
Next J
For J = 8 To 10
dArr2(I, J) = tArr(sArr(I, 1), J + 2)
Next J
If tArr(sArr(I, 1), 13) <> "" Then dArr2(I, 10) = tArr(sArr(I, 1), 13)
End If
Next I
.[B49:K64].Value = dArr2 'Nam 3--------------------------'--------------------------
sArr = .[L49:L64].Value
ReDim dArr2(1 To 16, 1 To 10)
For I = 1 To 16
If sArr(I, 1) <> "" Then
For J = 1 To 7
dArr2(I, J) = tArr(sArr(I, 1), J + 1)
Next J
For J = 8 To 10
dArr2(I, J) = tArr(sArr(I, 1), J + 2)
Next J
If tArr(sArr(I, 1), 13) <> "" Then dArr2(I, 10) = tArr(sArr(I, 1), 13)
End If
Next I
.[M49:V64].Value = dArr2 'Nam 4----------------------------------------------------
End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Híc híc. Mong các Anh chị giải thích cho em vơi. Đầu óc bí !$@!! quá không sao hiểu. _)()(-
 
Upvote 0
Em có đoạn code này nhưng nhìn vào có nhiều chỗ chưa hiểu; rất mong được các anh chị giải thích giúp, (chỗ màu đỏ). Em cảm ơn rất nhiều.
công việc của bạn làm gì thì mình ko rõ nhưng mình nói ý mon na các dòng đỏ đỏ thế này :
[GPECODE=vb]
ReDim tArr(1 To 50, 1 To 13) ' thiết lập lại mãng Tarr gồm 50 dòng và 13 côt
For Each Ws In ThisWorkbook.Worksheets ' cho chạy qua từng worksheet
If Ws.Name Like "M*" Then ' nếu tên sheet có chữ M đứng trước thực hiện dòng dưới
sArr = Ws.Range(Ws.[B13], Ws.[B13].End(xlDown)).Resize(, 14).Value 'thiết lập lại mãng sArr
For I = 1 To UBound(sArr, 1) 'cho chạy vòng lập qua phần tử mãng (theo dòng )
If sArr(I, 1) = MaSV Then ' nếu phần tử mãng bằng với MaSV thì thực hiện lấy item trong dic gắp vào mãng tArr
tArr(Dic.Item(Ws.Name), 1) = Dic.Item(Ws.Name)
tArr(Dic.Item(Ws.Name), 2) = dArr(Dic.Item(Ws.Name), 2)
For J = 3 To 13 'cho chạy vòng lập (theo cot) và gắn giá trị cot tương ưng theo masv cho mãng tArr
tArr(Dic.Item(Ws.Name), J) = sArr(I, J + 1)[/GPECODE]
 
Lần chỉnh sửa cuối:
Upvote 0
Em đang tập viết code VBA. Nhưng nói chung còn quá gà, túm lại là còn chưa hiểu. Mong được mọi người giúp
Private Sub Thongke()
Dim dem As Long, Dic As Object, sArr, dArr(), J As Long, K As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet("Tong_hop")
dem = [BL65000].End(xlUp).Row
For I = 1 To er
If Cells(I, 1) <> "" Then
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=0)*(Tong_hop!dem<4)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=4)*(Tong_hop!dem<5)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=5)*(Tong_hop!dem<6)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=6)*(Tong_hop!dem<7)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=7)*(Tong_hop!dem<8)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=8)*(Tong_hop!dem<9)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=9)*(Tong_hop!dem<10)]
End If
Next I
End With
End Sub
Chẳng biết kết hợp làm sao?. Làm mãi chẳng được. Muốn gán cho nó vào mảng và dùng vòng lặp để duyệt sau đó lấy kết quả mà chẳng thể làm nổi ..... Rất mong mọi người giúp cho. Thôi thì gửi file đính kèm nhờ mọi người giúp. Xin cảm ơn mọi người rất nhiều.
 

File đính kèm

  • BT2.rar
    32 KB · Đọc: 43
Upvote 0
Em đang tập viết code VBA. Nhưng nói chung còn quá gà, túm lại là còn chưa hiểu. Mong được mọi người giúp
Private Sub Thongke()
Dim dem As Long, Dic As Object, sArr, dArr(), J As Long, K As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheet("Tong_hop")
dem = [BL65000].End(xlUp).Row
For I = 1 To er
If Cells(I, 1) <> "" Then
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=0)*(Tong_hop!dem<4)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=4)*(Tong_hop!dem<5)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=5)*(Tong_hop!dem<6)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=6)*(Tong_hop!dem<7)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=7)*(Tong_hop!dem<8)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=8)*(Tong_hop!dem<9)]
.Cells(I, 1) = Application.[SUM((Tong_hop!dem>=9)*(Tong_hop!dem<10)]
End If
Next I
End With
End Sub
Chẳng biết kết hợp làm sao?. Làm mãi chẳng được. Muốn gán cho nó vào mảng và dùng vòng lặp để duyệt sau đó lấy kết quả mà chẳng thể làm nổi ..... Rất mong mọi người giúp cho. Thôi thì gửi file đính kèm nhờ mọi người giúp. Xin cảm ơn mọi người rất nhiều.
-Bài này của bạn giải quyết rất là đơn giản: Nhưng để nút command đó chạy được thì bạn phải viết thủ tục trong modul và gán thủ tục đó cho command
-Hai bảng tonghop và hocky bạn nên lần lượt ở các cột BM và AB bạn dùng công thức excel " không muốn viết code cho chỗ này" tính bình thường sau đó bên bảng phụ tại cột B bạn đánh đúng các sếp loại như trung bình, trung bình khá ... gì đó tương đương với giá trị bên cột BM và AB sau đó mình hướng dẫn tiếp
 
Upvote 0
Web KT
Back
Top Bottom