Консультация № 175084
09.12.2009, 23:01
0.00 руб.
0 5 1
Уважаемые эксперты, подскажите, пожалуйста,
как при помощи ВБА осуществить проверку
Подключен ли сетевой диск F, если не подключен, подключить его
Если это сделать вручную, тогда требуется вводить Имя пользователя, Пароль и Нажать Ок
Как это сделать при помощи ВБА?
Спасибо Эндрю

Обсуждение

Неизвестный
10.12.2009, 09:35
общий
это ответ
Здравствуйте, Ципихович Эндрю.
Код проверки наличия диска такой:
Код:
Sub VBProject_References2() 'эта функция подключает к проекту библиотеку для работы с FSO
'для ее корректной работы нужно в параметрах безопасности макросов разрешить доступ к объектной модели проектов VBA!!!

iFileName$ = Environ("WinDir") & "\System32\Scrrun.dll"

If Dir(iFileName$) <> "" Then
Dim iReference As Object, iReferences As Object ' Variant
'Если подключена библиотека :
Set iReferences = ActiveDocument.VBProject.References
For Each iReference In iReferences
If StrComp(iReference.FullPath, iFileName$, vbTextCompare) = 0 Then
Exit Sub
End If
Next
iReferences.AddFromFile FileName:=iFileName$
Else
MsgBox "Отсутствует нужный файл библиотеки FSO", , ""
End If
End Sub

Sub Check_Drive() 'сама функция проверки наличия в системе диска с заданной буквой
Call VBProject_References2
Dim objFSO As FileSystemObject
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.DriveExists("F:") = True Then
MsgBox "Диск F существует!!!"
Else:
MsgBox "Диск F не существует!!!"
End If
End Sub


Отсюда взял код подключения/отключения сетевого диска
Код:
'1. Объявляем структуру данных
Private Type NetResource
dwScope As Long
dwType As Long 'Тип ресурса: дисковый или принтер
dwDisplayType As Long
dwUsage As Long
lpLocalName As String 'Локальное имя ресурса, например, "x:"
lpRemoteName As String 'Сетевое имя ресурса, например, "\\server\d$"
lpComment As String
lpProvider As String 'Системный провайдер, обеспечивающий собственно подключение, например, "LDAP:"
End Type

'Примечание.
'Системный провайдер - компонент ОС Windows. Он отвечает за работу в соответствующем пространстве имен сетевых объектов.
'Если это значение не задавать, то будет выбран провайдер, действующий по умолчанию (что и рекомендую).


'2. Объявляем функции из комплекта Win32 API.

Private Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NetResource, ByVal strPassword As String, ByVal strUserName As String, ByVal lngFlags As Long) As Long
Private Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias "WNetCancelConnection2A" (ByVal lpName As String, ByVal dwFlags As Long, ByVal fForce As Long) As Long

'3. Описываем пользовательские функции подключения и отключения ресурса.

Function AddConnection(strNetPath As String, strLocalName As String, strUserName As String, strPwd As String, Optional fPersistent As Boolean = True, Optional fDisk As Boolean = True) As Long
'Переменная fPersistent - флаг режима обновления профиля пользователя: обновлять или нет,
'по умолчанию - обновлять (значение TRUE)
'Переменная fDisk - флаг типа сетевого ресурса (диск или принтер), по умолчанию - диск (значение TRUE)


Dim usrNetResource As NetResource
Dim lngFlags As Long

With usrNetResource
.dwType = IIf(fDisk, dhcResourceTypeDisk, dhcResourceTypePrint) 'Определяем тип ресурса
'dhcResourceTypeDisk и dhcResourceTypePrint - стандартные константы функции WNetCancelConnection2

.lpLocalName = strLocalName
.lpRemoteName = strNetPath
.lpProvider = vbNullString
End With
'Задаем режим обновления профиля
lngFlags = IIf(fPersistent, dhcConnectUpdateProfile, dhcConnectDontUpdateProfile)
'Подключаемся к указанному ресурсу
AddConnection = WNetAddConnection2(usrNetResource, strPwd, strUserName, lngFlags)

End Function


Function CancelConnection(strLocalName As String, Optional forceDisconnect As Boolean = False, Optional updateUserProfile As Boolean = True) As Long
'Переменная forceDisconnect - флаг режима отключения ресурса: безусловный или нет, по умолчанию - не безусловный (FALSE)
'Безусловный режим - ресурс будет отключен, даже если есть открытые с отключаемого ресурса файлы
'Не безусловный режим - ресурс не будет отключен, если есть открытые с отключаемого ресурса файлы

Dim lngFlags As Long

'Задаем режим обновления профиля (обновлять или нет)
lngFlags = IIf(updateUserProfile, dhcConnectUpdateProfile, dhcConnectDontUpdateProfile)
'Отключаемся от ресурса
CancelConnection = WNetCancelConnection2(strLocalName, lngFlags, Abs(forceDisconnect))

End Function

'4. Проверяем работу функций подключения/отключения

Sub TestNetConnect() 'функция подключает сетевую папку \\server\c$ как диск Q из под учетной записи Администратор с паролем PASSWord
Dim cntResult As Long
cntResult = AddConnection("\\server\c$", "Q:", "Администратор", "PASSword")
End Sub


Sub TestNetDisconnect() 'функция отключает сетевой диск Q.
Dim cntResult As Long
cntResult = CancelConnection("Q:")
End Sub
Неизвестный
10.12.2009, 11:37
общий
Vasiliy83:
Sub VBProject_References2() 'эта функция подключает к проекту библиотеку для работы с FSO
'для ее корректной работы нужно в параметрах безопасности макросов разрешить доступ к объектной модели проектов VBA!!!

достаточно выставит "галочку" в Tools->References->Microsoft Scripting Runtime, или же использовать позднее связывание...
открывать доступ к объектной модели проектов VBA - только в самых крайних случаях...

Код:

Call VBProject_References2
Dim objFSO As FileSystemObject
Set objFSO = CreateObject("Scripting.FileSystemObject")

все это можно заменить на:
Код:

Dim objFSO As New FileSystemObject

это с "галочкой"
или на:
Код:

Dim objFSO
Set objFSO = CreateObject("Scripting.FileSystemObject")

- это позднее связывание(без "галочки")

Sub VBProject_References2 - совсем не нужна...(бр... жутковатая она какая-то)))
Неизвестный
10.12.2009, 16:17
общий
HookEst:
увы, никогда не учился программированию, а потому дохожу до назначения всего в коде только посредством логики и поисковых систем... отсюда и лишние элементы.
но за поправки спасибо - обязательно учту в будущем
Неизвестный
10.12.2009, 16:48
общий
Vasiliy83:
Много чего написано, трудно понимаемо, извините

есть кнопка, код по её нажатию

Private Sub ИЦ_Click()


Здесь надо проверить, подключён ли сетевой диск Эф, если нет то подключить ввести пароль, логин
Я пробовал часть из того, что в Вашем ответе скопировать сюда не получилось, не пропускает
Скажите, что надо сюда вставить

Далле будет Ваш ответ на один из моих вопросов, за который спасибо Shell "C:\Program Files\КП\kp.exe"

End Sub
Неизвестный
10.12.2009, 19:30
общий
Ципихович Эндрю:
если обрезать код по-минимуму, то получится следующее:
Код:
Dim DrvLet As String

Private Type NetResource
dwScope As Long
dwType As Long
dwDisplayType As Long
dwUsage As Long
lpLocalName As String
lpRemoteName As String
lpComment As String
lpProvider As String
End Type

Private Declare Function WNetAddConnection2 Lib "mpr.dll" Alias "WNetAddConnection2A" (lpNetResource As NetResource, ByVal strPassword As String, ByVal strUserName As String, ByVal lngFlags As Long) As Long
Private Declare Function WNetCancelConnection2 Lib "mpr.dll" Alias "WNetCancelConnection2A" (ByVal lpName As String, ByVal dwFlags As Long, ByVal fForce As Long) As Long
'все, что указано выше должно идти ДО остальных функций и процедур!!!

Private Sub ИЦ_Click()
DrvLet = "F"
If Check_Drive = False Then
Call AddConnection("\\server\folder", DrvLet & ":", "username", "password")
Else:
MsgBox "Диск " & DrvLet & " уже существует и не может быть подключен."
Exit Sub
End If
'тут можно вставить любое продолжение
End Sub

Function Check_Drive() As Boolean
Dim objFSO
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.DriveExists(DrvLet & ":") = True Then
Check_Drive = True
Else:
Check_Drive = False
End If
End Function

Function AddConnection(strNetPath As String, strLocalName As String, strUserName As String, strPwd As String, Optional fPersistent As Boolean = True, Optional fDisk As Boolean = True) As Long
Dim usrNetResource As NetResource
Dim lngFlags As Long
With usrNetResource
.dwType = IIf(fDisk, dhcResourceTypeDisk, dhcResourceTypePrint)
.lpLocalName = strLocalName
.lpRemoteName = strNetPath
.lpProvider = vbNullString
End With
lngFlags = IIf(fPersistent, dhcConnectUpdateProfile, dhcConnectDontUpdateProfile)
AddConnection = WNetAddConnection2(usrNetResource, strPwd, strUserName, lngFlags)
End Function

код проверил - отлично работает!
Форма ответа