Những câu hỏi về code, xin giải thích các code, đề nghị các bạn gửi vào đây

Liên hệ QC
Status
Không mở trả lời sau này.

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Kể từ hôm nay, tất cả những câu hỏi nhờ giải thích dùm một đoạn code, hay là hỏi những vấn đề linh tinh gì liên quan đến cách viết code, đề nghị các bạn gửi chung vào đây.

Những đề tài mới với tiêu đề: "Nhờ giải thích dùm đoạn code", mà không nói rõ là code gì, code dùng để làm gì, sẽ bị xóa.

BQT

----------------------------------------------------------------------------------------------------------------


Em xin được hỏi 2 đoạn code sau có tương đương nhau ?

Cells(Cells.Rows.Count, 1).End(xlUp).Row có tương đương với [A65000].End(xlup).row

Cám ơn các anh chỉ giáo
 
Chỉnh sửa lần cuối bởi điều hành viên:
Nhờ các thầy và mọi người xem dùm 2 đoạn code VBA sau
Đoạn 1:
Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$B$2" Then
Range("A35").Select
Selection.CurrentRegion.Select
Selection.ClearContents
Set DS = [A4].CurrentRegion
DS.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("B1:B2"), CopyToRange:=Range("A35")
End If
End Sub

Đoạn 2:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$cc$10" Then
Range("BD15").Select
Selection.CurrentRegion.Select
Selection.ClearContents
Set DS = [A15].CurrentRegion
DS.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("CC9:CC10"), CopyToRange:=Range("BD15")
End If
End Sub

trong 2 file khác nhau thì:
Đoạn 1 chạy được
Đoạn 2 không chạy
nhờ mọi người sửa Code File Tu Dong Loc
 

File đính kèm

  • Tu Dong Loc.xlsm
    38.1 KB · Đọc: 8
  • AutoFilter sang vung khac_01.xls
    34.5 KB · Đọc: 4
Upvote 0
Nhờ các thầy và mọi người xem dùm 2 đoạn code VBA sau
Đoạn 1:
Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address = "$B$2" Then
Range("A35").Select
Selection.CurrentRegion.Select
Selection.ClearContents
Set DS = [A4].CurrentRegion
DS.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("B1:B2"), CopyToRange:=Range("A35")
End If
End Sub

Đoạn 2:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$cc$10" Then
Range("BD15").Select
Selection.CurrentRegion.Select
Selection.ClearContents
Set DS = [A15].CurrentRegion
DS.AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range("CC9:CC10"), CopyToRange:=Range("BD15")
End If
End Sub

trong 2 file khác nhau thì:
Đoạn 1 chạy được
Đoạn 2 không chạy
nhờ mọi người sửa Code File Tu Dong Loc

Phải sửa lại chỗ này :
PHP:
Target.Address = "$CC$10"
mình sửa lại cho dễ nhìn :
[GPECODE=vb]
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$CC$10" Then
[BD15].CurrentRegion.ClearContents
[A15:BA1000].AdvancedFilter 2, [CC9:CC10], [BD15]
End If
End Sub
[/GPECODE]
 
Upvote 0
Phải sửa lại chỗ này :
PHP:
Target.Address = "$CC$10"
mình sửa lại cho dễ nhìn :
[GPECODE=vb]
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$CC$10" Then
[BD15].CurrentRegion.ClearContents
[A15:BA1000].AdvancedFilter 2, [CC9:CC10], [BD15]
End If
End Sub
[/GPECODE]

Như vầy mới đúng chứ chú!

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$CC$10" Then
        Range([A15], [A65536].End(3)).Resize(, 29).AdvancedFilter 2, [CC9:CC10], [COLOR=#ff0000][BD15:CE15][/COLOR]
    End If
End Sub

Với AdvancedFilter thì không cần Clear đâu nhé! Thêm vào chạy chậm code thôi hen!
 
Upvote 0
Như vầy mới đúng chứ chú!

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$CC$10" Then
        Range([A15], [A65536].End(3)).Resize(, 29).AdvancedFilter 2, [CC9:CC10], [COLOR=#ff0000][BD15:CE15][/COLOR]
    End If
End Sub

Với AdvancedFilter thì không cần Clear đâu nhé! Thêm vào chạy chậm code thôi hen!

Dạ viết như anh cũng được ,nhưng em thấy:
*với Advanced nó sẽ tìm đến vị trí cuối cùng có dữ liệu, vì thế em hay khai báo thừa ra,( không cần dùng xlUp,xlEnd..)
* Em dùng phương thức clear để phòng trường hợp giá trị dữ liệu lọc lần trước vẫn còn ( sợ lẫn lôn vào nhau !)
* Nếu là copy thì em test thấy [BD15] hay [BD15:CE15] Advanced vấn paste được toàn bộ giá trị lọc vào vùng cần copy

<-------- Hổng biết có đúng không ?
 
Upvote 0
Dạ viết như anh cũng được ,nhưng em thấy:
*với Advanced nó sẽ tìm đến vị trí cuối cùng có dữ liệu, vì thế em hay khai báo thừa ra,( không cần dùng xlUp,xlEnd..)
* Em dùng phương thức clear để phòng trường hợp giá trị dữ liệu lọc lần trước vẫn còn ( sợ lẫn lôn vào nhau !)
* Nếu là copy thì em test thấy [BD15] hay [BD15:CE15] Advanced vấn paste được toàn bộ giá trị lọc vào vùng cần copy

<-------- Hổng biết có đúng không ?

1) Nên chọn vùng chính xác, đó là tác phong chuyên nghiệp của người lập trình

2) Với Clear, bạn cứ thử lúc đầu là <=4, lúc sau, bạn chọn giá trị =1 xem sao! Dĩ nhiên, nó tự xóa các giá trị khác mà không để lại dấu vết gì. Khi tôi đã nói thêm clear là làm chậm code thì tôi đã thường xuyên thực hiện nó rồi!

3) Copy ở vùng chứa "tiêu đề cột" nào thì nó lọc đúng tiêu đề cột đó, không phải nó chọn ngẩu nhiên mà được!
 
Upvote 0
1) Nên chọn vùng chính xác, đó là tác phong chuyên nghiệp của người lập trình

2) Với Clear, bạn cứ thử lúc đầu là <=4, lúc sau, bạn chọn giá trị =1 xem sao! Dĩ nhiên, nó tự xóa các giá trị khác mà không để lại dấu vết gì. Khi tôi đã nói thêm clear là làm chậm code thì tôi đã thường xuyên thực hiện nó rồi!

3) Copy ở vùng chứa "tiêu đề cột" nào thì nó lọc đúng tiêu đề cột đó, không phải nó chọn ngẩu nhiên mà được!


^^, Cảm ơn anh nhiều !
Em xin bổ sung thêm 1 câu lệnh :
[GPECODE=vb]
ActiveSheet.AutoFilterMode = False
[/GPECODE]
 
Upvote 0
^^, Cảm ơn anh nhiều !
Em xin bổ sung thêm 1 câu lệnh :
[GPECODE=vb]
ActiveSheet.AutoFilterMode = False
[/GPECODE]

Khỏi bổ sung em trai! Dù cho nó có AutoFilter trước dữ liệu, nó vẫn lọc được như thường!

Hãy xem dữ liệu đã Filter nhé! Đồng thời, anh chỉ lấy dữ liệu vùng [BD15:BI15] tức là các tiêu đề có giá trị, mấy cái khác không thích không thêm vô.

Test nhé!
 

File đính kèm

  • AdvancedFilter.xls
    85 KB · Đọc: 16
Upvote 0
Khỏi bổ sung em trai! Dù cho nó có AutoFilter trước dữ liệu, nó vẫn lọc được như thường!

Hãy xem dữ liệu đã Filter nhé! Đồng thời, anh chỉ lấy dữ liệu vùng [BD15:BI15] tức là các tiêu đề có giá trị, mấy cái khác không thích không thêm vô.

Test nhé!

Không anh ah, ý em là nếu người dùng để chế độ filter trước thì cái xlUP sẽ không xác định đúng vùng dữ liệu : Cụ thể
nếu người dùng filter cột Code các giá trị <2 đi, thì khi nhập vào giá trị criteria =4 ===> advanced filter sẽ không đúng nữa, vì cái End(3) xác định không đúng vùng dữ liệu !
do đó em mới bổ sung cái autofiltermode = fasle
còn nếu không thì phải dùng .currentRegion anh ah <----------- Hổng biết có đúng không ?
 
Upvote 0
Không anh ah, ý em là nếu người dùng để chế độ filter trước thì cái xlUP sẽ không xác định đúng vùng dữ liệu : Cụ thể
nếu người dùng filter cột Code các giá trị <2 đi, thì khi nhập vào giá trị criteria =4 ===> advanced filter sẽ không đúng nữa, vì cái End(3) xác định không đúng vùng dữ liệu !
do đó em mới bổ sung cái autofiltermode = fasle
còn nếu không thì phải dùng .currentRegion anh ah <----------- Hổng biết có đúng không ?
OK, vấn đề này mình đồng ý! Vì liên quan đến vấn đề xác định hàng nên phải dùng đến nó!
 
Upvote 0
Cảm ơn 2 Anh đã giúp đỡ, Code của hai anh ngắn nhưng chạy vẫn đảm bảo đúng, VBA em mới thử tập Record lại và sửa lại thôi, Code ban đầu em gửi chỉ là tư duy thủ công, cái sai chính của em là không viết hoa địa chỉ ô, hóa ra trong VBA có phân biệt chữ hoa và chữ thường phải không mọi người?
 
Upvote 0
Cảm ơn 2 Anh đã giúp đỡ, Code của hai anh ngắn nhưng chạy vẫn đảm bảo đúng, VBA em mới thử tập Record lại và sửa lại thôi, Code ban đầu em gửi chỉ là tư duy thủ công, cái sai chính của em là không viết hoa địa chỉ ô, hóa ra trong VBA có phân biệt chữ hoa và chữ thường phải không mọi người?
Bạn Reccord xong mở code ra sửa địa chỉ ô thành chữ thường hết, rồi chạy code lại thử xem thế nào.
 
Upvote 0
Chỉnh lỗi code giúp mình

Em có code này mục đích là đứng sheet khác vẫn có thể chạy lệnh này, nhưng ko hiểu sao mình cho vào lệnh With Sheets / End With mà nó vẫn ko thực hiện được, phải đứng tại sheet đó nó mới cho chạy lệnh. Code này do một người bạn viết dùm em đọc thì em hiểu đại ý, nhưng còn thắc mắc ở chỗ đặt "I", nếu cao thủ nào hiểu thì viết rút gọn dùm em luôn được ko.
Chân thành cám ơn.
PHP:
Public Sub chuyendulieu()
Dim Vung As Range, I As Long
With Worksheets("MaKH")
 On Error Resume Next
    .Range([E8], [E5000].End(xlUp)).SpecialCells(2).ClearContents
    Set Vung = .Range([E8], [E5000].End(xlUp))
        For I = 1 To Vung.Rows.Count
                   If Vung(I) = "" And Vung(I).Offset(, -1) <> 0 Then Vung(I) = Vung(I).Offset(, -1)
        Next
End With
End Sub
 
Upvote 0
Em có code này mục đích là đứng sheet khác vẫn có thể chạy lệnh này, nhưng ko hiểu sao mình cho vào lệnh With Sheets / End With mà nó vẫn ko thực hiện được, phải đứng tại sheet đó nó mới cho chạy lệnh. Code này do một người bạn viết dùm em đọc thì em hiểu đại ý, nhưng còn thắc mắc ở chỗ đặt "I", nếu cao thủ nào hiểu thì viết rút gọn dùm em luôn được ko.
Chân thành cám ơn.
PHP:
Public Sub chuyendulieu()
Dim Vung As Range, I As Long
With Worksheets("MaKH")
 On Error Resume Next
    .Range([E8], [E5000].End(xlUp)).SpecialCells(2).ClearContents
    Set Vung = .Range([E8], [E5000].End(xlUp))
        For I = 1 To Vung.Rows.Count
                   If Vung(I) = "" And Vung(I).Offset(, -1) <> 0 Then Vung(I) = Vung(I).Offset(, -1)
        Next
End With
End Sub

Thiếu quá trời dấu chấm
Mã:
Public Sub chuyendulieu()
Dim Vung As Range, I As Long
With Worksheets("MaKH")
 On Error Resume Next
    [COLOR=#ff0000][SIZE=5].[/SIZE][/COLOR]Range([COLOR=#ff0000][SIZE=5].[/SIZE][/COLOR][E8], [COLOR=#ff0000][SIZE=5].[/SIZE][/COLOR][E5000].End(xlUp)).SpecialCells(2).ClearContents
    Set Vung = [COLOR=#ff0000][SIZE=5].[/SIZE][/COLOR]Range([COLOR=#ff0000][SIZE=5].[/SIZE][/COLOR][E8], [COLOR=#ff0000][SIZE=5].[/SIZE][/COLOR][E5000].End(xlUp))
        For I = 1 To Vung.Rows.Count
                   If Vung(I) = "" And Vung(I).Offset(, -1) <> 0 Then Vung(I) = Vung(I).Offset(, -1)
        Next
End With
End Sub
Thử thêm mấy dấu chấm màu đò như tôi làm ở trên rồi test lại xem thế nào
 
Upvote 0
Giúp lỗi VBA

Nhờ các bạn giúp mình lỗi đoạn code sau mình làm mãi không được!

Sub SL_LayDL()
Dim cnn, rst As Object
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
Dim lsSQL As String
With cnn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "Data Source=" & ThisWorkbook.Path & "\Database.accdb"
.Open

End With
lsSQL = "SELECT DataSLTH.MAGIAY, DataSLTH.SL, DataSLTH.Ghichu " & _
"FROM DataSLTH " & _
"where DataSLTH.THANG=[C5]"
rst.Open lsSQL, cnn, 1, 3 (lỗi tại đây)
[b5:g6000].ClearContents
[b5].CopyFromRecordset rst

rst.Close: Set rst = Nothing
cnn.Close: Set cnn = Nothing

End Sub
 
Upvote 0
Nhờ các bạn giúp mình lỗi đoạn code sau mình làm mãi không được!

Sub SL_LayDL()
Dim cnn, rst As Object
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
Dim lsSQL As String
With cnn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "Data Source=" & ThisWorkbook.Path & "\Database.accdb"
.Open

End With
lsSQL = "SELECT DataSLTH.MAGIAY, DataSLTH.SL, DataSLTH.Ghichu " & _
"FROM DataSLTH " & _
"where DataSLTH.THANG=[C5]"
rst.Open lsSQL, cnn, 1, 3 (lỗi tại đây)
[b5:g6000].ClearContents
[b5].CopyFromRecordset rst

rst.Close: Set rst = Nothing
cnn.Close: Set cnn = Nothing

End Sub

Thử kiểm tra như vầy xem :
Mã:
[COLOR=#000000]lsSQL = "SELECT DataSLTH.MAGIAY, DataSLTH.SL, DataSLTH.Ghichu [/COLOR][COLOR=#000000]FROM [ DataSLTH ]"[/COLOR]
[COLOR=#000000]Kiểm tra lại câu lệnh điều kiện Where xem [C5] ???[/COLOR]
rst.Open lsSQL, cnn, 3, 1,1
 
Lần chỉnh sửa cuối:
Upvote 0
Mình đã làm đúng ô điều kiện rồi!
bạn xem file đính kèm nhé!
 

File đính kèm

  • Desktop.zip
    447.6 KB · Đọc: 7
Upvote 0
Mình đã làm đúng ô điều kiện rồi!
bạn xem file đính kèm nhé!
Mình bảo đk Where bạn viết sai mà !
[GPECODE=vb]
Sub SL_LayDL()
Dim cnn, rst As Object
Set cnn = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
Dim lsSQL As String
With cnn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "Data Source=" & ThisWorkbook.Path & "\Database.accdb"
.Open


End With
lsSQL = "SELECT MAGIAY,SL,THANG,Ghichu " & _
"FROM DataSLTH " & _
"where THANG= " & [C3]
rst.Open lsSQL, cnn, 3, 1, 1
[A5:C6000].ClearContents
[A5].CopyFromRecordset rst

rst.Close: Set rst = Nothing
cnn.Close: Set cnn = Nothing


End Sub
[/GPECODE]
 
Upvote 0
Bạn ơi cho mình hỏi luôn có đoạn code nào vừa có thể update và thêm mới như đoạn code này không?

Sub SL_Update()
On Error GoTo loi
Set Cn = CreateObject("ADODB.Connection")
Dim MySQL As String
With Cn
MySQL = "UPDATE [DataSLTH] b " _
& "right JOIN " _
& "[Excel 8.0;HDR=Yes;IMEX=2;DATABASE=" _
& ThisWorkbook.FullName & "].[Sanluong$A4:E6000] a " _
& "ON b.ThangID=a.ThangID " _
& "SET b.MAGIAY=a.MAGIAY,b.SL=a.SL," _
& "b.THANG=a.THANG,b.Ghichu=a.Ghichu," _
& "b.ThangID=a.ThangID " _
& "where a.ThangID is not null"
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "Data Source=" & ThisWorkbook.Path & "\Database.accdb"
.CursorLocation = adUseClient
.Open
.Execute MySQL
.Close
End With
Set Cn = Nothing
Exit Sub
loi:
MsgBox Err.Description
End Sub

cách của mình nó sẽ rất bất tiện nếu trong data có nhiều cột thì làm cực lăm! bạn giúp mình nhé!

cảm ơn bạn!
 
Upvote 0
Bạn ơi cho mình hỏi luôn có đoạn code nào vừa có thể update và thêm mới như đoạn code này không?

Sub SL_Update()
On Error GoTo loi
Set Cn = CreateObject("ADODB.Connection")
Dim MySQL As String
With Cn
MySQL = "UPDATE [DataSLTH] b " _
& "right JOIN " _
& "[Excel 8.0;HDR=Yes;IMEX=2;DATABASE=" _
& ThisWorkbook.FullName & "].[Sanluong$A4:E6000] a " _
& "ON b.ThangID=a.ThangID " _
& "SET b.MAGIAY=a.MAGIAY,b.SL=a.SL," _
& "b.THANG=a.THANG,b.Ghichu=a.Ghichu," _
& "b.ThangID=a.ThangID " _
& "where a.ThangID is not null"
.Provider = "Microsoft.ACE.OLEDB.12.0"
.ConnectionString = "Data Source=" & ThisWorkbook.Path & "\Database.accdb"
.CursorLocation = adUseClient
.Open
.Execute MySQL
.Close
End With
Set Cn = Nothing
Exit Sub
loi:
MsgBox Err.Description
End Sub

cách của mình nó sẽ rất bất tiện nếu trong data có nhiều cột thì làm cực lăm! bạn giúp mình nhé!

cảm ơn bạn!

Nếu mà có nhiều cột thì bạn sẽ phải dùng vòng lặp For ... Next tạo một chuỗi str thỏa mãn và gán vào câu lệnh SQL thôi
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom