Chuyên mục xử lý, gỡ rối code VBA (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,954
Mình đang từng bước viết lại code của file quản lý bán hàng mà mình đang sử dụng gặp phải 1 vấn đề rắc rối mà chưa xử lý xong úp bài nhờ các Bạn xử lý dùm
1/ Cùng một vấn đề như nhau mình sử Dụng DAO ghi dữ liệu từ Mảng trên Excel vào Table File Access thì chạy tốt ... Nhưng khi mình sử Dụng ADO để ghi vào thì nó báo lỗi "Data type mismatch in criteria expression" tạm dịch kiểu dữ liệu không phù hợp ....

2/ Mình có vào Tables\View chỉnh lại kiểu dữ liệu các kiểu vẫn không được ...cũng không biết sai cái gì ... code viết sai khúc nào ...???

3/ Code trong File mình làm 2 trường hợp là DAO và ADO ... nhờ các bạn xử lý dùm mình phần ADO nó lỗi không chạy được
xim cảm Ơn
Mã:
Private Cnn As New ADODB.Connection
Private Rst As New ADODB.Recordset
Private AccPath As String, TableName As String
Private SQL As String, MyString As String
Rem ==========
Private Function Connection(ByVal AccPath As String) As ADODB.Connection
    Rem Tools/References - VBAProject/Microsoft ActiveX Data Objects 6.1 Library
    Set Cnn = New ADODB.Connection
    Cnn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=") _
        & AccPath & ";Persist Security Info=False"
    Set Connection = Cnn
End Function
Rem ==========
Private Sub CopyTableName(ByVal AccPath As String, ByVal TableName As String, ByVal Target As Range)
    Target.CopyFromRecordset Connection(AccPath).Execute(TableName)
End Sub
Rem ==========
Private Sub InsertQuery(ByVal Cnn As ADODB.Connection, ByVal TableName$, sArr(), _
                       Optional ByVal ColFilter = "", Optional ByVal DelTableName As Boolean = False)
    Dim i As Long, j As Long, Qry As String
    Set Rst = New ADODB.Recordset
    If ColFilter = "" Then ColFilter = 1
    If ColFilter = 0 Or ColFilter > UBound(sArr, 2) Then Exit Sub
'    On Error GoTo Errorhandler          ''Xu Ly loi khi mang Lon Hon tableName Or vv...
    Rem Set Cnn = Connection(AccPath)    ''Bo Tham So Cnn ap dung cho Chay Nhieu Sub truyen 1 Lan Tham So Cnn
    If DelTableName Then Cnn.Execute ("DELETE * FROM ") & TableName
    For i = 1 To UBound(sArr, 1)
        Qry = " INSERT INTO " & TableName & " VALUES(" & i
        If sArr(i, ColFilter) <> "" Then
            For j = 1 To UBound(sArr, 2)
                Qry = Qry & ", " & GetValue(sArr(i, j))
            Next
            Qry = Qry & " )"
            Rst.Open Qry, Cnn, adOpenStatic, adLockOptimistic
        End If
    Next
    Cnn.Close: Set Cnn = Nothing
'    Exit Sub
'Errorhandler:
'    MsgBox "Error #: " & Err.Number _
'        & vbCrLf & Err.Description
'    Rem Range("B1").Value = Err.Number & Err.Description            ''Search Google For Err
    Err.Clear
End Sub
Rem ==========
Public Sub Main_ADO()
    Dim Arr()
    TableName = "NhapXuatTon"
    AccPath = ThisWorkbook.Path & "\QLBHPN.accdb"
    Set Cnn = Connection(AccPath)
    Arr = Range("B4:I100").Value
    ''Call InsertQuery(Cnn, TableName, Arr(), 1, False)
    Call InsertQuery(Cnn, TableName, Arr(), 1, True)
    Sheet4.Range("K4:S1000").ClearContents
    Call CopyTableName(AccPath, TableName, Sheet4.Range("K4"))
End Sub

[code]
Bài này khó quá hay sao mà ko thấy bạn nào giúp mình một tẹo he
 
Upvote 0
Bài #1555 Mạnh tạm thời xử lý xong
1/ Nó báo lỗi kiểu dữ liêu ko phù hợp là do trong mãng có dòng = Empty ...Nhưng mạnh vẫn suy nghĩ tại sao cùng 1 vấn đề đó mà DAO xử lý ok còn ADO báo Lỗi

2/ Nếu ta xét điều kiện trong Mãng mà = Empty thì cho nó = 0 lại OK ...tại sao ?!
If IsEmpty(sArr(x, y)) Then sArr(x, y) = 0

Phải chăng phải có cái gì đó cho nó ghi mới OK còn bỏ trống là lỗi

3/ Nếu ta chạy code đó cho TableName khác mà có Trường dữ liệu Format là Ngay/thang/nam thì nó lại báo lỗi ....Còn DAO thì kiểu gì cũng chơi hết ... Tại SAO ?!

4/ Bạn nào biết chỉ dùm mạnh một chút .... để Mạnh viết 1 cái Hàm InsertQuery Sử dụng ADO có thể xài cho nhiều trường hợp khác nhau như sử dụng DAO

Code sau đã điều chỉnh chạy tốt cho bài #1555
PHP:
Public Sub InsertQuery(ByVal Cnn As ADODB.Connection, ByVal TableName$, sArr(), _
                       Optional ByVal ColFilter = "", Optional ByVal DelTableName As Boolean = False)
    Rem Cu Phap: Call InsertMySQL(Cnn, TableName, Arr(), 1, True)       ''Xoa Du Lieu cu Luu Moi
    Rem Cu Phap: Call InsertMySQL(Cnn, TableName, Arr(), 1, False)      ''Ghi du lieu Moi noi xuong
    Rem ColFilter = 1 Xet Cot trong Mang sArr() Neu co du lieu thi lay
    Dim x As Long, y As Long, Qry As String
    Set Rst = New ADODB.Recordset
    If ColFilter = "" Then ColFilter = 1
    If ColFilter = 0 Or ColFilter > UBound(sArr, 2) Then Exit Sub
    On Error GoTo Errorhandler
    If DelTableName Then Cnn.Execute ("DELETE * FROM ") & TableName
    For x = 1 To UBound(sArr, 1)
        Qry = " INSERT INTO " & TableName & " VALUES(" & x
        If sArr(x, ColFilter) <> "" Then
            For y = 1 To UBound(sArr, 2)
                If IsEmpty(sArr(x, y)) Then sArr(x, y) = 0
                Qry = Qry & ", " & GetValue(sArr(x, y))
            Next
            Qry = Qry & " )"
            Rst.Open Qry, Cnn, 3, 3
        End If
    Next
    Rst.Close: Set Rst = Nothing
    Cnn.Close: Set Cnn = Nothing
    Exit Sub
Errorhandler:
    MsgBox "Error #: " & Err.Number & vbCrLf & Err.Description
    Err.Clear
End Sub

Mong Các Bạn chỉ thêm... Mấy cái tại sao mà ngủ mất ngon :D
Xin cảm ơn
 
Upvote 0
Chào thầy!
em co file đính kèm, e học cachsc viết về array, nhưng e xử lý code trong một Sub, em muốn tạo hàm con khi nhật dong và cột vào ô excel,nhưng bị báo lỗi , mon thầy giúp dum em sai chổ nào
thanks
 

File đính kèm

Upvote 0
Chào thầy!
em co file đính kèm, e học cachsc viết về array, nhưng e xử lý code trong một Sub, em muốn tạo hàm con khi nhật dong và cột vào ô excel,nhưng bị báo lỗi , mon thầy giúp dum em sai chổ nào
thanks
Nếu viết hàm thì dùng Function chứ sao lại là Sub, báo lỗi là đúng rồi.
 
Upvote 0
Chào thầy!
em co file đính kèm, e học cachsc viết về array, nhưng e xử lý code trong một Sub, em muốn tạo hàm con khi nhật dong và cột vào ô excel,nhưng bị báo lỗi , mon thầy giúp dum em sai chổ nào
thanks
Bạn viết vầy:
Mã:
RES = GPE(rowa, cola)
là sai cú pháp
Phải vầy mới đúng:
Mã:
GPE rowa, cola
 
Upvote 0
Bạn viết vầy:
Mã:
RES = GPE(rowa, cola)
là sai cú pháp
Phải vầy mới đúng:
Mã:
GPE rowa, cola
cám ơn thầy, cũng với code đó: em muốn tách riêng ra hàm con, vì trong chương trình của em có nhiền điều kiện để chọn hàng và cột nên khi gọi cột 1 thì chỉ cần gọi chương trình con lên và chạy, e chưa hiểu lắm về cách xuất ra

xin lỗi thầy, em đã làm được, thầy xóa giúp em bài của em
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
cám ơn thầy, cũng với code đó: em muốn tách riêng ra hàm con, vì trong chương trình của em có nhiền điều kiện để chọn hàng và cột nên khi gọi cột 1 thì chỉ cần gọi chương trình con lên và chạy, e chưa hiểu lắm về cách xuất ra

xin lỗi thầy, em đã làm được, thầy xóa giúp em bài của em
Tôi thắc mắc tại sao bài này bạn không dùng VLOOKUP?
Ví dụ:
Mã:
=VLOOKUP(K4,$A$2:$I$14,MATCH(K5,$A$2:$I$2,0),0)
 
Upvote 0
Tôi thắc mắc tại sao bài này bạn không dùng VLOOKUP?
Ví dụ:
Mã:
=VLOOKUP(K4,$A$2:$I$14,MATCH(K5,$A$2:$I$2,0),0)
vì e đang lam chương trinh tim kiếm NVL, nên k xài Vlookup
đính kèm là 1 phần chương trình
nhưng khi em gọi hàm thì báo lỗi Byref argument type mismatch
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
vì e đang lam chương trinh tim kiếm NVL, nên k xài Vlookup
đính kèm là 1 phần chương trình
nhưng khi em gọi hàm thì báo lỗi Byref argument type mismatch
Nó không chịu byRef thì mình byVal
Mã:
Function terminal(ByVal ter As String, ByVal wire As String, Darr())
  Dim Arr(1 To 100, 1 To 3), i As Long, j As Long, iR As Long, DK As String
  For i = 2 To UBound(Darr)
    If Darr(i, 1) = ter Then
      For j = 2 To UBound(Darr, 2)
        If Darr(1, j) = wire Then
          terminal = Darr(i, j)
          Exit Function
        End If
      Next j
    End If
  Next i
End Function
Sửa đại vậy thôi chứ chương trình của bạn muốn ngon cần phải cải thiện rất nhiều
 
Upvote 0
Nó không chịu byRef thì mình byVal
Mã:
Function terminal(ByVal ter As String, ByVal wire As String, Darr())
  Dim Arr(1 To 100, 1 To 3), i As Long, j As Long, iR As Long, DK As String
  For i = 2 To UBound(Darr)
    If Darr(i, 1) = ter Then
      For j = 2 To UBound(Darr, 2)
        If Darr(1, j) = wire Then
          terminal = Darr(i, j)
          Exit Function
        End If
      Next j
    End If
  Next i
End Function
Sửa đại vậy thôi chứ chương trình của bạn muốn ngon cần phải cải thiện rất nhiều
cám ơn thầy
 
Upvote 0
cũng chương trình của em, muốn tạo Combobox theo dòng đầu tiên trong Sheet Terminal, nhưng viết chương trình con và xuất theo điều kiện:
Mã:
For i = 2 To UBound(Darr)
    If Darr(i, 1) = ter Then
      For j = 2 To UBound(Darr, 2)
        If Darr(i, j) > 0 Then
                       Darr(1, j)
         End If  
      Next j
End If
Next i
[code]

em o viết theo Dictionary nhưng chưa hiểu củ pháp
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các anh chị.
Hiện tại tôi đang tập sử dụng VBA để viết 1 số macro tích hợp vào file theo dõi thông tin của mình, nhưng gần đây file xuất hiện lỗi error in loading DLL.
Hiện tại tôi không biết nguyên nhân như thế nào, mong các bác chỉ giúp
 

File đính kèm

Upvote 0
Chào các anh chị.
Hiện tại tôi đang tập sử dụng VBA để viết 1 số macro tích hợp vào file theo dõi thông tin của mình, nhưng gần đây file xuất hiện lỗi error in loading DLL.
Hiện tại tôi không biết nguyên nhân như thế nào, mong các bác chỉ giúp
Vào tool/references rồi bỏ những cái có chữ mising đi.
 
Upvote 0
Anh chị cho em hỏi, em có làm đoạn macro bảng chấm công để lấy dữ liệu từ 2 file. Nhưng hiện tại em đang mắc 1 vấn đề là nếu kế hoạch tháng 2 đều có trong 2 file PXDuc_201802 và PXDuc_201803 thì khi chọn cả 2 file thì chỉ lấy dữ liệu của tháng nằm trong kế hoạch ở sheet ThongSoChung, em mới làm được nếu file có kế hoạch từ ngày mùng 1 đến cuối tháng còn trường hợp trên em chưa làm được. Mong anh chị gợi ý giúp em ạ. Em cảm ơn.
 

File đính kèm

Upvote 0
Chào các anh chị em GPE!
Mình có 2 File đính kèm
1/. Master.xlsb : File nguồn
2/. Report.xlsx : File lưu

Mình có nhờ tạo code để copy sheet Report và chọn lưu sang File Report theo từng Sheet theo từng lần chọn.
Nhưng khi thực hiện xong thì ở File lưu có thêm phần "khuyến mãi" không mong muốn
upload_2018-4-4_23-31-27.png

Anh chị em nào biết cách loại bỏ phần "khuyến mãi " này thì giúp mình nhé!
Mình cám ơn nhiều!
 

File đính kèm

Upvote 0
Em chào các anh. Nhờ sự trợ giúp của anh Ba Tê mà em có được 1 file giúp ích công việc rất nhiều. Tuy nhiên hiện tại có 1 số vấn đề phát sinh. Các anh giúp em với được không ạ. Em cám ơn !
 

File đính kèm

Upvote 0
Em chào các anh. Nhờ sự trợ giúp của anh Ba Tê mà em có được 1 file giúp ích công việc rất nhiều. Tuy nhiên hiện tại có 1 số vấn đề phát sinh. Các anh giúp em với được không ạ. Em cám ơn !
1. Bạn xem file này có khác biệt gì với code trong file trước rồi ngẫm ra cái "chèn thêm cột".
2. Bạn muốn lọc theo điều kiện nào thì cho code "biết" mà làm luôn, sao phải filter dữ liệu làm gì? Trong file là lọc theo điều kiện cột F (Object), nếu nhiều điều kiện nữa thì tính nữa.
 

File đính kèm

Upvote 0
1. Bạn xem file này có khác biệt gì với code trong file trước rồi ngẫm ra cái "chèn thêm cột".
2. Bạn muốn lọc theo điều kiện nào thì cho code "biết" mà làm luôn, sao phải filter dữ liệu làm gì? Trong file là lọc theo điều kiện cột F (Object), nếu nhiều điều kiện nữa thì tính nữa.
Em cám ơn anh BaTe :
1. Em đã hiểu cách làm thế nào để chèn thêm cột rồi. Nhưng mà khi em chạy code thì các dữ liệu ở những cột xen giữa ( cột mới thêm vào ) bị mất hết. Anh xem giúp em với
2. Thực ra thì file này, em chỉ sử dụng ở sheet IT2003 thôi. Còn sheet kia là người khác dùng, và vì họ là những người gần như chỉ biết nhập liệu nên có những trường hợp nhân viên không còn trong bảng nữa nhưng họ không xóa đi mà vẫn để đấy, sau đó bỏ filter bạn nghỉ kia đi => Ý là chỉ hiển thị những người đang làm việc hiện tại cho em xem => Như vậy khi dùng code ở IT2003 thì vẫn sẽ hiện những người đã nghỉ.
Em thấy đưa điều kiện để các anh giúp không khó, nhưng một thời gian điều kiện sẽ lại thay đổi :D
====> Vì vậy, nếu code làm được em chỉ mong kết quả ở IT2003 sẽ hiện kết quả ở hàng HR Only của các ô hiện hành ( không lấy kq các ô đã filter đi ).
Nếu không được cũng không sao, vì được đến bước này rồi thì em cũng rất chi là thỏa mãn.
Em cám ơn.
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các anh, chị , em và các bạn trên GPE
Trong Module1 (ModData), sử dụng code để lấy dữ liệu từ 8 dòng trên Sheet Input đưa sang bên sheet PartsData
Tuy nhiên khi mình kết thúc code bằng lệnh chọn dòng dưới cùng của cột A ở sheet PartsData (như trong hình 1)
Mã:
Sheets("PartsData").Select
Cells(nextRow, "A").Select
thì Excel lập tức báo lỗi (như trong hình 2)
Mà hễ bình bỏ dòng lệnh đó ra khỏi code thì file lại chạy ngon lành
Mình không hiểu tại sao. Rất mong mọi người giúp đỡ xử lý lỗi này
 

File đính kèm

  • try.xlsm
    try.xlsm
    99.7 KB · Đọc: 9
  • Hình 2.png
    Hình 2.png
    391.7 KB · Đọc: 7
  • Hình 1.png
    Hình 1.png
    345.6 KB · Đọc: 6
Upvote 0
Chào các anh, chị , em và các bạn trên GPE
Trong Module1 (ModData), sử dụng code để lấy dữ liệu từ 8 dòng trên Sheet Input đưa sang bên sheet PartsData
Tuy nhiên khi mình kết thúc code bằng lệnh chọn dòng dưới cùng của cột A ở sheet PartsData (như trong hình 1)
Mã:
Sheets("PartsData").Select
Cells(nextRow, "A").Select
thì Excel lập tức báo lỗi (như trong hình 2)
Mà hễ bình bỏ dòng lệnh đó ra khỏi code thì file lại chạy ngon lành
Mình không hiểu tại sao. Rất mong mọi người giúp đỡ xử lý lỗi này
Mình chạy có thấy bị gì đâu
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT

Bài viết mới nhất

Back
Top Bottom