Microsoft Excel:

  Таблицы и VBA. Справочник.
  Вопросы и Ответы. Советы. Примеры.
Меню FAQ | Макросы | MSForms


Rambler's Top100


Counter CO.KZ


    [1] [2] [2/1] [2 t] [3] [4]

  1. Как для нескольких TextBox'ов создать контекстное меню, позволяющее копировать, вырезать и вставлять данные ? 15.06.2010
  2. Как отобразить содержимое текстового файла в TextBox, ListBox (без построчного чтения) ? 27.05.2005
  3. Как заполнить ячейки данными TextBox, т.е. вывести содержимое текстового поля построчно ? 21.03.2007
  4. Как программно выделить весь текст в TextBox, например, после нажатия кнопки ? 30.12.2006
  5. Как программно выделить необходимый текст в TextBox, ComboBox ? 04.09.2010
  6. Как позволить вводить в TextBox только цифры ?
    Как запретить ввод данных не являющихся цифрами ?
    11.02.2007
  7. Как позволить вводить в TextBox символы только один раз ?
    Как запретить ввод повторов ?
    02.09.2016
  8. Как не позволить вводить в TextBox определенные символы ? 02.09.2016
  9. Как не позволить копировать данные в TextBox ?
    Как запретить вставку скопированных данных в TextBox ?
    11.02.2007
  10. Как запретить удаление, вырезание, копирование и вставку скопированных данных в TextBox ? 11.02.2007
  11. Как узнать какие из клавиш SHIFT, CTRL, ALT были нажаты при работе с TextBox ? 04.09.2016
  12. Как заставить пользователя вводить данные в нужные TextBox ? 18.07.2010
  13. Как при получении фокуса менять цвет шрифта и/или заливки, а при потере возвращать всё обратно (TextBox) ? 27.03.2011
  14. Как при получении фокуса менять цвет границ текстового поля, т.е. "подсвечивать" активный TextBox ? 01.05.2012
  15. Как программно менять шрифт у элементов управления, в т.ч. TextBox, ComboBox и ListBox ? 27.03.2011
  16. Как с помощью TextBox выбрать нужную рабочую книгу и получить полный путь, причём, не открывая файл ? 30.03.2011
  17. Как организовать проверку орфографии в TextBox ? 25.04.2014
    [1] [2] [2/1] [2 t] [3] [4]


  • Ответ : Скачать пример

    Для того, чтобы для нескольких TextBox'ов создать контекстное меню, которое будет вызываться кликом правой кнопки мышки, и будет содержать команды, позволяющие копировать, вырезать и вставлять данные, проделайте следующее

    Скопируйте этот код в модуль нужной UserForm
  • Private Sub UserForm_Initialize()
        With Application.CommandBars.Add(Name:=Me.Name, Position:=msoBarPopup)
             .Controls.Add(Id:=21).OnAction = "TextCut"
             .Controls.Add(Id:=19).OnAction = "TextCopy"
             .Controls.Add(Id:=22).OnAction = "TextPaste"
        End With
    End Sub

    Private Sub UserForm_Terminate()
        Application.CommandBars(Me.Name).Delete
    End Sub

    Private Sub TextBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        TextBox_KeyButton Button
    End Sub

    Private Sub TextBox2_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        TextBox_KeyButton Button
    End Sub

    Private Sub TextBox3_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        TextBox_KeyButton Button
    End Sub

    Private Sub TextBox_KeyButton(Button As Integer)
        If Button = vbKeyRButton Then _
        Application.CommandBars(Me.Name).ShowPopup
    End Sub
    А этот код разместите в стандартном модуле
    Private Sub UserForm_Show()
        UserForm1.Show
    End Sub

    Private Sub TextCut()
        UserForm1.ActiveControl.Cut
    End Sub

    Private Sub TextCopy()
        UserForm1.ActiveControl.Copy
    End Sub

    Private Sub TextPaste()
        UserForm1.ActiveControl.Paste
    End Sub
    В этом примере используется Диалоговое окно - UserForm1, а также элементы управления Текстовое поле - TextBox1, TextBox2, TextBox3 для которых и создаётся контекстное меню. Обратите внимание на то, что имя контекстного меню, которое совпадает с именем формы (необязательное условие) должно быть уникальным, т.к. если панель инструментов с аналогичным именем уже существует, то при попытке создания новой панели, Вы получите ошибку. Этой ошибки можно избежать, если перед созданием панели проверить, нет ли панели с этим именем или же отказаться от использования необязательного аргумента Name метода .Add (см. аналогичный пример2)

    Вариант II. Если предварительно скачать контрол iemenu.ocx (IE Popup Menu) и добавить его в список доступных ссылок, то создать контекстное меню можно с помощью этого элемента управления (см. пример3)
  • Ответ :

    Вариант I.
  • Private Sub UserForm_Initialize()

        TextBox1.MultiLine = True
        TextBox1.ScrollBars = fmScrollBarsVertical

        iFullName$ = "C:\TextFile\Test.txt"

        Open iFullName$ For Input As #1
             iText$ = Input(LOF(1), #1)
        Close #1

        TextBox1.Text = iText$
        TextBox1.SelStart = 0

        ListBox1.List = Split(iText$, vbCrLf)

    End Sub
    Вариант II.
    Private Sub UserForm_Initialize()

        TextBox1.MultiLine = True
        TextBox1.ScrollBars = fmScrollBarsVertical

        iFullName$ = "C:\TextFile\Test.txt"

        Open iFullName$ For Binary As #1
             iText$ = Space(LOF(1))
             Get #1, , iText$
        Close #1

        TextBox1.Text = iText$
        TextBox1.SelStart = 0

        ListBox1.List = Split(iText$, vbCrLf)

    End Sub
    Внимание :
  • Значения свойств MultiLine и ScrollBars можно установить вручную
  • Функция Split() появилась только в MS Excel 2000
  • Ответ : Скачать пример
    Для того, чтобы заполнить ячейки данными текстового поля, у которого значение свойства MultiLine установлено как True, можно использовать построчное чтение. Если ячейки уже заполнены, то удалите содержимое и форматы этих ячеек(столбца), предварительно проверив не защищены ли они [FAQ173]

    Вариант I. (построчное чтение)
  • If TextBox1.Value <> "" Then
        iText$ = TextBox1.Value & vbCrLf
        iStart& = 1
        iPosition& = InStr(iStart&, iText$, vbCrLf)
        Do While iPosition& <> 0
           iStrLine$ = Mid(iText$, iStart&, iPosition& - iStart&)
           iStart& = iPosition& + 2: iRow& = iRow& + 1
           iPosition& = InStr(iStart&, iText$, vbCrLf)
           Select Case True
               Case IsNumeric(iStrLine$)
                  Cells(iRow&, 1) = CDbl(iStrLine$)
               Case IsDate(iStrLine$)
                  Cells(iRow&, 1) = CDate(iStrLine$)
               Case InStr(iStrLine$, "=") = 1 'Left(iStrLine$, 1) = "="
                  Cells(iRow&, 1) = "'" & iStrLine$
               Case Else
                  Cells(iRow&, 1) = iStrLine$
           End Select
        Loop
        Cells(iRow&, 1).EntireColumn.AutoFit 'Columns(1).AutoFit
    End If
    Примечание :
  • Для ввода чисел с лидирующим нулём необходимо добавить соответствующую проверку.
  • При большом количестве строк в текстовом поле, имеет смысл отключить обновление экрана [FAQ43]

    Вариант II. (без построчного чтения)
  • If TextBox1.Value <> "" Then
        iMassiv = Split(TextBox1.Value, vbNewLine)
        iResult = Application.Match("=*", iMassiv, 0)
        If Not IsError(iResult) Then 'Or IsNumeric(iResult)
           If MsgBox("Вы хотите установить текстовый формат ячеек ?", vbYesNo + vbQuestion, _
              "В текстовом поле есть данные содержащие лидирующий знак равно") = vbYes Then
              With Range("A1").Resize(UBound(iMassiv) + 1)
                   .NumberFormat = "@"
                   .Value = Application.Transpose(iMassiv)
                   .EntireColumn.AutoFit
              End With
           Else
              MsgBox "В таком случае, воспользуйтесь построчным чтением", vbInformation, ""
           End If
        End If
    End If
    Примечание :
  • Функция Split() появилась только в MS Excel 2000
  • После установки текстового формата MS Excel будет воспринимать числа и даты (если таковые конечно имеются) как текст (со всеми вытекающими последствиями)
  • Ответ : Скачать пример

    Вариант I.
  • Private Sub CommandButton1_Click()
        TextBox1.SetFocus: TextBox1.SelStart = 0
        SendKeys "+{END}": SendKeys "+{PGDN}"
    End Sub
    Вариант II.
    Private Sub CommandButton2_Click()
        TextBox1.SetFocus
        TextBox1.SelStart = 0
        TextBox1.SelLength = TextBox1.TextLength
    End Sub
    Private Sub CommandButton2_Click()
        With TextBox1
             .SetFocus
             .SelStart = 0
             .SelLength = .TextLength
        End With
    End Sub

  • Ответ : Скачать пример

    Для того, чтобы программно выделить, например, третий символ в текстовом поле (или в поле со списком) можно использовать :
  • TextBox1.SetFocus
    TextBox1.SelStart = 2
    TextBox1.SelLength = 1
    Для выделения нескольких символов, например, со второго по четвёртый достаточно изменить всего лишь значение свойства SelLength, т.е.
    With Me.TextBox1 'ComboBox1
         .SelStart = 1
         .SelLength = 2
         .SetFocus
    End With
    Если позиция текста, который нужно выделить, неизвестна, то в таком случае можно воспользоваться следующими вариантами (предположим, что поле заполнено, а регистр значения не имеет)
    Option Compare Text
    
    Private Sub CommandButton1_Click()
        iText$ = "искомый_текст" '"ИСКОМЫЙ_ТЕКСТ"
        
        With Me.TextBox1 'ComboBox1
             If .Value Like "*" & iText$ & "*" Then
                .SetFocus
                .SelStart = InStr(1, .Value, iText$, vbTextCompare) - 1
                .SelLength = Len(iText$)
             End If
        End With    
    End Sub
    Private Sub CommandButton1_Click()
        iText$ = "ИСКОМЫЙ_ТЕКСТ" '"искомый_текст"
        
        With Me.TextBox1 'ComboBox1
             iPosition% = InStr(1, .Value, iText$, vbTextCompare)
             If iPosition% > 0 Then
                .SetFocus
                .SelStart = iPosition% - 1
                .SelLength = Len(iText$)
             End If
        End With    
    End Sub
    Если же регистр важен, т.е. строчные и прописные буквы должны различаться, то в обоих случаях используйте InStr(.Value, iText$), а в первом варианте ещё и уберите инструкцию Option Compare Text

    Примечание : Если у Вас возникли трудности с реализацией данного совета, применительно к многострочному текстовому полю, то решение можно скачать здесь.
  • Ответ : Скачать пример

    Вариант I.
  • Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If KeyAscii < 48 Or KeyAscii > 57 Then
           KeyAscii = 0
        End If
    End Sub

    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0
    End Sub
    Вариант II.
    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If Chr(KeyAscii) Like "[!0-9]" Then
           KeyAscii = 0
        End If
    End Sub

    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If Chr(KeyAscii) Like "[!0-9]" Then KeyAscii = 0
    End Sub
    Вариант III.
    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If Not Chr(KeyAscii) Like "#" Then
           KeyAscii = 0
        End If
    End Sub

    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If Not Chr(KeyAscii) Like "#" Then KeyAscii = 0
    End Sub
    Вариант IV.
    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If InStr("0123456789", Chr(KeyAscii)) = 0 Then
           KeyAscii = 0
        End If
    End Sub

    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If InStr("0123456789", Chr(KeyAscii)) = 0 Then KeyAscii = 0
    End Sub
    Внимание : Для того, чтобы в текстовое поле можно было вводить только цифры, необходимо также запретить и вставку скопированных данных [см. ниже]

    Комментарий : Обладатели WinNT/2000/XP/ обязательно должны заменить функцию Chr() на ChrW()

    Вариант V. Этот вариант не запрещает ввод данных, не являющихся цифрами, он просто возвращает предыдущий вариант, при неправильном вводе. Однако, мощность современных компьютеров возрасла настолько, что среднестатистический человек просто не заметит отката.
    Private oldText$

    Private Sub TextBox1_Change()
        If TextBox1 Like "*[!0-9]*" Then
           TextBox1 = oldText
        Else
           oldText = TextBox1
        End If
    End Sub
    или
    Static Sub TextBox1_Change()
        If TextBox1 Like "*[!0-9]*" Then
           TextBox1 = oldText$
        Else
           oldText$ = TextBox1
        End If
    End Sub

  • Ответ :

    Если существует необходимость ввода в текстовое поле только уникальных(неповторяющихся ранее) символов. Иначе говоря, Вам нужно запретить ввод символов, которые уже наличествуют в тексте, то используйте нижеопубликованный вариант, где событие TextBox1_KeyPress применяется для запрета ввода дублей(повторов), а событие TextBox1_KeyDown для запрета вставки скопированных данных, которые могут содержать дубли(повторы)

    Вариант I.
  • Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If InStr(1, TextBox1.Value, ChrW(KeyAscii), vbTextCompare) > 0 Then KeyAscii = 0
    End Sub

    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = vbKeyV And Shift = 2 Then KeyCode = 0
    End Sub
    Комментарий : Если регистр символов должен учитываться, т.е. "F" и "f" не должны считаться повторами, то при вызове VB(A) функции InStr не используйте четвёртый аргумент (см. далее), или воспользуйтесь вторым вариантом.
    If InStr(TextBox1.Value, ChrW(KeyAscii)) > 0 Then KeyAscii = 0
    Вариант II.
    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If TextBox1.Value Like "*" & ChrW(KeyAscii) & "*" Then KeyAscii = 0
    End Sub

    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = vbKeyV And Shift = 2 Then KeyCode = 0
    End Sub

  • Ответ :

    Для того, чтобы запретить ввод ненужных символов, например, символов, которые не могут использоваться в имени файла, можно использовать следующий вариант. Где событие TextBox1_KeyPress применяется для запрета ввода ненужных символов, а событие TextBox1_KeyDown для запрета вставки скопированных данных, которые, могут содержать запрещённые символы.
  • Const charsTabu = "/\?:*""<>|"

    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If InStr(charsTabu, Chr(KeyAscii)) > 0 Then KeyAscii = 0
    End Sub

    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = vbKeyV And Shift = 2 Then KeyCode = 0
    End Sub
    Аналогичным способом можно запретить и ввод букв, цифр и пр. :
    Const charsTabu = "abc1$абв": Option Compare Text

    Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
        If InStr(charsTabu, ChrW(KeyAscii)) > 0 Then KeyAscii = 0
    End Sub

    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = vbKeyV And Shift = 2 Then KeyCode = 0
    End Sub
    Комментарий : Если регистр символов должен учитываться, т.е. "B" и "b" не должны считаться одной буквой, то просто уберите инструкцию : Option Compare Text
  • Ответ : Скачать пример
  • Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = vbKeyV And Shift = 2 Then
           KeyCode = 0
        End If
    End Sub

    Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        If KeyCode = vbKeyV And Shift = 2 Then KeyCode = 0
    End Sub

  • Ответ : Скачать пример
  • Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        Select Case KeyCode
            Case vbKeyC And Shift = 2
                 'Копировать CTRL+C
                 KeyCode = 0
            Case vbKeyV And Shift = 2
                 'Вставить CTRL+V
                 KeyCode = 0
            Case vbKeyX And Shift = 2
                 'Вырезать CTRL+X
                 KeyCode = 0
            Case vbKeyDelete
                 'Удалить DELETE
                 KeyCode = 0
        End Select
    End Sub
    Примечание : В примере также присутствует блокировка нажатия клавиш BackSpace и CTRL+Z (Отмена)

    Если же вставка скопированных/вырезанных данных может осуществляться в т.ч. и программно, например, с помощью контекстного меню, то в этом случае достаточно использовать :
    Private Sub TextBox1_BeforeDropOrPaste(ByVal Cancel As MSForms.ReturnBoolean, ByVal Action As Long, ByVal Data As MSForms.DataObject, ByVal X As Single, ByVal Y As Single, ByVal Effect As MSForms.ReturnEffect, ByVal Shift As Integer)
        Cancel = True
    End Sub

  • Ответ :

    Для того, чтобы определить какие из клавиш SHIFT, CTRL, ALT были нажаты при работе с текстовым именем с именем TextBox1, можно использовать следующий вариант. Вывод информации в заголовке пользовательской формы, на которой размещается текстовое поле, используется только для наглядности и, разумеется, не носит обязательного характера.
  • Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
        Select Case Shift
            Case 0
               Me.Caption = "Вы не использовали клавиши Shift, Ctrl, Alt"
            Case 1
               Me.Caption = "Вы нажали клавишу Shift"
            Case 2
               Me.Caption = "Вы нажали клавишу Ctrl"
            Case 3
               Me.Caption = "Вы нажали клавиши Shift+Ctrl"
            Case 4
               Me.Caption = "Вы нажали клавишу Alt"
            Case 5
               Me.Caption = "Вы нажали клавиши Shift+Alt"
            Case 6
               Me.Caption = "Вы нажали клавиши Ctrl+Alt"
            Case 7
               Me.Caption = "Вы нажали клавиши Shift+Ctrl+Alt"
        End Select
    End Sub

  • Ответ :

    Если Ваша пользовательская форма предусматривает наличие текстовых полей, которые обязательно должны быть заполнены, но есть вероятность, что кто-то может забыть это сделать, то заставить ввести данные (или скопировать, если это допускается) можно несколькими способами, к примеру, просто предварительно проверить содержит ли текст нужный TextBox, т.е.

    Вариант I.
  • Private Sub CommandButton1_Click()
        If TextBox1.Value <> "" Then
           'Здесь идёт основной код
        Else
           TextBox1.SetFocus
           MsgBox "Заполните, пожалуйста, текстовое поле", , ""
        End If
    End Sub
    Private Sub CommandButton1_Click()
        If TextBox1.TextLength = 0 Then
           TextBox1.SetFocus
           MsgBox "Заполните, пожалуйста, текстовое поле", , ""
           Exit Sub
        End If
        'Здесь идёт основной код
    End Sub
    Или использовать событие TextBox1_Exit, которое позволит оставить фокус ввода в нужном текстовом поле, если то окажется пустым. Далее приведены несколько способов реализации вышесказанного, при желании, Вы можете добавить сообщение о необходимости заполнения TextBox (см. первый вариант)

    Вариант II.
    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        If TextBox1.Value = "" Then
           Cancel = True
        Else
           Cancel = False
        End If
    End Sub
    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        If TextBox1.TextLength = 0 Then
           Cancel = True
        Else
           Cancel = False
        End If
    End Sub
    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        Cancel = IIf(TextBox1.Value = "", True, False)
    End Sub
    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        Cancel = IIf(TextBox1.TextLength, False, True)
    End Sub
    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        Cancel = TextBox1.Value = ""
    End Sub
    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        Cancel = TextBox1.TextLength = 0
    End Sub
    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        Cancel = Not CBool(TextBox1.TextLength)
    End Sub

  • Ответ :

    Если Вам необходимо, чтобы при получении фокуса - цвет шрифта у текстового поля менялся на нужный, а при потере фокуса, возвращался первоначальный цвет, то используйте два следующих события, только не забудьте указать свой колор.
  • Private Sub TextBox1_Enter()
        TextBox1.ForeColor = vbRed   'RGB(255, 0, 0)
    End Sub
    
    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        TextBox1.ForeColor = vbBlack 'RGB(0, 0, 0)
    End Sub
    Если кроме цвета шрифта необходимо поменять ещё и цвет заливки, то :
    Private Sub TextBox1_Enter()
        TextBox1.BackColor = vbRed   'RGB(255, 0, 0)
        TextBox1.ForeColor = vbWhite 'RGB(255, 255, 255)
    End Sub
    
    Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        TextBox1.BackColor = vbWhite 'RGB(255, 255, 255)
        TextBox1.ForeColor = vbBlack 'RGB(0, 0, 0)
    End Sub

  • Ответ : Скачать пример

    Если при получении фокуса необходимо менять цвет границ текстового поля, проще говоря, "подсвечивать" активный TextBox, то можно использовать события, которые уже упоминались в предыдущем ответе. Однако, так как у текстового поля нет свойства, позволяющего менять цвет границ, придётся создать имитацию, т.е. воспользоваться дополнительным элементом управления (несколько примеров можно скачать здесь)
  • Ответ :

    Вариант I.
  • TextBox1.FontName = "Courier"
    Вариант II.
    TextBox1.Font.Name = "Arial"
    Примечание : Подобным способом изменить шрифт можно и у других элементов управления, в т.ч. RefEdit, Label, ComboBox, ListBox ...
  • Ответ :

    Если Вам, в процессе работы, необходимо иметь возможность выбора нужных рабочих книг, например, с помощью стандартного диалогового окна, а также получить путь (или просто имя файла) выбранной книги, причём, без её открытия, то просто создайте текстовое поле с именем TextBox1, и по мере необходимости используйте кнопку, расположенную справа (кнопка появится без Вашего участия)
  • Private Sub UserForm_Initialize()
        With TextBox1
             .DropButtonStyle = fmDropButtonStyleEllipsis
             .ShowDropButtonWhen = fmShowDropButtonWhenAlways
        End With
    End Sub
    
    Private Sub TextBox1_DropButtonClick()
        iFileName = Application.GetOpenFileName( _
        FileFilter:="Excel Files (*.xls),*.xls", Title:="Выберите рабочую книгу")
        If iFileName <> False Then
           TextBox1.Value = iFileName 'Dir(iFileName)
        Else
           MsgBox "Пожалуйста, не кликайте кнопки забавы ради"
        End If
    End Sub
    Комментарий : Для того, чтобы в диалоговом окне отображались все файлы, а не только файлы с расширением *.xls, уберите фильтрацию (смотрите аргумент FileFilter) Если же выбор должен осуществляться среди нескольких типов файлов, то в зависимости от ситуации, можно использовать следующие варианты :
    FileFilter:="Text Files (*.txt;*.csv;*.ini),*.txt;*.csv;*.ini"
    
    FileFilter:="Excel Files (*.xls),*.xls,Word Documents (*.doc),*.doc"
    

  • Ответ : Скачать пример

    Для того, чтобы в текстовом поле (TextBox) "найти" слова, написанные с ошибками, можно воспользоваться встроенной в MS Excel проверкой орфографии, т.е. использовать метод CheckSpelling об'екта Application.
  • Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
        If Not Application.CheckSpelling(LCase(TextBox1)) Then 'CheckSpelling(TextBox1, , False)
           'Cancel = True
           TextBox1.FontBold = True
           TextBox1.BackColor = vbRed
           TextBox1.ForeColor = vbWhite
        Else
           TextBox1.FontBold = False
           TextBox1.BackColor = vbWhite
           TextBox1.ForeColor = vbBlack
        End If
    End Sub
    Комментарий : Обратите внимание на наличие в коде VB(A) функции LCase, применение которой позволяет проверять также слова, написанные прописными буквами, даже если в настройках Проверки орфографии стоит "флажок" напротив игнорировать ВЕРХНИЙ РЕГИСТР (см.скриншот) И, разумеется, её использование не приводит к снятию уже упомянутого "флажка", в отличии от применения необязательного аргумента IgnoreUppercase
    Application.CheckSpelling(Word:=TextBox1, IgnoreUppercase:=False)

    Воспроизведение любых опубликованных здесь материалов возможно только с письменного разрешения автора : Microsoft Excel 95, 97, 2000, XP

    © 2004-2016 Климов П.Ю. Все права защищены. WebDesign & Error's Klimoff