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

Status
Không mở trả lời sau này.

hieuxd

Thành viên tích cực
Tham gia ngày
27 Tháng năm 2009
Bài viết
845
Được thích
1,140
Điểm
860
Nơi ở
Hà Nội
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

hungpecc1

Thành viên gắn bó
Tham gia ngày
24 Tháng tám 2012
Bài viết
1,617
Được thích
2,209
Điểm
560
Tuổi
33
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]
 

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia ngày
17 Tháng tám 2008
Bài viết
7,620
Được thích
15,205
Điểm
1,910
Tuổi
43
Nơi ở
TPHCM
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!
 

hungpecc1

Thành viên gắn bó
Tham gia ngày
24 Tháng tám 2012
Bài viết
1,617
Được thích
2,209
Điểm
560
Tuổi
33
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 ?
 

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia ngày
17 Tháng tám 2008
Bài viết
7,620
Được thích
15,205
Điểm
1,910
Tuổi
43
Nơi ở
TPHCM
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!
 

hungpecc1

Thành viên gắn bó
Tham gia ngày
24 Tháng tám 2012
Bài viết
1,617
Được thích
2,209
Điểm
560
Tuổi
33
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]
 

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia ngày
17 Tháng tám 2008
Bài viết
7,620
Được thích
15,205
Điểm
1,910
Tuổi
43
Nơi ở
TPHCM
^^, 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

hungpecc1

Thành viên gắn bó
Tham gia ngày
24 Tháng tám 2012
Bài viết
1,617
Được thích
2,209
Điểm
560
Tuổi
33
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 ?
 

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia ngày
17 Tháng tám 2008
Bài viết
7,620
Được thích
15,205
Điểm
1,910
Tuổi
43
Nơi ở
TPHCM
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ó!
 

hieuxd

Thành viên tích cực
Tham gia ngày
27 Tháng năm 2009
Bài viết
845
Được thích
1,140
Điểm
860
Nơi ở
Hà Nội
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?
 

thanhlanh

Thành viên tích cực
Tham gia ngày
21 Tháng hai 2008
Bài viết
840
Được thích
1,215
Điểm
860
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.
 

kobebryant

Thành viên hoạt động
Tham gia ngày
7 Tháng tám 2009
Bài viết
177
Được thích
21
Điểm
670
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
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,185
Được thích
52,462
Điểm
11,910
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
 

huyhoang_mmyeht

Thành viên hoạt động
Tham gia ngày
5 Tháng năm 2009
Bài viết
115
Được thích
2
Điểm
370
Tuổi
37
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
 

hungpecc1

Thành viên gắn bó
Tham gia ngày
24 Tháng tám 2012
Bài viết
1,617
Được thích
2,209
Điểm
560
Tuổi
33
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:

huyhoang_mmyeht

Thành viên hoạt động
Tham gia ngày
5 Tháng năm 2009
Bài viết
115
Được thích
2
Điểm
370
Tuổi
37
Mình đã làm đúng ô điều kiện rồi!
bạn xem file đính kèm nhé!
 

File đính kèm

hungpecc1

Thành viên gắn bó
Tham gia ngày
24 Tháng tám 2012
Bài viết
1,617
Được thích
2,209
Điểm
560
Tuổi
33
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]
 

huyhoang_mmyeht

Thành viên hoạt động
Tham gia ngày
5 Tháng năm 2009
Bài viết
115
Được thích
2
Điểm
370
Tuổi
37
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!
 

hungpecc1

Thành viên gắn bó
Tham gia ngày
24 Tháng tám 2012
Bài viết
1,617
Được thích
2,209
Điểm
560
Tuổi
33
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
 
Status
Không mở trả lời sau này.
Top Bottom