excel - पता लगाएं कि एक्सेल कार्यपुस्तिका पहले से ही खुली है





vba excel-vba (7)


मैं इसके साथ जाऊंगा:

Public Function FileInUse(sFileName) As Boolean
    On Error Resume Next
    Open sFileName For Binary Access Read Lock Read As #1
    Close #1
    FileInUse = IIf(Err.Number > 0, True, False)
    On Error GoTo 0
End Function

sfileName के रूप में आपको फ़ाइल के लिए सीधे पथ प्रदान करना होगा उदाहरण के लिए:

Sub Test_Sub()
    myFilePath = "C:\Users\UserName\Desktop\example.xlsx"
    If FileInUse(myFilePath) Then
        MsgBox "File is Opened"
    Else
        MsgBox "File is Closed"
    End If
End Sub

वीबीए में, मैंने प्रोग्रामिंग के "myWork.XL" नामक एक एमएस एक्सेल फ़ाइल खोली।

अब मुझे एक कोड चाहिए जो मुझे अपनी स्थिति के बारे में बता सकता है - चाहे वह खुला है या नहीं। क्या IsWorkBookOpened("myWork.XL) तरह कुछ है?




यदि आप एक और एक्सेल उदाहरण बनाये बिना जांचना चाहते हैं तो क्या होगा?

उदाहरण के लिए, मेरे पास वर्ड मैक्रो है (जिसे बार-बार चलाया जाता है) जिसे Excel स्प्रेडशीट से डेटा निकालने की आवश्यकता होती है। यदि मौजूदा एक्सेल उदाहरण में स्प्रेडशीट पहले से ही खुली है, तो मैं एक नया उदाहरण नहीं बनाना चाहूंगा।

मुझे यहां एक अच्छा जवाब मिला है कि मैंने बनाया: http://www.dbforums.com/microsoft-access/1022678-how-check-wether-excel-workbook-already-open-not-search-value.html

माइक द बाइक और किरणकरणती के लिए धन्यवाद

Function WorkbookOpen(strWorkBookName As String) As Boolean
    'Returns TRUE if the workbook is open
    Dim oXL As Excel.Application
    Dim oBk As Workbook

    On Error Resume Next
    Set oXL = GetObject(, "Excel.Application")
    If Err.Number <> 0 Then
        'Excel is NOT open, so the workbook cannot be open
        Err.Clear
        WorkbookOpen = False
    Else
        'Excel is open, check if workbook is open
        Set oBk = oXL.Workbooks(strWorkBookName)
        If oBk Is Nothing Then
            WorkbookOpen = False
        Else
            WorkbookOpen = True
            Set oBk = Nothing
        End If
    End If
    Set oXL = Nothing
End Function

Sub testWorkbookOpen()
    Dim strBookName As String
    strBookName = "myWork.xls"
    If WorkbookOpen(strBookName) Then
        msgbox strBookName & " is open", vbOKOnly + vbInformation
    Else
        msgbox strBookName & " is NOT open", vbOKOnly + vbExclamation
    End If
End Sub



यह समझने में थोड़ा आसान है:

Dim location As String
Dim wbk As Workbook

location = "c:\excel.xls"

Set wbk = Workbooks.Open(location)

'Check to see if file is already open
If wbk.ReadOnly Then
  ActiveWorkbook.Close
    MsgBox "Cannot update the excelsheet, someone currently using file. Please try again later."
    Exit Sub
End If



इसे इस्तेमाल करे:

Option Explicit

Sub Sample()
    Dim Ret

    Ret = IsWorkBookOpen("C:\myWork.xlsx")

    If Ret = True Then
        MsgBox "File is open"
    Else
        MsgBox "File is Closed"
    End If
End Sub

Function IsWorkBookOpen(FileName As String)
    Dim ff As Long, ErrNo As Long

    On Error Resume Next
    ff = FreeFile()
    Open FileName For Input Lock Read As #ff
    Close ff
    ErrNo = Err
    On Error GoTo 0

    Select Case ErrNo
    Case 0:    IsWorkBookOpen = False
    Case 70:   IsWorkBookOpen = True
    Case Else: Error ErrNo
    End Select
End Function



इस समारोह को चेकआउट करें

'********************************************************************************************************************************************************************************
'Function Name                     : IsWorkBookOpen(ByVal OWB As String)
'Function Description             : Function to check whether specified workbook is open
'Data Parameters                  : OWB:- Specify name or path to the workbook. eg: "Book1.xlsx" or "C:\Users\Kannan.S\Desktop\Book1.xlsm"

'********************************************************************************************************************************************************************************
Function IsWorkBookOpen(ByVal OWB As String) As Boolean
    IsWorkBookOpen = False
    Dim WB As Excel.Workbook
    Dim WBName As String
    Dim WBPath As String
    Err.Clear
    On Error Resume Next
    OWBArray = Split(OWB, Application.PathSeparator)
    Set WB = Application.Workbooks(OWBArray(UBound(OWBArray)))
    WBName = OWBArray(UBound(OWBArray))
    WBPath = WB.Path & Application.PathSeparator & WBName
    If Not WB Is Nothing Then
        If UBound(OWBArray) > 0 Then
            If LCase(WBPath) = LCase(OWB) Then IsWorkBookOpen = True
        Else
            IsWorkBookOpen = True
        End If
    End If
    Err.Clear
End Function



मेरे अनुप्रयोगों के लिए, मैं आमतौर पर यह निर्धारित करने के बजाय कि यह खुला है या नहीं, बल्कि कार्यपुस्तिका के साथ काम करना चाहता हूं। उस मामले के लिए, मैं बूलियन फ़ंक्शन को छोड़ना पसंद करता हूं और केवल कार्यपुस्तिका वापस करता हूं।

Sub test()

    Dim wb As Workbook

    Set wb = GetWorkbook("C:\Users\dick\Dropbox\Excel\Hoops.xls")

    If Not wb Is Nothing Then
        Debug.Print wb.Name
    End If

End Sub

Public Function GetWorkbook(ByVal sFullName As String) As Workbook

    Dim sFile As String
    Dim wbReturn As Workbook

    sFile = Dir(sFullName)

    On Error Resume Next
        Set wbReturn = Workbooks(sFile)

        If wbReturn Is Nothing Then
            Set wbReturn = Workbooks.Open(sFullName)
        End If
    On Error GoTo 0

    Set GetWorkbook = wbReturn

End Function



कॉलिन पिकर्ड का एक उत्कृष्ट जवाब है, लेकिन इसके साथ एक 'घड़ी' है। ऐसे कई उदाहरण हैं (मैंने अभी तक कारण नहीं निकाला है) जहां फ़ाइल में "सीएमजी = ........ जीसी = ...." प्रविष्टि की कुल लंबाई एक एक्सेल फ़ाइल से अलग है आगामी। कुछ मामलों में, यह प्रविष्टि 137 बाइट्स होगी, और अन्य में यह 143 बाइट्स होगी। 137 बाइट लंबाई अजीब है, और यदि ऐसा होता है जब आप '1234' पासवर्ड के साथ अपनी फ़ाइल बनाते हैं, तो बस एक और फ़ाइल बनाएं, और इसे 143 बाइट लंबाई तक कूदना चाहिए।

यदि आप फ़ाइल में बाइट्स की गलत संख्या पेस्ट करने का प्रयास करते हैं, तो आप एक्सेल के साथ फ़ाइल खोलने का प्रयास करते समय अपना वीबीए प्रोजेक्ट खो देंगे।

संपादित करें

यह Excel 2007/2010 फ़ाइलों के लिए मान्य नहीं है। मानक .xlsx फ़ाइल प्रारूप वास्तव में एक .zip फ़ाइल है जिसमें स्वरूपण, लेआउट, सामग्री इत्यादि के साथ कई उप-फ़ोल्डर होते हैं, जिन्हें XML डेटा के रूप में संग्रहीत किया जाता है। एक असुरक्षित एक्सेल 2007 फ़ाइल के लिए, आप .xlsx एक्सटेंशन को .zip में बदल सकते हैं, फिर ज़िप फ़ाइल खोलें और सभी XML डेटा देखें। यह बहुत सीधा है।

हालांकि, जब आप Excel 2007 फ़ाइल को सुरक्षित करते हैं, तो संपूर्ण .zip (.xlsx) फ़ाइल वास्तव में आरएसए एन्क्रिप्शन का उपयोग करके एन्क्रिप्ट किया जाता है। एक्सटेंशन को .zip में बदलना और फ़ाइल सामग्री ब्राउज़ करना अब संभव नहीं है।





excel vba excel-vba