Excel VBA не может получить свойство Match класса WorksheetFunction - PullRequest
0 голосов
/ 10 мая 2018

У меня есть текстовое поле в моей пользовательской форме, которое имеет то же имя, что и заголовок метки без пробела.Например, текстовое поле будет называться «SampleName», а заголовок метки будет «Sample Name».При нажатии кнопки «Отправить» я хотел бы, чтобы данные вводились в рабочую книгу в соответствующем столбце, названном так же, как название и текстовое поле.Я не могу удалить пространство из заголовка столбца, так как оно требуется для импорта в другое программное обеспечение.Однако, когда я нажимаю "Отправить", он всегда возвращает ошибку времени выполнения, не в состоянии получить свойство соответствия.Когда я пытаюсь этот код при вводе Label.ctlname.Caption вручную, он работает нормально.Есть предложения?

Dim ssheet As Worksheet
Dim rngsource As Range

Set ssheet = ThisWorkbook.Sheets("Sheet1")

nr = ssheet.Cells(Rows.Count, 1).End(xlUp).Row + 1


With ssheet
  Set rngsource = Range(Cells(1, 1), Cells(1, Range("A1").End(xlToRight).Column))

Dim ctl
Dim ctlname As String

For Each ctl In Me.Controls
    If TypeOf ctl Is msforms.TextBox Then
            ctlname = "Label" & ctl.Name & ".Caption"
            .Cells(nr, Application.WorksheetFunction.Match(ctlname, rngsoruce, 0)) = ctl
            ctl.Text = ""
    End If
Next ctl

End With

1 Ответ

0 голосов
/ 11 мая 2018

Я предлагаю:

  1. Определите Labels в пользовательской форме
  2. Установите соответствующий текстовый блок в метку
  3. Постройте имя поля и получите столбец поля
  4. Разместите значение TextBox в соответствующем столбце поля
  5. Очистить текстовое поле

Эта процедура выполняется в соответствии с шагами, определенными выше, и предусматривает возможные форматы имени поля на листе, используйте требуемый формат и комментируйте \ удаляйте остальные.

Sub UserForm_PostToWsh()
Dim ws As Worksheet, rgSrc As Range
Dim oCtrl As Object, MsfTb As MSForms.TextBox
Dim sFld As String, lRow As Long

    Set ws = ThisWorkbook.Sheets("Sheet1")
    With ws
        lRow = 1 + .Cells(.Rows.Count, 1).End(xlUp).Row
        Set rgSrc = .Cells(1).Resize(1, .Cells(1).End(xlToRight).Column)
        For Each oCtrl In UfrNew_01.Controls

            Rem Validate Control as Label
            If TypeOf oCtrl Is MSForms.Label Then

                Rem Set Associated TextBox
                Set MsfTb = Nothing
                On Error Resume Next
                Set MsfTb = UfrNew_01.Controls(Replace(oCtrl.Name, "Label", vbNullString))
                On Error GoTo 0

                Rem Validate TexBox
                If Not MsfTb Is Nothing Then
                    sFld = oCtrl.Name & "." & oCtrl.Caption     'If Field format is LabelName.LabelCaption use this line
                    'sFld = oCtrl.Name & "." & MsfTb.Name        'If Field format is LabelName.TextBoxName use this line
                    'sFld = oCtrl.Caption & "." & oCtrl.Name     'If Field format is LabelCaption.LabelName use this line
                    'sFld = oCtrl.Caption & "." & MsfTb.Name     'If Field format is LabelCaption.TextBoxName use this line
                    'sFld = MsfTb.Name & "." & oCtrl.Name        'If Field format is TextBoxName.LabelName use this line
                    'sFld = MsfTb.Name & "." & oCtrl.Caption     'If Field format is TextBoxName.LabelCaption use this line

                    Rem Post Text Value
                    .Cells(lRow, WorksheetFunction.Match(sFld, rgSrc, 0)) = MsfTb.Value

                    Rem Initialize TextBox
                    MsfTb.Text = vbNullString

    End If: End If: Next: End With

    End Sub
...