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:
Bạn Batman 1 ơi, cho mình hỏi chút: Nếu bây giờ mình có 2 tên nhân viên giống nhau nhưng là 2 người khác nhau, nếu tìm theo tên thì làm sao để hiện ảnh lên được? Giúp mình với
Thế nếu bạn có 2 nữ nhân viên đều là Hương mà sếp nói: Bảo cô Hương lên thảm quỳ của tôi. Thì bạn chọn bừa 1 cô hay bạn nói: Hoặc sếp cho em mã nhân viên hoặc cho em bí danh a. Một cô là Hương búp bê còn cô kia là Hương mắt nâu ạ.
Bạn còn không biết chọn cô Hương nào thì còn nói gì tới code.
 
Upvote 0
Thế nếu bạn có 2 nữ nhân viên đều là Hương mà sếp nói: Bảo cô Hương lên thảm quỳ của tôi. Thì bạn chọn bừa 1 cô hay bạn nói: Hoặc sếp cho em mã nhân viên hoặc cho em bí danh a. Một cô là Hương búp bê còn cô kia là Hương mắt nâu ạ.
Bạn còn không biết chọn cô Hương nào thì còn nói gì tới code.
Hỏi lại sếp thì không dám mà chọn bừa thì cũng khó. Một bên búp bê và một bên mắt nâu thì nửa cân tám lạng thật bác ạ.
Bác ra lại đi, cô Hương bên đèo và cô Hương lưng đồi thì tôi còn nhắm mắt chọn.
 
Lần chỉnh sửa cuối:
Upvote 0
Bỏ cả 4 người lên"Chiếc nón kì diệu" mà sổ số thôi; Trúng 1 trong 2 cô thì được chọn; Trúng bạn hay sếp bạn thì . . . . (tự biết fải làm gì đi nha)
 
Upvote 0
Nhờ các anh em trên GPE giải đáp giúp mình vấn đề sau.
Mình cũng đã cố tìm bằng các từ khóa trên gg và ở GPE nhưng không tìm ra đc chủ đề mình đang thắc mắc là:
Khi mình lấy giá trị từ sheet này sang sheet khác dùng
sheet1.range.value = sheet2.range
Nhanh hơn hay dùng mảng array sẽ nhanh hơn
Array = sheet1.range.value
Sheet2.range.resize = array

Và tương tự, gắn giá trị vào mảng rồi resize xuống range sẽ nhanh hơn hay cho vòng lặp chạy thẳng vào range sẽ nhanh hơn.
Ví dụ code mảng 1 chiều

For i = LBound(array) to UBound(array)
Array2(i) = array(i)
Next i
Sheet.range("A1").resize(UBound,) = transpose(Array2)


For i = LBound(array) to UBound(array)
Sheet.range("A" & i).value = array(i)
Next i

Thì cái nào sẽ nhanh hơn.

Mong mọi người giải đáp giúp mình với ạ.
Mình cảm ơn trước.

Nếu trong khi diễn giải có gì sai sót mong mọi người thông cảm bỏ qua vì mình cũng mới học về vba nên có nhiều cái chưa chuẩn xác lắm.
Cảm ơn mọi người.
 
Upvote 0
Code này mình muốn thay đổi và tìm kiếm có dấu và font Times New Roman được vậy mấy bác

Sub DoReplace()

Const Find1 = "CAR-060"
Const Replace1 = "CAR-034"

Const Find2 = " second find string "
Const Replace2 = " second replacement "

Dim FilePick As FileDialog
Dim FileSelected As FileDialogSelectedItems
Dim WordFile As Variant ' FileName placeholder in selected files loop
Dim FileJob As String ' Filename for processing

Dim WorkDoc As Object
Dim WholeDoc As Range
Dim FooterDoc As Range

' On Error GoTo CreateReports_Error

Set FilePick = Application.FileDialog(msoFileDialogFilePicker)

With FilePick
.Title = "Choose Report Template"
.Filters.Clear
.Filters.Add "Word Documents & Templates", "*.do*"
.Filters.Add "Word 2003 Document", "*.doc"
.Filters.Add "Word 2003 Template", "*.dot"
.Filters.Add "Word 2007 Document", "*.docx"
.Filters.Add "Word 2007 Template", "*.dotx"
.Show
End With

Set FileSelected = FilePick.SelectedItems

If FileSelected.Count <> 0 Then

For Each WordFile In FileSelected

FileJob = WordFile

Set WorkDoc = Application.Documents.Open(FileJob, , , , , , , , , , , False)

Set WholeDoc = WorkDoc.Content
Set FooterDoc = WorkDoc.Sections(1).Footers(wdHeaderFooterPrimary).Range

With FooterDoc
.Find.Execute Find1, True, True, , , , True, , , Replace1, wdReplaceAll
.Find.Execute Find2, True, True, , , , True, , , Replace2, wdReplaceAll
End With

With WholeDoc.Find
.Execute Find1, True, True, , , , True, , , Replace1, wdReplaceAll
End With

WorkDoc.Save
WorkDoc.Close

Next

End If

MsgBox "Completed"

DoReplace_Exit:

Set WholeDoc = Nothing
Set FilePick = Nothing

Set WorkDoc = Nothing
Set FooterDoc = Nothing

Exit Sub

DoReplace_Error:

MsgBox "Error " & Err.Number & " (" & Err.Description & ") in procedure DoReplace of VBA Document ReplaceMulti"
Resume DoReplace_Exit

End Sub

Private Sub Document_New()

End Sub
 
Upvote 0
Nhờ các anh em trên GPE giải đáp giúp mình vấn đề sau.
Mình cũng đã cố tìm bằng các từ khóa trên gg và ở GPE nhưng không tìm ra đc chủ đề mình đang thắc mắc là:
Khi mình lấy giá trị từ sheet này sang sheet khác dùng
sheet1.range.value = sheet2.range
Nhanh hơn hay dùng mảng array sẽ nhanh hơn
Array = sheet1.range.value
Sheet2.range.resize = array

Và tương tự, gắn giá trị vào mảng rồi resize xuống range sẽ nhanh hơn hay cho vòng lặp chạy thẳng vào range sẽ nhanh hơn.
Ví dụ code mảng 1 chiều

For i = LBound(array) to UBound(array)
Array2(i) = array(i)
Next i
Sheet.range("A1").resize(UBound,) = transpose(Array2)


For i = LBound(array) to UBound(array)
Sheet.range("A" & i).value = array(i)
Next i

Thì cái nào sẽ nhanh hơn.

Mong mọi người giải đáp giúp mình với ạ.
Mình cảm ơn trước.

Nếu trong khi diễn giải có gì sai sót mong mọi người thông cảm bỏ qua vì mình cũng mới học về vba nên có nhiều cái chưa chuẩn xác lắm.
Cảm ơn mọi người.
theo mình nghĩ thì khi cho vào mảng nó sẽ nhanh hơn.
 
Upvote 0
Mọi người cho e hỏi. Có cách nào mình Dim và set giá trị cho biến. để dùng đc ở các sub và module khác mà k cần set lại ko ạ. Cám ơn
 
Upvote 0
Upvote 0
Được, nhưng với mục đích của bạn thì e rằng không nên.
Biến toàn cục dùng phải hết sức cẩn thận, vì vậy thường dùng cái tên khá dài để khó lẫn lộn. Người hay viết tắt thì có lẽ mục đích chỉ là do lười khai báo nhiều lần. Cứ biến a, b, c, i, j, k thì chắc chắn sẽ có ngày bể ổ.
 
Upvote 0
Được, nhưng với mục đích của bạn thì e rằng không nên.
Biến toàn cục dùng phải hết sức cẩn thận, vì vậy thường dùng cái tên khá dài để khó lẫn lộn. Người hay viết tắt thì có lẽ mục đích chỉ là do lười khai báo nhiều lần. Cứ biến a, b, c, i, j, k thì chắc chắn sẽ có ngày bể ổ.
Được : thì làm ntn ạ
 
Upvote 0
Dạng khai báo biến hả A.
Rồi e muốn set gtri cho nó luôn và cái sub khác xài gtri biến đó.
Hướng dẫn cụ thể e vs ạ
bạn cứ khai báo bình thường rồi truyền giá trị cho nó ở đâu cũng được nhé trong sub hoặc ngoài cũng được nó vẫn ghi nhớ hết
 
Upvote 0
Hình như cô ta muốn khởi trị. Biến VBA trước khi khởi trị thì nó có mặc định (0 cho số).

Nếu muốn vậy thì làm như sau:

Public Var1 As Integer
Public Var2 As Integer
...

Public Sub KhoiTri()
Var1 = 20
Var2 = 21
...
End Sub

Trong sự kiện Workbook_Open, đặt thêm câu này ngay đầu hàm:
KhoiTri

Sau đó, muốn thay đổi nó ở đâu tuỳ thích.

Chú: bản chất của Const là không thay đổi. Người đọc code LUÔN LUÔN tin rằng nó không bao giờ thay đổi.
Nếu, với một thủ thuật vặn vẹo nào đó mà bạn thay đổi được nó thì có phải bạn tự làm mất niềm tin của người khác chăng?
Cái đặt ngay đầu hàm là sao ta :d
Chứ k phải sử dụng call cái sub khoitri ay trk hã
 
Upvote 0
Upvote 0
Web KT
Back
Top Bottom