none
Проблема с программированием Word 2010 на VBA RRS feed

  • Вопрос

  • Стоит задача - одним кликом (макросом) переключить расположение шаблонов (общие и автозагружаемые) в корпоративный каталог и обратно.

    Не получается переключить в состояние по умолчанию автозагружаемые шаблоны.

    Код:

        Options.DefaultFilePath(Path:=wdStartupPath) = _
            "C:\Documents and Settings\%username%\Application Data\Microsoft\Word\STARTUP\"

    Сообщение об ошибке - не найден путь.

    В то же время, при выполнении действий: ПУСК \ Выполнить \  C:\Documents and Settings\%username%\Application Data\Microsoft\Word\STARTUP\

    папка STARTUP открывается в директории C:\Documents and Settings\Моё имя\Application Data\Microsoft\Word\STARTUP\

    Пробовал объявить переменную

    Dim username As String

    Безрезультатно

    Прошу помощи


    Korolan
    20 июля 2011 г. 6:57

Ответы

  • А почему она должна происходить если вы присваиваете переменной User строку "& lpUserName", т.к. то что указано в кавычках является строкой. Посмотрите еще раз мой пример выше, возьмите и вставьте у себя только эту часть:

    Dim testPath As String
     testPath = "C:\Documents and Settings\" & lpUserName & "\Application Data\Microsoft\Word\STARTUP\"
     
     MsgBox testPath
    
    


    Для связи [mail]
    • Помечено в качестве ответа Korolan 22 июля 2011 г. 6:27
    21 июля 2011 г. 12:56

Все ответы

  • Здравствуйте.

    Посмотрите пример как получить имя пользователя в VBA и попробуйте его применить у себя: VBA: Sample Code to Retrieve the Current User Name (на русском)


    Для связи [mail]
    • Предложено в качестве ответа Abolmasov Dmitry 21 июля 2011 г. 8:09
    20 июля 2011 г. 12:36
  • Посмотрел. Спасибо.

    В примере такой код:

       Sub GetUserName()

          ' Buffer size for the return string.
          Const lpnLength As Integer = 255

          ' Get return buffer space.
          Dim status As Integer

          ' For getting user information.
          Dim lpName, lpUserName As String

          ' Assign the buffer size constant to lpUserName.
          lpUserName = Space$(lpnLength + 1)

          ' Get the log-on name of the person using product.
          status = WNetGetUser(lpName, lpUserName, lpnLength)

          ' See whether error occurred.
          If status = NoError Then
             ' This line removes the null character. Strings in C are null-
             ' terminated. Strings in Visual Basic are not null-terminated.
             ' The null character must be removed from the C strings to be used
             ' cleanly in Visual Basic.
             lpUserName = Left$(lpUserName, InStr(lpUserName, Chr(0)) - 1)
          Else

             ' An error occurred.
             MsgBox "Unable to get the name."
             End
          End If

          ' Display the name of the person logged on to the machine.
          MsgBox "The person logged on this machine is: " & lpUserName

       End Sub

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

    Пытаюсь я использовать это имя в следующем коде:

        Options.DefaultFilePath(Path:=wdStartupPath) = _
            "C:\Documents and Settings\" & lpUserName & "\Application Data\Microsoft\Word\STARTUP\"

    Появляется сообщение о том, что путь не найденю

    Вопрос в чем? Как сделать так, чтобы  в записи "C:\Documents and Settings\" & lpUserName & "\Application Data\Microsoft\Word\STARTUP\" вместо " & lpUserName & " появлялся текст с именем lpUserName, например, Иванов?

    Прошу помощи.


    Korolan
    21 июля 2011 г. 11:03
  • Попробуйте создать тестовую переменную, в которой соберете и будете хранить полный путь, например:

      Dim lpUserName As String
      lpUserName = "ИмяПолученное с помощью метода выше"
      
      Dim testPath As String
      testPath = "C:\Documents and Settings\" & lpUserName & "\Application Data\Microsoft\Word\STARTUP\"
      
      MsgBox testPath
    

     Проверьте верный ли путь выдается в Диалоговом окне. Далее в Options.DefaultFilePath(Path:=wdStartupPath) = указывайте переменную testPath


    Для связи [mail]
    21 июля 2011 г. 11:16
  • В диалоговом окне не выдается верный путь.

    Вот код:

        ' Declare for call to mpr.dll.
       Declare Function WNetGetUser Lib "mpr.dll" _
          Alias "WNetGetUserA" (ByVal lpName As String, _
          ByVal lpUserName As String, lpnLength As Long) As Long

       Const NoError = 0       'The Function call was successful

       Sub GetUserName()

          ' Buffer size for the return string.
          Const lpnLength As Integer = 255

          ' Get return buffer space.
          Dim status As Integer

          ' For getting user information.
          Dim lpName, lpUserName As String

          ' Assign the buffer size constant to lpUserName.
          lpUserName = Space$(lpnLength + 1)

          ' Get the log-on name of the person using product.
          status = WNetGetUser(lpName, lpUserName, lpnLength)

          ' See whether error occurred.
          If status = NoError Then
             ' This line removes the null character. Strings in C are null-
             ' terminated. Strings in Visual Basic are not null-terminated.
             ' The null character must be removed from the C strings to be used
             ' cleanly in Visual Basic.
             lpUserName = Left$(lpUserName, InStr(lpUserName, Chr(0)) - 1)
          Else

             ' An error occurred.
             MsgBox "Unable to get the name."
             End
          End If
         
          'Тест
         
            Dim User As String
            User = "& lpUserName" (прим. по тексту) В коде подчеркиваний и жирного нет, это здесь для пояснений.
      
            Dim testPath As String
            testPath = "C:\Documents and Settings\User\Application Data\Microsoft\Word\STARTUP\"
     
            MsgBox testPath

          ' Display the name of the person logged on to the machine.
          MsgBox "The person logged on this machine is: " & lpUserName

       End Sub

    Выдается два диалоговых окна, анализ которых показывает:

    1. Текущий пользователь определяется и отображается в диалоговом окне. Т.е. это работает

    2. Не происходит подстановка вместо переменной User её значения (текущий пользователь) IpUserName. И происходит это здесь.


    Korolan
    21 июля 2011 г. 12:37
  • А почему она должна происходить если вы присваиваете переменной User строку "& lpUserName", т.к. то что указано в кавычках является строкой. Посмотрите еще раз мой пример выше, возьмите и вставьте у себя только эту часть:

    Dim testPath As String
     testPath = "C:\Documents and Settings\" & lpUserName & "\Application Data\Microsoft\Word\STARTUP\"
     
     MsgBox testPath
    
    


    Для связи [mail]
    • Помечено в качестве ответа Korolan 22 июля 2011 г. 6:27
    21 июля 2011 г. 12:56
  • Огромное человеческое спасибо Дмитрию за оказанную помощь.

    Далее я хочу сообщить конечный результат своих изысканий, оставляя только важное.

    Первое главное условие.

    Такой макрос корректно работает только если помещен в персональном модуле. Для макросов более простых в один модуль можно помещать несколько. Так, у меня модуль по управлению текстом содержит более 10 макросов.

    А теперь сам код.

        ' Declare for call to mpr.dll.
       Declare Function WNetGetUser Lib "mpr.dll" _
          Alias "WNetGetUserA" (ByVal lpName As String, _
          ByVal lpUserName As String, lpnLength As Long) As Long

       Const NoError = 0       'The Function call was successful

       Sub ОтклШаблоныКомпании()

          ' Buffer size for the return string.
          Const lpnLength As Integer = 255

          ' Get return buffer space.
          Dim status As Integer

          ' For getting user information.
          Dim lpName, lpUserName As String

          ' Assign the buffer size constant to lpUserName.
          lpUserName = Space$(lpnLength + 1)

          ' Get the log-on name of the person using product.
          status = WNetGetUser(lpName, lpUserName, lpnLength)

          ' See whether error occurred.
          If status = NoError Then
             ' This line removes the null character. Strings in C are null-
             ' terminated. Strings in Visual Basic are not null-terminated.
             ' The null character must be removed from the C strings to be used
             ' cleanly in Visual Basic.
             lpUserName = Left$(lpUserName, InStr(lpUserName, Chr(0)) - 1)
          Else

             End
          End If
    '
    '   Переводим расположение файлов (общие и автозагружаемые) Word в состояние по умолчанию
    '
    '   Первое. Общие шаблоны. По умолчанию адрес пуст.
    '   Создаем папку, для единообразия (универсальности) на любом компьютере используем диск С:
    '
        MkDir "c:\_Share"
    '
    '   Переключаем на эту папку путь (расположение) файлов общих шаблонов
        Options.DefaultFilePath(Path:=wdWorkgroupTemplatesPath) = "c:\_Share"
    '
    '   Удаляем папку
        RmDir "c:\_Share"
    '
    '   Теперь в строке расположения общих шалонов записей нет

    '   Второе. Задаем директорию расположения автозагружаемых файлов в состояние по умолчанию
    '
        Options.DefaultFilePath(Path:=wdStartupPath) = _
            "C:\Documents and Settings\" & lpUserName & "\Application Data\Microsoft\Word\STARTUP\"
           
    '   Наилучшие пожелания
           
        MsgBox Prompt:="До свидания! Вы успешно отключились от шаблонов компании. Ваш компьютер переключен к локальному расположению шаблонов по умолчанию.", Buttons:=vbInformation, Title:="Отключение от шаблонов компании"
           
    '   Проверки отработки видимо не нужны, т.к. сообщение вызываю в последнюю очередь, а если что  не сработает,
    '   то выполнение макроса прервется, т.е. будет сообщение об ошибке, а не информационное

    End Sub

     


    Korolan
    22 июля 2011 г. 6:33