2014-02-06 4 views
1

Я создаю пользовательскую форму vba в Word. Теперь я работаю над функцией, которая позволяет пользователю просматривать файл изображения, загружать его в элемент управления Image в пользовательской форме и отображать путь к файлу в текстовом поле (вид функции предварительного просмотра изображения, который также позволяет пользователю напрямую изменять файл на редактирование текстового поля). С помощью я понял, код, необходимый для одной кнопки «Browse» следующим образом:Вставка изображения в пользовательскую форму в VBA

Private Sub btnBrowse1_Click() 
Dim fd As FileDialog 
Dim strPicPath1 As String 
Dim vrtSelected As Variant 

Set fd = Application.FileDialog(msoFileDialogFilePicker) 
    With fd 
     .AllowMultiSelect = False 
      If .Show = -1 Then 
       For Each vrtSelected In .SelectedItems 
        AutoReport.txtboxPicPath1.Text = vrtSelected 
        strPicPath1 = vrtSelected 
        AutoReport.Image1.Picture = LoadPicture(strPicPath1) 
       Next vrtSelected 
      Else: Exit Sub 
      End If 
    End With 
End Sub 

Однако, как я около 8 из этих кнопок Обзора, я хочу «обобщать» процесс, написав процедуру так что я могу просто назвать это вместо того, чтобы писать ту же структуру, в 8 раз, что-то вроде этого:

Sub FormLoadPicture(TxtboxToFill As TextBox, ImageBox As Image, objForm As Object) 
Dim fd As FileDialog 
Dim vrtSelected As Variant 
Dim PicPath As String 
Dim i As Long 
      Set fd = Application.FileDialog(msoFileDialogFilePicker) 
       With fd 
        .AllowMultiSelect = False 
        If .Show = -1 Then 
         For Each vrtSelected In .SelectedItems 
          objForm.TxtboxToFill.Text = vrtSelected 
          PicPath = vrtSelected 
          objForm.ImageBox.Picture = LoadPicture(PicPath) 
         Next vrtSelected 
        Else: Exit Sub 
        End If 
       End With 
     End If 
    Next i 
End Sub 

Когда я называю его (т.е. FormLoadPicture (txtboxPicPath2, Image2, меня), он дал мне «Синтаксическая ошибка». Я подозреваю, что я пишу код для ссылки на неправильный контроль формы, но я не знаю, что должно быть правильно.

ответ

0

Добро пожаловать в этот форум.
Я вижу несколько моментов здесь:

1.) Да, это сбивает с толку, но типы как Textbox и Image, кажется, относятся к ActiveX-элементов управления-типов, которые используются на листе. Элементы управления UserForms имеют разные типы, и вы должны использовать это здесь:

Sub FormLoadPicture(TxtboxToFill As MSForms.TextBox, _ 
    ImageBox As MSForms.Image, objForm As MSForms.UserForm) 

2.)
Если вы не используете AllowMultiSelect, вы не должны использовать цикл, просто использовать .SelectedItems(1)

3.)
Ваши параметры являются ссылками на объекты, вы можете использовать их как таковые, а не как свойства пользовательской формы.
Это означает, что ImageBox.Picture = LoadPicture(PicPath)
вместо objForm.ImageBox.Picture = LoadPicture(PicPath)

4.) При вызове к югу, вы не можете использовать скобки, как в FormLoadPicture(txtboxPicPath2,Image2,me)
Это работает (и часто рассматривается), если есть только один аргумент, но имеет другое значение (включение параметров в скобки обеспечивает их передачу по значению).
(только вызовы функций на правой стороне уступки помещаются в скобки в VBA.)

Private Sub CommandButton1_Click() 
    FormLoadPicture Me.TextBox1, Me.Image1, Me 
End Sub 

Sub FormLoadPicture(TxtboxToFill As MSForms.TextBox, _ 
    ImageBox As MSForms.Image, objForm As MSForms.UserForm) 
    Dim fd As FileDialog 
    Dim PicPath As String 

    Set fd = Application.FileDialog(msoFileDialogFilePicker) 
    With fd 
     .AllowMultiSelect = False 
     If .Show = -1 Then 
      PicPath = .SelectedItems(1) 
      TxtboxToFill.Text = PicPath 
      ImageBox.Picture = LoadPicture(PicPath) 
     Else: Exit Sub 
     End If 
    End With 

End Sub 
+0

Спасибо @KeKuSemau. Я новичок-самоучка, поэтому в настоящий момент это пробная версия и ошибка. Я думал, что ссылки на элементы управления формами будут такими же, как и для закладок в документе. Это прояснило это для меня, спасибо снова –

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