Điều kiện để xác định Sheet có tồn tại trong Workbook, sử dụng ADO

Liên hệ QC

themorzer

Thành viên chính thức
Tham gia
24/5/13
Bài viết
95
Được thích
1
Chao mọi người, mình sử dụng code Getdata của thầy Ndu, nhưng với code này thì Workbook chỉ mở khi có tồn tại Sheet cần mở, còn nếu Sheet đó không có thì báo lỗi
Mã:
Function GetData(ByVal FileName As String, ByVal SheetName As String, ByVal RangeAddress As String, _
            ByVal HasTitle As Boolean, ByVal UseTitle As Boolean)
            
  Dim rsCon As Object, rsData As Object, cat As Object, tbl As Object
  Dim tmpArr, Arr()
  Dim szConnect As String, szSQL As String, tmp As String
  Dim lCount As Long, lR As Long, lC As Long, lVer As Long
  lVer = Val(Application.Version)
  Set rsCon = CreateObject("ADODB.Connection")
  Set rsData = CreateObject("ADODB.Recordset")
  Set cat = CreateObject("ADOX.Catalog")
 
  If lVer < 12 Then
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 8.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  Else
    szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 12.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  End If
  If SheetName = "" Then
    Dim Dbs  As Object, db As Object
    Set Dbs = CreateObject("DAO.DBEngine." & IIf(lVer < 12, "36", "120"))
    Set db = Dbs.OpenDatabase(FileName, False, False, "Excel 8.0;")
    tmp = db.TableDefs(0).Name
    tmp = Replace(tmp, " ", "?")
    tmp = Replace(tmp, "'", " ")
    tmp = WorksheetFunction.Trim(tmp)
    tmp = Replace(tmp, " ", "'")
    tmp = Replace(tmp, "?", " ")
    SheetName = tmp
    db.Close
    Set Dbs = Nothing: Set db = Nothing
  End If
  If Right(SheetName, 1) <> "$" Then SheetName = SheetName & "$"
  rsCon.Open szConnect
  cat.ActiveConnection = rsCon
 
  szSQL = "SELECT * FROM [" & SheetName & RangeAddress & "];"
  rsData.Open szSQL, rsCon, 0, 1, 1
  tmpArr = rsData.GetRows
  ReDim Arr(UBound(tmpArr, 2) - UseTitle, UBound(tmpArr, 1) + 1)
  If UseTitle Then
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
      Arr(0, lC) = rsData.Fields(lC).Name
    Next
  End If
  For lR = LBound(tmpArr, 2) To UBound(tmpArr, 2)
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
      Arr(lR - UseTitle, lC) = tmpArr(lC, lR)
    Next
  Next
  rsData.Close: Set rsData = Nothing
  rsCon.Close: Set rsCon = Nothing
  GetData = Arr
End Function
-Vậy đặt điều kiện thế nào trong hàm Getdata này để chương trình biết Sheet đó có tồn tại hay không
+ Nếu có tồn tại thì thực hiện tiếp chương trình
+ Nếu không tồn tại thì bỏ qua
 
Người ta= những người hỏi ở đây
Chạy 1 lần= nhiều câu hỏi ở diễn đàn này toàn đưa lên giúp, cần thay lại đưa lên - xử lý xon vứt bỏ (có thể không đúng với thớt này)

Vậy sao? Ly kỳ quá nhỉ.
Nên đọc lại yêu cầu từ đầu của thớt:
Thớt lụm đâu đó một đoạn code, và nhờ chỉnh sửa cho hợp với tình trạng của mình.

Bác này cứ quan trọng hóa quá
Ở đây người ta cần mỗi mì ăn liền
Thì có người rót nước vào mì là húp xong
Có khi code cũng chạy 1 lần trong đời, trong năm

Đọc như thế này mà bảo là "chạy 1 lần trong đời" thì thánh cũng bó tay thôi

Cám ơn ban đã trả lời, nhưng bạn hiểu sai ý mình,
VD: - ngày hôm này khách hàng gửi dữ liệu cho mình xử lý, trong đó có 3 Sheet là A,B,C
- nhưng qua ngày hôm sau khách hàng gửi cho mình tiếp file nhưng trong đó có 4 Sheet A,B,C,D, những ngày khác thì có Sheet A,C,D
- những ngày khác thì có 5 Sheet A,B,C,D,E, vì vậy mới cần xét có tồn tại 1 Sheet
Dữ liêu khách hàng gửi chỉ Max là 10000 dòng, không hơn

Từ đầu, tôi chỉ cảnh báo thớt là cái đoạn code kia ngừoi ta viết lâu rồi:
1. tác giả viết code hốt dữ liệu theo kiểu xúc rác, không có chỗ kiểm soát dữ liệu.
2. tác giả chủ quan về tốc độ chứ không bao giờ lý đến sự dễ hiểu và dễ chỉnh sửa của code (*)
Vì vậy, tốt hơn hết là viết lại thay vì chỉnh sửa

(*) thật ra tôi nghi ngờ khả năng của tác giả ở mục này. Hầu hết các tay viết code kỳ cựu ở diễn đàn này không hề được rèn luyện viết code với chú thích cho dễ hiểu. 100 cái súp hay hàm giỏi lắm được một cái có dòng chú thích cho biết nó làm cái gì.
Diễn đàn này có cái mục "like/thích" nó khuyến khích người ta viết nhiều bài để lấy nhiều "thích" và tăng mề đay.
Tôi viết một đoạn code khó hiểu bỏ bố, lấy 1 "thích". Người dùng khong biết cách áp dụng, hỏi lại. Tôi trả lời và lấy thêm 1 "thích" nữa. Ngừoi dùng đương nhiên đâu biết cách chỉnh sửa. Toi lại được dịp lấy thêm 1 vài "thích" nữa. Túm lọi, mọt thớt tôi có thể lấy nửa chục "thích" cho cái code của tôi như chơi.
Và nếu cái code đó được ngừoi ta đem ra hỏi ở thớt khác. Tôi lại lụm thêm 1 vài "thích" nữa.
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy sao? Ly kỳ quá nhỉ.
Nên đọc lại yêu cầu từ đầu của thớt:
Thớt lụm đâu đó một đoạn code, và nhờ chỉnh sửa cho hợp với tình trạng của mình.



Đọc như thế này mà bảo là "chạy 1 lần trong đời" thì thánh cũng bó tay thôi



Từ đầu, tôi chỉ cảnh báo thớt là cái đoạn code kia ngừoi ta viết lâu rồi:
1. tác giả viết code hốt dữ liệu theo kiểu xúc rác, không có chỗ kiểm soát dữ liệu.
2. tác giả chủ quan về tốc độ chứ không bao giờ lý đến sự dễ hiểu và dễ chỉnh sửa của code (*)
Vì vậy, tốt hơn hết là viết lại thay vì chỉnh sửa

(*) thật ra tôi nghi ngờ khả năng của tác giả ở mục này. Hầu hết các tay viết code kỳ cựu ở diễn đàn này không hề được rèn luyện viết code với chú thích cho dễ hiểu. 100 cái súp hay hàm giỏi lắm được một cái có dòng chú thích cho biết nó làm cái gì.
Diễn đàn này có cái mục "like/thích" nó khuyến khích người ta viết nhiều bài để lấy nhiều "thích" và tăng mề đay.
Tôi viết một đoạn code khó hiểu bỏ bố, lấy 1 "thích". Người dùng khong biết cách áp dụng, hỏi lại. Tôi trả lời và lấy thêm 1 "thích" nữa. Ngừoi dùng đương nhiên đâu biết cách chỉnh sửa. Toi lại được dịp lấy thêm 1 vài "thích" nữa. Túm lọi, mọt thớt tôi có thể lấy nửa chục "thích" cho cái code của tôi như chơi.
Và nếu cái code đó được ngừoi ta đem ra hỏi ở thớt khác. Tôi lại lụm thêm 1 vài "thích" nữa.
Kệ chúng nó đi,
Hỏi để hỏi, còn cao thủ thích viết code để họ viết
 
Upvote 0
Web KT

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

Back
Top Bottom