2015-03-31 3 views
0

Привет, Я работаю над проектом, где я должен позволить пользователям открывать excel, пока пользовательская форма открыта. Я могу перемещаться по другим файлам excel, но не по одному из Explorer.Please Это было бы очень полезно для меня.Невозможно открыть Excel из проводника при открытии пользовательской формы

Option Explicit 
    Private Sub Workbook_Open() 
    Application.OnTime Now, "ThisWorkbook.OnlyOneOfMe" 
    Dim wks As Worksheet 
For Each wks In ActiveWorkbook.Worksheets 
    wks.Protect Password:="Nothing", _ 
    UserInterfaceOnly:=True 
Next wks 
    End Sub 
    Private Sub Workbook_BeforeClose(Cancel As Boolean) 
'important to reset this 
Application.IgnoreRemoteRequests = False 
    End Sub 

Private Sub OnlyOneOfMe() 
Dim XlApp As Excel.Application 
On Error Goto BAD 
With Application 
    If Me.ReadOnly Or .Workbooks.Count > 1 Then 
     Me.ChangeFileAccess Mode:=xlReadOnly 
     Set XlApp = New Excel.Application 
     XlApp.Visible = True 
     XlApp.Workbooks.Open (Me.FullName) 
     Goto BAD 
    Else 
     'stop opening from explorer (but not from excel) 
     .Visible = False 
     .IgnoreRemoteRequests = True 
     UserForm1.Show 
     .Visible = True 
     .Quit 
    End If 
    Exit Sub 
End With 
BAD:  If Err Then MsgBox Err.Description, vbCritical, "ERROR" 
Set XlApp = Nothing 
Me.Close False 
End Sub 
+0

Вы можете описать немного больше о том, что вы пытаетесь сделать? И что вы пытаетесь разрешить? (Это будет слишком много для * комментария *, пожалуйста, обновите/пересмотрите оригинал Q). Я вижу, что вы меняете «Me.ChangeFileAccess» только для чтения, а затем открываете книгу в новом экземпляре Excel. Проблема в том, что этот новый экземпляр тогда не отвечает? Почему вы открываете тот же файл в двух экземплярах Excel? –

+0

Hi David Я новичок в кодировании VB. Мой вопрос заключается в том, что у меня есть этот файл excel, в котором пользовательский формат открывается на событие workbook_open. Мне не удалось просмотреть листы Excel раньше, поскольку пользовательская форма использовалась для покрытия всего Excel. После добавления вышеприведенного кода я могу просмотреть все excel, кроме одного из Explorer, который имеет формат Xls. Пожалуйста, помогите мне в этом. Если это неверно, обновите приведенный выше код. – user2842252

+0

Требуется ли пользователю возможность управлять книгами, которые уже открыты? –

ответ

0

Если UserForm является модальным, он заблокирует экземпляр excel до тех пор, пока форма не будет закрыта. Вам нужно сделать UserForm non Modal или закрыть его после открытия книги.

Или вы можете отключить события перед открытием книги, что предотвратит всплытие пользовательской формы.

Просто поместите это перед строкой, где вы открыть книгу Application.EnableEvents = False

И после открытия линии позволит эвенов снова Application.EnableEvents = True

И вам нужно включить/отключить события для правильного экземпляра/приложения так как вы открываете новый. : XlApp.EnableEvents = False XlApp.Workbooks.Open (Me.FullName) XlApp.EnableEvents = True

Но вам, вероятно, не понадобится открывать новый экземпляр excel, если это сработает.

поставил также события, позволяющие линии к ErrorHandling If Err Then Application.EnableEvents = True: MsgBox Err.Description, vbCritical, "ERROR"

+0

@ David, Нет, пользователь не должен манипулировать листами Excel, которые им просто нужно просматривать. – user2842252

+0

@RadekThanks для кода, предоставленного выше, но все же я не могу видеть Excel, открытый от Проводника, в противном случае все другие отличия видны мне. Пользовательская форма охватывает весь лист. – user2842252

+0

Целью кода было то, что UserForm вообще не появится. Я и я ошибались в коде, который я исправил сейчас. Первой строкой должен быть XlApp.EnableEvents = False (ранее был True). – Radek

0

Вы также можете попытаться скрыть все открытые UserForms. Поместите это право после того, как вы откроете книгу:

For Each Object In VBA.UserForms Object.Hide Next

0

Я предпочел бы использовать визуальный базовый сценарий, чтобы открыть UserForm в проекте VBA. Поместите следующий код на обычный текстовый файл и сохраните его с расширением .vbs-х. (Это должно быть в той же папке, что и файл первенствовать, содержащий UserForm)

Option Explicit 

Dim fso, curDir 
Dim xlObj, file 
Dim fullPath 

Const xlMaximized = -4137 'constant to maximizes the background excel window 

On Error Resume next 
Set fso = CreateObject("Scripting.FileSystemObject") 

curDir = fso.GetAbsolutePathName(".") 
file ="\~$YourExcelFileName.xlsm"    
fullPath = curdir & File 

If fso.FileExists(fullPath) Then ' checks if the project is open or not 

    MsgBox "The project is in use!",64, "Notificación" 

Else 

    file ="\YourExcelFileName.xlsm"   
    fullPath = curdir & file 

    Set fso = Nothing  
    Set xlObj = CreateObject("Excel.Application") 

    With xlObj 

     .WindowState = xlMaximized 
     .Visible = False 
     .Workbooks.Open fullPath 
     .IgnoreRemoteRequests = True 
     .Run "mainMethod" 

    End With 

    set xlObj=Nothing  

End If 

... затем добавить общественность подпрограммой в вашем проекте Vba слушать вызов из предыдущего VBScript (имя подпрограммы, как указано выше, я назвал mainMethod)

Public Sub mainMethod() 

    UserForm1.Show vbModeless 

End Sub 

... вы также должны приложить userform_terminate событие, чтобы указать, что при закрытии пользовательская форма должна выйти из текущего и активного экземпляра excel:

Private Sub UserForm_Terminate() 

    Application.Quit 

End Sub 

... и, конечно, вам нужно написать событие before_close книги, чтобы сбросить значение .IgnoreRemoteRequests на false, как следует (вы также можете записать это в предыдущем обработчике событий userform_terminate, но я считаю, что это более удобный способ сделать он):

Private Sub Workbook_BeforeClose(Cancel As Boolean) 

    ThisWorkbook.Saved = True 'if needed 
    Application.IgnoreRemoteRequests = False 

End Sub 

После того, как вам удастся сделать это, вы будете иметь очень чистый самостоятельное приложение, никто не заметит, что приходит из файла первенствовать и он не будет interfeers с любой другой первенствует экземпляр. Удачи.

Андреса Алехандро Гарсиа Уртадо

+0

Я не могу заставить этот код работать, так как он бросает какую-то необычную ошибку, чтобы нанести вред компьютеру и рабочей среде. – user2842252

+0

@ Radek Спасибо вам большое ... Вы сделали свой день Приветствия :-) – user2842252

+0

Хммм .. Какая ошибка вы получаете? Можете ли вы дать мне подробное описание этого, чтобы я мог рассказать вам, как с этим справиться. –

Смежные вопросы