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áy mình với bộ nhớ hạn hẹp chỉ chạy macro #1664 với 25500 dòng & 255 cột mất >4.656" (file xls 112Mb)

Muốn chạy nó cần cung cấp cho nó tham biến {1 hay 2} Nhưng với dữ liệu đồ sộ của bạn thì quên nó đi!
hic :(
Nhờ A giải thích giùm e khi nào thì mình sử dụng những sub như vậy ạ
Với những sub như vậy thì mục đích nó có khác gì với những sub bình thường ko A
 
Upvote 0
Em có Code VBA như ở trong file đính kèm em hay dùng để copy phần sau khi đã Filter (Như ví dụ dưới là em Filter ở Cột Mã hàng). Trước giờ em vẫn dùng Code này mà không hiểu nó thực hiện như thế nào vì em thấy giá trị trả về đã Paste Value như em mong muốn rồi nhưng hôm nay em không thực hiện Filter trước mà chạy Code luôn thì giá trị trả về có cả công thức ở phần trên xuống. Code hiện tại em đang dùng kiểu như này ạ

Mã:
Sub thu()
[A10:B20].Clear
[A1:B8].Copy [A10]
End Sub

1543368510680.png
Vậy Anh chị cho em hỏi phần [A1:B8].Copy [A10] Bản chất nó là như thế nào ạ (Copy Paste, Copy Paste Special Value hay một cách thức nào khác ạ).Em tự hiểu thì là không Filter là Copy Paste thông thường còn nếu Filter thì nó lại thành Copy Paste Special Value. Em muốn hiểu rõ hơn để áp dụng cho đúng và giải thích cho bạn bè khi cần ạ. Em cảm ơn ạ
 

File đính kèm

  • Code GPE.xlsb
    17.6 KB · Đọc: 3
Upvote 0
Em có Code VBA như ở trong file đính kèm em hay dùng để copy phần sau khi đã Filter (Như ví dụ dưới là em Filter ở Cột Mã hàng). Trước giờ em vẫn dùng Code này mà không hiểu nó thực hiện như thế nào vì em thấy giá trị trả về đã Paste Value như em mong muốn rồi nhưng hôm nay em không thực hiện Filter trước mà chạy Code luôn thì giá trị trả về có cả công thức ở phần trên xuống. Code hiện tại em đang dùng kiểu như này ạ

Mã:
Sub thu()
[A10:B20].Clear
[A1:B8].Copy [A10]
End Sub

View attachment 208417
Vậy Anh chị cho em hỏi phần [A1:B8].Copy [A10] Bản chất nó là như thế nào ạ (Copy Paste, Copy Paste Special Value hay một cách thức nào khác ạ).Em tự hiểu thì là không Filter là Copy Paste thông thường còn nếu Filter thì nó lại thành Copy Paste Special Value. Em muốn hiểu rõ hơn để áp dụng cho đúng và giải thích cho bạn bè khi cần ạ. Em cảm ơn ạ
Người đẹp thử Code này xem sao
PHP:
Sub thu()
[A10:B20].Clear
[A1:B8].SpecialCells(12).Copy
[A10].PasteSpecial xlPasteValues
Application.CutCopyMode = False
End Sub
Tham khảo thêm: https://docs.microsoft.com/en-us/office/vba/api/excel.range.specialcells
http://access-excel.tips/excel-vba-range-pastespecial/
 
Lần chỉnh sửa cuối:
Upvote 0
Người đẹp thử Code này xem sao
PHP:
Sub thu()
[A10:B20].Clear
[A1:B8].SpecialCells(12).Copy
[A10].PasteSpecial xlPasteValues
Application.CutCopyMode = False
End Sub
Tham khảo thêm: https://docs.microsoft.com/en-us/office/vba/api/excel.range.specialcells
Cái này nó lại bỏ hết Border của tớ đi rồi. Cậu thử xem file của tớ mà xem. Trước giờ tớ cứ dùng chứ nay mới thắc mắc nên lên diễn đàn hỏi cho hiểu sâu hơn tí ý mà
 
Upvote 0
Cái này nó lại bỏ hết Border của tớ đi rồi. Cậu thử xem file của tớ mà xem. Trước giờ tớ cứ dùng chứ nay mới thắc mắc nên lên diễn đàn hỏi cho hiểu sâu hơn tí ý mà
Vậy thêm 2 dòng nữa cho nó hoành tráng :p:p:p
PHP:
Sub thu()
Range("A10:B20").Clear
Range("A1:B8").SpecialCells(12).Copy
With Range("A10")
    .PasteSpecial xlPasteFormats
    .PasteSpecial xlPasteColumnWidths
   .PasteSpecial xlPasteValuesAndNumberFormats
End With
Application.CutCopyMode = False
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy thêm 2 dòng nữa cho nó hoành tráng :p:p:p
PHP:
Sub thu()
Range("A10:B20").Clear
Range("A1:B8").SpecialCells(12).Copy
With Range("A10")
    .PasteSpecial xlPasteFormats
    .PasteSpecial xlPasteColumnWidths
    .PasteSpecial xlPasteValues
End With
Application.CutCopyMode = False
End Sub
Mã:
Sub thu()
[A10:B20].Clear
[A1:B8].Copy [A10]
End Sub
Code chỉ cần thế này là xử lý được rồi nhưng ý tớ là nếu tớ không Filter thì nó trả về kết quả có cả hàm mà Chỉ cần Filter ở Cột Mã hàng thì giá trị trả về tự động là Value luôn nên tớ thấy hay nên muốn hỏi bản chất của Code kia nó thay cho hàm hay thao tác nào trong Excel ý mà
 
Upvote 0
Mã:
Sub thu()
[A10:B20].Clear
[A1:B8].Copy [A10]
End Sub
Code chỉ cần thế này là xử lý được rồi nhưng ý tớ là nếu tớ không Filter thì nó trả về kết quả có cả hàm mà Chỉ cần Filter ở Cột Mã hàng thì giá trị trả về tự động là Value luôn nên tớ thấy hay nên muốn hỏi bản chất của Code kia nó thay cho hàm hay thao tác nào trong Excel ý mà
Bản thân của Excel nó đã vậy rồi mà. Khi Copy 1 vùng đã được Filter thi nó cho kết quả là Value mà
 
Upvote 0
Bản thân của Excel nó đã vậy rồi mà. Khi Copy 1 vùng đã được Filter thi nó cho kết quả là Value mà
:( điều đơn giản đấy mà hôm nay tớ mới biết đấy. Bình thường theo thói quen dùng paste Value là chính nên tớ còn không biết điều này. Cảm ơn ♫ђöล♥ßล†♥†µ♫ nhé. Thế về thực chất code kia của tớ chỉ là Copy Paste thông thường hihi
 
Upvote 0
Dùng cách dò tìm, trong VBA thì Range.Find.... tức là dùng method Find của Range
Code VBA em không được tốt lắm nhờ Anh/Chi viết giúp 1 đoạn code được không ah ?

Đoạn Code của Form nhập dữ liệu của em đây :


Private Sub cmdluukh_Click()
Dim lngRow As Long
Dim avDatakh




With ThisWorkbook.Worksheets("DS_KH_NCC")
lngRow = .Range("B" & .Rows.Count).End(xlUp).Row
If lngRow <= 3 Then
lngRow = 4
Else
lngRow = lngRow + 1
End If
ReDim avData(1 To 1, 1 To 12) As Variant
avData(1, 1) = lngRow - 3
avData(1, 2) = txtmakhncc.Text
avData(1, 3) = txtphanbiet.Text
avData(1, 4) = txttenkhncc.Text
avData(1, 5) = txthovatenkhncc.Text
avData(1, 6) = txtsodtkhncc.Text
avData(1, 7) = txtdiachikhncc.Text
avData(1, 8) = txtemailkhncc.Text
avData(1, 9) = txtsotkkhncc.Text
avData(1, 10) = txtghichu.Text
avData(1, 11) = txtnguoinhapds.Text
avData(1, 12) = VBA.Date 'ngay nhap
.Range("A1").Offset(lngRow - 1).Resize(, 12).value = avData


MsgBox "Da nhap DS KH-Nha Xe Thanh Cong vao o dong so: " & lngRow
End With
Call moi

End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
:( Nhờ A giải thích giùm e khi nào thì mình sử dụng những sub như vậy ạ
Với những sub như vậy thì mục đích nó có khác gì với những sub bình thường ko A
Bạn xem cái cặp này
Mã:
Sub GPE()
ThucHanh 13, 12.5, "B"
End Sub
PHP:
Sub ThucHanh(aA As Double, bB As Double, ABCDE As String)
  Select Case ABCDE
  Case "A"
    MsgBox aA + bB
Case "B"
    MsgBox aA - bB
Case "C"
    MsgBox aA * bB
Case "D"
    If bB <> 0 Then MsgBox aA / bB
Case "E"
    If bB <> 0 Then MsgBox aA \ bB
Case Else
    MsgBox "Không Làm, Xéo ngay!"
End Select
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Code VBA em không được tốt lắm nhờ Anh/Chi viết giúp 1 đoạn code được không ah ?

Đoạn Code của Form nhập dữ liệu của em đây :


Private Sub cmdluukh_Click()
Dim lngRow As Long
Dim avDatakh




With ThisWorkbook.Worksheets("DS_KH_NCC")
lngRow = .Range("B" & .Rows.Count).End(xlUp).Row
If lngRow <= 3 Then
lngRow = 4
Else
lngRow = lngRow + 1
End If
ReDim avData(1 To 1, 1 To 12) As Variant
avData(1, 1) = lngRow - 3
avData(1, 2) = txtmakhncc.Text
avData(1, 3) = txtphanbiet.Text
avData(1, 4) = txttenkhncc.Text
avData(1, 5) = txthovatenkhncc.Text
avData(1, 6) = txtsodtkhncc.Text
avData(1, 7) = txtdiachikhncc.Text
avData(1, 8) = txtemailkhncc.Text
avData(1, 9) = txtsotkkhncc.Text
avData(1, 10) = txtghichu.Text
avData(1, 11) = txtnguoinhapds.Text
avData(1, 12) = VBA.Date 'ngay nhap
.Range("A1").Offset(lngRow - 1).Resize(, 12).value = avData


MsgBox "Da nhap DS KH-Nha Xe Thanh Cong vao o dong so: " & lngRow
End With
Call moi

End Sub


Thay đoạn code If ... EndIf đầu sub thành đoạn sau, xem có được không
Mã:
If lngRow <= 3 Then
    lngRow = 4
Else
    Dim Rg As Range
    Set Rg = .Range("B4:B" & lngRow).Find(txtmakhncc.Text,lookin:=xlValues, LookAt:=xlWhole)
    If Not Rg  Is Nothing Then
        Msgbox "Da co trung " & txtmakhncc.Text
        Exit sub
    End If
    lngRow = lngRow + 1
End If
 
Upvote 0
Máy mình với bộ nhớ hạn hẹp chỉ chạy macro #1664 với 25500 dòng & 255 cột mất >4.656" (file xls 112Mb)

Muốn chạy nó cần cung cấp cho nó tham biến {1 hay 2} Nhưng với dữ liệu đồ sộ của bạn thì quên nó đi!
Đây là dân chơi hàng KHỦNG. Bạn vàng ơi.
Dữ liệu của mình trung bình 1 file csv 30Mb
Khoảng 4000 cột, gần 1tr dòng.
Chạy cái máy đơ lun :(
Cái từ "trung bình" ở trên hàm nghĩa rằng có nhiều files lắm, và có những files trên 4000 cột, trên triệu dòng. Tối thiểu 4 tỷ ô dữ liệu. Mỗi ô chỉ cần chứa 4 bytes dữ liệu (số thực) là mất bố nó 16 GB rồi !!!
Hàng này Access hay SQL Server Express (phiên bản chùa của SQL Server) cũng chịu thua, nói chi Excel.
Nếu dùng Excl 2016 thì may ra có thể dùng Power Query đưa nó vào Data Model để làm việc. Data Model ngầm chứa bộ máy SQL Server cho nên hy vọng sử lý dữ liệu khủng hiệu quả hơn.
 
Upvote 0
Đây là dân chơi hàng KHỦNG. Bạn vàng ơi.

Cái từ "trung bình" ở trên hàm nghĩa rằng có nhiều files lắm, và có những files trên 4000 cột, trên triệu dòng. Tối thiểu 4 tỷ ô dữ liệu. Mỗi ô chỉ cần chứa 4 bytes dữ liệu (số thực) là mất bố nó 16 GB rồi !!!
Hàng này Access hay SQL Server Express (phiên bản chùa của SQL Server) cũng chịu thua, nói chi Excel.
Nếu dùng Excl 2016 thì may ra có thể dùng Power Query đưa nó vào Data Model để làm việc. Data Model ngầm chứa bộ máy SQL Server cho nên hy vọng sử lý dữ liệu khủng hiệu quả hơn.
Dạ. Đúng ra là tầm 3324 cột. 856.000 dòng
Mà file CSV tầm hơn 300 Mb à.
Cũng k hiểu sao nó nhẹ vậy.
Đinh chính là 300 chứ k phải 30
 
Lần chỉnh sửa cuối:
Upvote 0
Trong code em dùng Dic, key của em có cái dạng số có cái dạng text (ví dụ 100 và '100). Làm thế nào để quy 2 cái này là cùng 1 key. Có cách nào chuyển đổi cái text kia sang số trước khi add vào Dic không?
 
Upvote 0
Trong code em dùng Dic, key của em có cái dạng số có cái dạng text (ví dụ 100 và '100). Làm thế nào để quy 2 cái này là cùng 1 key. Có cách nào chuyển đổi cái text kia sang số trước khi add vào Dic không?
Val(Text) chuyển Text có dạng số thành Numer, CStr(Number) chuyển thành Text.
 
Upvote 0
Trong code em dùng Dic, key của em có cái dạng số có cái dạng text (ví dụ 100 và '100). Làm thế nào để quy 2 cái này là cùng 1 key. Có cách nào chuyển đổi cái text kia sang số trước khi add vào Dic không?
Dơn giản hơn là khi bạn thêm 1 keys mới.Thì bạn gán luôn thuộc tính của nó là string.Bằng cách khai báo biến string rồi lấy giá trị cho nó bằng cái mà bạn định tạo mới.
 
Upvote 0
Val(Text) chuyển Text có dạng số thành Numer, CStr(Number) chuyển thành Text.
Được rồi ạ, em cảm ơn anh nhé!
Bài đã được tự động gộp:

Dơn giản hơn là khi bạn thêm 1 keys mới.Thì bạn gán luôn thuộc tính của nó là string.Bằng cách khai báo biến string rồi lấy giá trị cho nó bằng cái mà bạn định tạo mới.
Mình chưa hiểu lắm, tem mình khai báo là as string rồi nhưng không thấy được.
 
Lần chỉnh sửa cuối:
Upvote 0
Chào mọi người em tập viết 1 Sub để hiển thị tên từng sheet và số lượng các sheet. Nhưng bị lỗi, nhờ mọi người giúp em với. Em xin cám ơn
Mã:
Sub Vonglap_For8()
    Dim mysheet As Worksheet 'Khai bao bien la Worksheet
    Dim i As Integer
    For Each mysheet In Worsheet 'Duyet qua tung Worksheet
    MsgBox mysheet.Name
    i = i + 1
    Next mysheet
    MsgBox "So sheets trong Worksheet la: " & i
End Sub
 
Upvote 0
Chào mọi người em tập viết 1 Sub để hiển thị tên từng sheet và số lượng các sheet. Nhưng bị lỗi, nhờ mọi người giúp em với. Em xin cám ơn
Mã:
Sub Vonglap_For8()
    Dim mysheet As Worksheet 'Khai bao bien la Worksheet
    Dim i As Integer
    For Each mysheet In Worsheet 'Duyet qua tung Worksheet
    MsgBox mysheet.Name
    i = i + 1
    Next mysheet
    MsgBox "So sheets trong Worksheet la: " & i
End Sub
PHP:
Sub Vonglap_For8()
    Dim mysheet As Worksheet
    Dim i As Integer
    For Each mysheet In ActiveWorkbook.Worksheets
    
    MsgBox mysheet.Name
    i = i + 1
    Next mysheet
    MsgBox "So sheets trong Worksheet la: " & i
End Sub
 
Upvote 0
Web KT
Back
Top Bottom