Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Basic / VBA


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Vasiliy83
Статус: Практикант
Рейтинг: 951
∙ повысить рейтинг »
Megaloman
Статус: Бакалавр
Рейтинг: 809
∙ повысить рейтинг »
Botsman
Статус: Профессионал
Рейтинг: 508
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / Basic/VBA

Номер выпуска:955
Дата выхода:15.12.2009, 18:00
Администратор рассылки:Калашников О.А., Руководитель
Подписчиков / экспертов:371 / 99
Вопросов / ответов:4 / 7

Вопрос № 175084: Уважаемые эксперты, подскажите, пожалуйста, как при помощи ВБА осуществить проверку Подключен ли сетевой диск F, если не подключен, подключить его Если это сделать вручную, тогда требуется вводить Имя пользователя, Пароль и Нажать Ок Ка...


Вопрос № 175091: Уважаемые эксперты, подскажите, пожалуйста, думал по аналогии с IE открыть Зэ Бат! ларец не открылся, или может возле надписи Зэ Бат! слева надо было нарисовать летучую мышь? Dim IE As Object Set IE = CreateObject("The Bat!") IE...
Вопрос № 175103: Здравствуйте, уважаемые эксперты! Помогите доработать код для создания массива из сгенерированных чисел. Вот сам код, но надо, чтобы элементы не повторялись. Dim i, j As Integer Dim numbers(N) As Integer ...
Вопрос № 175105: Уважаемые эксперты Высылаю экзешный файл, как с полей формы программы КУЗСП считать данные Спасибо Эндрю http://rfpro.ru/upload/1169...

Вопрос № 175084:

Уважаемые эксперты, подскажите, пожалуйста,
как при помощи ВБА осуществить проверку
Подключен ли сетевой диск F, если не подключен, подключить его
Если это сделать вручную, тогда требуется вводить Имя пользователя, Пароль и Нажать Ок
Как это сделать при помощи ВБА?
Спасибо Эндрю

Отправлен: 09.12.2009, 23:01
Вопрос задал: Ципихович Эндрю, Посетитель
Всего ответов: 1
Страница вопроса »


Отвечает Vasiliy83, Практикант :
Здравствуйте, Ципихович Эндрю.
Код проверки наличия диска такой:
Код:
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)
'Переменная fD isk - флаг типа сетевого ресурса (диск или принтер), по умолчанию - диск (значение TRUE)


Dim usrNetResource As NetResourceDim 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

Ответ отправил: Vasiliy83, Практикант
Ответ отправлен: 10.12.2009, 09:35

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 257568 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Вопрос № 175091:

    Уважаемые эксперты, подскажите, пожалуйста, думал по аналогии с IE открыть Зэ Бат!
    ларец не открылся, или может возле надписи Зэ Бат! слева надо было нарисовать летучую мышь?
    Dim IE As Object
    Set IE = CreateObject("The Bat!")
    IE.Visible = True 'открывает, делает видимым
    Как это сделать при помощи ВБА?
    Возможно, не все программы можно открыть при помощи ВБА, тогда я понимаю, можно через Экзешний файл, и как?
    Спасибо Эндрю


    Отправлен: 10.12.2009, 01:16
    Вопрос задал: Ципихович Эндрю, Посетитель
    Всего ответов: 1
    Страница вопроса »


    Отвечает Vasiliy83, Практикант :
    Здравствуйте, Ципихович Эндрю.
    TheBat! не является стандартным объектом VBA, поэтому как с IE не получится
    запустить любую программу поможет команда
    Код:
    Shell "Путь к exe-файлу
    "

    Ответ отправил: Vasiliy83, Практикант
    Ответ отправлен: 10.12.2009, 08:52

    Оценка ответа: 5

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 257567 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Вопрос № 175103:

    Здравствуйте, уважаемые эксперты!

    Помогите доработать код для создания массива из сгенерированных чисел.

    Вот сам код, но надо, чтобы элементы не повторялись.

    Dim i, j As Integer
    Dim numbers(N) As Integer
    Dim element As Integer

    For i = 1 To N
    numbers(i) = Int(N * Rnd()) + 1
    ListBox1.Items.Add(numbers(i))
    Next


    Сам попытался сделать, но не получилось - элементы все равно повторяются. То, что получилось - в примечании. Про Вас переделать или написать код для генерирования чисел, чтобы они не повторялись.

    Спасибо.

    Отправлен: 10.12.2009, 15:11
    Вопрос задал: Иванов Андрей Владимирович, 5-й класс
    Всего ответов: 4
    Страница вопроса »


    Отвечает amnick, 6-й класс :
    Здравствуйте, Иванов Андрей Владимирович.

    Ваш код похож на Visual Basic, который я не слишком хорошо знаю. Но поскольку вопрос в разделе C/C++, то и пример программы в приложении приведен на C++. Заполнение массива псевдослучайными числами реализовано в виде отдельной функции, сгенерированный массив для проверки выводится на экран (а Вы можете делать с ним, что пожелаете).

    Я проверял программу с Visual C++ 6.0. Генератор псевдослучайных чисел у microsoft довольно неплохой, так что за более чем 20 тестовых запусков, повторов не было ни разу (что ожидаемо, выборка из 15 чисел маловата). Поэтому для проверки, действительно ли повторяющиеся числа отсеиваются, я заменял

    int n = rand();

    на (временно, убрано из конечного кода)

    int n = rand() % 30; // псевдослучайное число от 0 до (30-1)

    Это стандартный прием получения псевдослучайных чисел в заданном диапазоне.

    Успехов!

    Раз требуется на Visual Basic, a я дал ответ на C++, т о вот Вам еще вариант на Visual Basic 6:

    Файл 175103.frm
    Код:
    VERSION 5.00
    Begin VB.Form Form1
    Caption = "Form1"
    ClientHeight = 4092
    ClientLeft = 48
    ClientTop = 324
    ClientWidth = 2520
    LinkTopic = "Form1"
    ScaleHeight = 4092
    ScaleWidth = 2520
    StartUpPosition = 3 'Windows Default
    Begin VB.CommandButton Generate
    Caption = "Generate"
    Height = 372
    Left = 240
    TabIndex = 1
    Top = 3480
    Width = 1932
    End
    Begin VB.ListBox List1
    Height = 2928
    L eft = 240
    TabIndex = 0
    Top = 240
    Width = 1932
    End
    End
    Attribute VB_Name = "Form1"
    Attribute VB_GlobalNameSpace = False
    Attribute VB_Creatable = False
    Attribute VB_PredeclaredId = True
    Attribute VB_Exposed = False
    Option Explicit

    Private Sub Form_Load()
    Randomize
    End Sub

    Private Sub Generate_Click()
    Dim i, j As Integer
    Dim nums(20) As Integer
    Dim found As Boolean
    Dim tmp As Integer

    List1.Clear
    i = 0
    While (i < 20)
    again:
    tmp = Int((30000 * Rnd) + 1)
    found = False
    For j = 0 To i - 1
    If nums(j) = tmp Then
    found = True
    Exit For
    End If
    Next j
    If found Then GoTo again
    nums(i) = tmp
    List1.AddItem (tmp)
    i = i + 1
    Wend
    End Sub


    По нажатию кнопки [Generate] список очищается, а затем запо лняется 20-ю псевдослучайными числами.

    Успехов!
    Дополнение автора ответа перенесено из мини-форума
    -----
    ∙ Отредактировал: Dr_Andrew, Старший модератор
    ∙ Дата редактирования: 10.12.2009, 16:34 (время московское)

    Приложение:

    Ответ отправил: amnick, 6-й класс
    Ответ отправлен: 10.12.2009, 15:57

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 257577 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Ashotn, 6-й класс :
    Здравствуйте, Иванов Андрей Владимирович.
    В программировании индекс массива начинается с 0. Цикл надо начинать с 0 или писать i-1. Кроме того, не надо сравнивать значение с самим собой, это у Вас происходит, когда j = i . Переработаннный код программы дан в приложении.

    Приложение:

    -----
    Я ни от чего, ни от кого не завишу.

    Ответ отправил: Ashotn, 6-й класс
    Ответ отправлен: 10.12.2009, 16:03

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 257578 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Лейла, 2-й класс :
    В программе amnick может возникнуть ситуация, когда число элементов массива больше RAND_MAX (32767) . Тогда невозможно будет сгенерировать массив из не повторяющихся элементов и программа зависнет.
    Привожу свой код ниже.

    Приложение:

    Ответ отправил: Лейла, 2-й класс
    Ответ отправлен: 10.12.2009, 16:36

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 257580 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Сандров Алекс, Студент :
    Ладно, читаем msdn:

    Before calling Rnd, use the Randomize statement without an argument to initialize the random-number generator with a seed based on the system timer.

    To produce random integers in a given range, use this formula:

    Код:
    Int((upperbound
    - lowerbound + 1) * Rnd + lowerbound)

    Here, upperbound is the highest number in the range, and lowerbound is the lowest number in the range.

    Ответ отправил: Сандров Алекс, Студент
    Ответ отправлен: 11.12.2009, 06:18

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 257598 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Вопрос № 175105:

    Уважаемые эксперты
    Высылаю экзешный файл, как с полей формы программы КУЗСП считать данные
    Спасибо Эндрю


    http://rfpro.ru/upload/1169

    Отправлен: 10.12.2009, 17:31
    Вопрос задал: Ципихович Эндрю, Посетитель
    Всего ответов: 1
    Страница вопроса »


    Отвечает Ashotn, 6-й класс :
    Здравствуйте, Ципихович Эндрю.
    Реализуем идею эксперта.
    Добавьте новый модуль(в приложении). Чтобы получить данные, в новом макросе напишите

    Dim lRet As Long
    Dim lParam As Long

    'enumerate the list
    lRet = EnumWindows(AddressOf EnumWinProc, lParam)

    Приложение:

    -----
    Я ни от чего, ни от кого не завишу.

    Ответ отправил: Ashotn, 6-й класс
    Ответ отправлен: 12.12.2009, 14:09

    Оценка ответа: 5

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 257636 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.12 от 30.11.2009

    В избранное