Code kiểm tra file định mở đã mở chưa (1 người xem)

Liên hệ QC

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

MinhKhai

Giải pháp Ếc-xào
Tham gia
16/4/08
Bài viết
941
Được thích
574
Em học được mót được code dùng để kích hoạt mở nhiểu file nào đó là trong cùng thư mục (tên các file chỉ khác nhau số cuối)
Mã:
Private Sub CommandButton1_Click()
Dim i as integer
MyPath = ActiveWorkbook.Path
for i = 1 to 5
Workbooks.Open MyPath & "\Vidu" & i & ".xls"
Workbooks("CallCenter_TongHop.xls").Close SaveChanges:=False
Next i
End Sub
Bình thường thì nó chạy ngon. Nhưng giả sử 1 trong các file mình sẽ mở bằng lệnh trên đang được mở thì nó hiện thông báo ReOpen --> Lỗi

Vậy có cách nào để code kiểm tra trạng thái của file cần mở trước khi mở (nếu mở rồi thì ko mở nữa) để không hiện lỗi

Mong được giúp đỡ
 
Em học được mót được code dùng để kích hoạt mở nhiểu file nào đó là trong cùng thư mục (tên các file chỉ khác nhau số cuối)
Mã:
Private Sub CommandButton1_Click()
Dim i as integer
MyPath = ActiveWorkbook.Path
for i = 1 to 5
Workbooks.Open MyPath & "\Vidu" & i & ".xls"
Workbooks("CallCenter_TongHop.xls").Close SaveChanges:=False
Next i
End Sub
Bình thường thì nó chạy ngon. Nhưng giả sử 1 trong các file mình sẽ mở bằng lệnh trên đang được mở thì nó hiện thông báo ReOpen --> Lỗi

Vậy có cách nào để code kiểm tra trạng thái của file cần mở trước khi mở (nếu mở rồi thì ko mở nữa) để không hiện lỗi

Mong được giúp đỡ

Thử vầy xem sao:
Mã:
Private Sub CommandButton1_Click()
  Dim i as Long, [COLOR=#ff0000]wkb as Workbook[/COLOR], MyPath as String
  [COLOR=#ff0000]On Error Resume Next[/COLOR]
  MyPath = ActiveWorkbook.Path
  For i = 1 to 5
    [COLOR=#ff0000]Set wkb = Workbooks("Vidu" & i & ".xls")
    If wkb is Nothing then Set wkb = Workbooks.Open(MyPath & "\[/COLOR][COLOR=#ff0000]Vidu" & i & ".xls[/COLOR][COLOR=#ff0000]"[/COLOR][COLOR=#ff0000])[/COLOR]
    Workbooks("CallCenter_TongHop.xls").Close SaveChanges:=False
  Next i
End Sub
(Không có file nên chưa test được)
 
Upvote 0
Thử vầy xem sao:

(Không có file nên chưa test được)

Cảm ơn bác đã hướng dẫn.

Em đã thử ốp code trên mà không ăn thua. Có lẽ do "chắp vá" code nên file của em luôn phát sinh vấn đề. Hic hic vì thế lại phiền bác và mọi người.

Trong file CallCenter_TongHop.xls em gửi kèm có nút lệnh màu vàng để mở và copy dữ liệu. Khi code mở file chạy sẽ báo lỗi
Ngoài ra cũng file này còn phát sinh 1 hiện tượng lạ là: Cùng là code ấy, đưa vào sự kiện Workbook_Open thì không sao, nhưng kích hoạt bằng CommandButton thì nó chẳng hoạt động (hoạt động sai). Em dò tìm mãi mà không hiểu.
Mong mọi ngưởi chỉ giúp

https://www.dropbox.com/s/wvbj0o9etl5jahd/PSC.rar

Pass ReadOnly: 321
 
Lần chỉnh sửa cuối:
Upvote 0
Cái vụ lấy dữ liệu từ file đóng tốt nhất bạn remove password luôn cho dễ ---> Rắc rối nhức đầu lắm
Căn cứ vào thực tế. Chỗ em dùng file này ở dạng public, mọi người cần mở xem, nhưng chỉ 1 người được được cập nhật. Vì thể mới dùng pass ở chế độ ReadOnly. Bác thông cảm --=0 --=0 --=0

Chẳng lẽ lại không có giải pháp ??
 
Lần chỉnh sửa cuối:
Upvote 0
Căn cứ vào thực tế. Chỗ em dùng file này ở dạng public, mọi người cần mở xem, nhưng chỉ 1 người được được cập nhật. Vì thể mới dùng pass ở chế độ ReadOnly. Bác thông cảm --=0 --=0 --=0

Chẳng lẽ lại không có giải pháp ??

Tôi thấy dùng ADO cho nó gọn (file con có đang mở hay đóng cũng thây kệ nó)
Code:
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
Sub Main()
  Dim Arr, i As Long, strPath As String, Target As Range
  Dim FileName As String, SheetName As String, RangeAddress As String
  strPath = ThisWorkbook.Path
  [B][COLOR=#ff0000]SheetName = "NhatKySC"
  RangeAddress = "B8:L1000"[/COLOR][/B]
  For i = 1 To 4
    [B][COLOR=#ff0000]FileName = strPath & "\CallCenter_Cabin" & i & ".xls"[/COLOR][/B]
    Arr = GetData(FileName, SheetName, RangeAddress, False, False)
    Set Target = Sheets("NhatKySC").Range("B60000").End(xlUp).Offset(1)
    Target.Resize(UBound(Arr, 1) + 1, UBound(Arr, 2) + 1).Value = Arr
  Next
End Sub
Chạy Sub Main sẽ thấy kết quả
Việc bạn cần là truyền vào 3 đối số: FileName, SheetName và RangeAddress (chổ màu đỏ)
Xong chuyện!
 
Upvote 0
Tôi thấy dùng ADO cho nó gọn (file con có đang mở hay đóng cũng thây kệ nó)

Chạy Sub Main sẽ thấy kết quả
Việc bạn cần là truyền vào 3 đối số: FileName, SheetName và RangeAddress (chổ màu đỏ)
Xong chuyện!

Cảm ơn bác. Sự thật là với VBA em đã là người mù màu, chuyển sang ADO em thành người mù hẳn. Nhìn code như nhìn ngồi ngắm sao.

Với code của bác em thử ốp vào file nhưng không thấy "động đậy" gì cả. Quay sang đọc về ADO thì ôi trời.....

Bác giúp em đưa code trên vào file cụ thể của em để nó hoạt động. Từ sự hoạt động ấy, em thay đổi, điều chỉnh, chạy thử ---> Hiểu về ADO --> Yêu và học về ADO nhiều hơn
 
Upvote 0
Cảm ơn bác. Sự thật là với VBA em đã là người mù màu, chuyển sang ADO em thành người mù hẳn. Nhìn code như nhìn ngồi ngắm sao.

Với code của bác em thử ốp vào file nhưng không thấy "động đậy" gì cả. Quay sang đọc về ADO thì ôi trời.....
Hiểu cũng được mà không hiểu cũng đâu có sao. Tôi làm tất cả rồi còn gì... Việc của bạn chỉ là chạy sub Main (hoặc tùy biến nó). Code có tí xíu thôi mà:
Mã:
Sub Main()
  Dim Arr, i As Long, strPath As String, Target As Range
  Dim FileName As String, SheetName As String, RangeAddress As String
  [COLOR=#ff0000]strPath = ThisWorkbook.Path[/COLOR]
  [COLOR=#ff0000]SheetName = "NhatKySC"
  RangeAddress = "B8:L1000"[/COLOR]
  For i = 1 To 4
    [COLOR=#ff0000]FileName = strPath & "\CallCenter_Cabin" & i & ".xls"[/COLOR]
    Arr = GetData(FileName, SheetName, RangeAddress, False, False)
    [COLOR=#ff0000]Set Target = Sheets("NhatKySC").Range("B60000").End(xlUp).Offset(1)[/COLOR]
    Target.Resize(UBound(Arr, 1) + 1, UBound(Arr, 2) + 1).Value = Arr
  Next
End Sub
Bạn chỉ cần quan tâm mấy chổ màu đỏ thôi (tức áp dụng)... còn Function GetData viết gì thay kệ nó
Bác giúp em đưa code trên vào file cụ thể của em để nó hoạt động. Từ sự hoạt động ấy, em thay đổi, điều chỉnh, chạy thử ---> Hiểu về ADO --> Yêu và học về ADO nhiều hơn
Chỉ copy cho vào module thôi mà bạn, tôi không nghĩ lại có vấn đề khó khăn gì
(mở file CallCenter_TongHop.xls, bấm nút COPY tu Cabin)
 

File đính kèm

Upvote 0
Hiểu cũng được mà không hiểu cũng đâu có sao. Tôi làm tất cả rồi còn gì... Việc của bạn chỉ là chạy sub Main (hoặc tùy biến nó). Code có tí xíu thôi mà:

Gửi bác ndu96081631

Em tham gia diễn đàn GPE đã lâu, nhưng cũng chỉ như ngồi máy bay xem hoa.

Gần đây em nhận thấy khả năng của VBA, VBA có thể thay thế rất nhiều các thao tác nhàm chán và dễ sai xót hàng ngày của mình nên rất yêu thích VBA. Qua diễn đàn này em thấy bác, thuờng xuyên online, rất chịu khó "cày" và cực kỳ nhiệt tình giúp đỡ những kẻ ngơ ngơ ngác ngác như em.

Em cũng hay cày, nhưng do không có cơ bản, không có "con trâu dẫn lối" nên chả cày được luống nào ra hồn.

Qua topic này cho em gửi lời chân thành cảm ơn bác. Em cũng mới biết "dung nham" của bác qua Clip SN GPE vừa rồi. Hy vọng bác có dịp ra HN, em được diện kiến và được mời bác cafe bệt, trà đá chém gió....


Một lần nữa, chân thành cảm ơn bác.

(Đôi lời tâm sự riêng tư, mong Mod bỏ qua)
 
Upvote 0
Em cũng hay cày, nhưng do không có cơ bản, không có "con trâu dẫn lối" nên chả cày được luống nào ra hồn.

Tôi nhận thấy rằng đã học viết code VBA, không sớm thì muộn cũng sẽ đụng đến vòng lập For... Next. Nó có mặt hầu như trong tất cả các giải thuật
Vậy nên, nếu bạn thích vọc thì mời xem qua topic này:

http://www.giaiphapexcel.com/forum/showthread.php?6354-Giới-thiệu-Cơ-bản-về-vòng-lặp-For-next
Trước đây tôi từ chưa biết gì và đã "lớn lên" từ đó
 
Upvote 0

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

Back
Top Bottom