2016-07-08 5 views
0

Я хотел бы поблагодарить всех, кто заботится о моей проблеме заранее.Excel VBA - ввод текстового поля дополнительно

Если мой код, размещенный ниже, не очень эффективен, обратите внимание, что я только что начал с vba и никогда не имел классов программирования. Пожалуйста, простите мой англичан. Также обратите внимание, что я консультировался как с Google, так и с внутренним поиском.

Подходя к проблеме (ы):

Userform visualization for understanding

(1) У меня есть combobx "CGselectionStrategies", которые должны стать основой для ввода Textboxes ниже. Когда пользовательская форма запускается, я бы хотел, чтобы она отображала предыдущий ввод для этих полей, в зависимости от выбора Combobox.

Входной сохраняется на листе "Товарные группы" со следующим кодом:

Private Sub SaveCGStrategies_Click() 

'Just general stuff 
Dim outputBook As Workbook 
Set outputBook = ActiveWorkbook 

'Note-fields for PU Strategies, incl. Authors 
Dim CGselectionStrategies As String 
Dim NoteTargetMarket As String 
Dim AuthorTargetMarket As String 
Dim NotePUMStrategy As String 
Dim AuthorPUMStrategy As String 
Dim NotePUSStrategy As String 
Dim AuthorPUSStrategy As String 
Dim NotePULStrategy As String 
Dim AuthorPULStrategy As String 

CGselectionStrategies = Me.CGselectionStrategies 
NoteTargetMarket = Me.NoteTargetMarket 
AuthorTargetMarket = Me.NoteAuthorMarketInfo 
NotePUMStrategy = Me.NotePUMStrat 
AuthorPUMStrategy = Me.NoteAuthorPUMStratInfo 
NotePUSStrategy = Me.NotePUSStrat 
AuthorPUSStrategy = Me.NoteAuthorPUSStratInfo 
NotePULStrategy = Me.NotePULStrat 
AuthorPULStrategy = Me.NoteAuthorPULStratInfo 

'Save CG Strategies behind them in the List on CG Worksheet 
outputBook.Activate 
outputBook.Worksheets("Commodity Groups").Select 

With Me.CGselectionStrategies 
If Me.CGselectionStrategies.value = "Halbzeuge (und Rohstoffe)" Then 
    Range("K2").Select 
    ActiveCell.value = NoteTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = AuthorTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUMStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUMStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUSStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUSStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePULStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPULStratInfo 
End If 
If Me.CGselectionStrategies.value = "Mechanische Konstruktionsteile" Then 
    Range("K62").Select 
    ActiveCell.value = NoteTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = AuthorTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUMStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUMStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUSStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUSStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePULStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPULStratInfo 
End If 
If Me.CGselectionStrategies.value = "Norm- und Katalogteile (ausser Elektro)" Then 
    Range("K87").Select 
    ActiveCell.value = NoteTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = AuthorTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUMStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUMStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUSStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUSStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePULStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPULStratInfo 
End If 
If Me.CGselectionStrategies.value = "Elektrische, elektronische und optische Komponenten und Baugruppen" Then 
    Range("K127").Select 
    ActiveCell.value = NoteTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = AuthorTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUMStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUMStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUSStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUSStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePULStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPULStratInfo 
End If 
If Me.CGselectionStrategies.value = "Hilfs-, Betriebs- und Produktionshifsmittel" Then 
    Range("K180").Select 
    ActiveCell.value = NoteTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = AuthorTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUMStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUMStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUSStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUSStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePULStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPULStratInfo 
End If 
If Me.CGselectionStrategies.value = "Subsysteme und Anlagen" Then 
    Range("K256").Select 
    ActiveCell.value = NoteTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = AuthorTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUMStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUMStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUSStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUSStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePULStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPULStratInfo 
End If 
If Me.CGselectionStrategies.value = "Handelsware" Then 
    Range("K299").Select 
    ActiveCell.value = NoteTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = AuthorTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUMStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUMStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUSStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUSStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePULStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPULStratInfo 
End If 
If Me.CGselectionStrategies.value = "Dienstleistungen" Then 
    Range("K310").Select 
    ActiveCell.value = NoteTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = AuthorTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUMStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUMStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUSStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUSStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePULStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPULStratInfo 
End If 
If Me.CGselectionStrategies.value = "Allgemeines und Administration" Then 
    Range("K360").Select 
    ActiveCell.value = NoteTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = AuthorTargetMarket 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUMStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUMStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePUSStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPUSStratInfo 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NotePULStrat 
    ActiveCell.Offset(0, 1).Select 
    ActiveCell.value = NoteAuthorPULStratInfo 
End If 
End With 

End Sub 

Мой подход был следующий ...

'Show old Strategies when selecting a combobox-item 
'Start with short Text "Please choose a Commodity Group" 
If Me.CGselectionStrategies.value = "" Then 
    Me.NoteTargetMarket.Text = CStr(ThisWorkbook.Sheets("Commodity Groups").Range("K445").value) 
    Me.Next Variable 
    Me.Next Variable 
    Me.Next Variable 
End If 
If Me.CGselectionStrategies.value = "Halbzeuge (und Rohstoffe)" Then 
    Me.NoteTargetMarket.Text = CStr(ThisWorkbook.Sheets("Commodity Groups").Range("K2").value) 
    Me.Next Variable 
    Me.Next Variable 
    Me.Next Variable 
End If 

... и так далее. Излишне говорить, что это не сработает. Я нашел следующий онлайн и попытался приспособить его в меру своих способностей, но безуспешно.

'Change Textbot Content based on Combobox selection 

Dim wks As Excel.Worksheet 
Dim selectedString As Variant 
Dim row As Long 
Dim value As Variant 

Set wks = Worksheets("Commodity Groups") 

If CGselectionStrategies.ListIndex <> -1 Then 
    selectedString = CGselectionStrategies.value 

    On Error Resume Next 
    row = Application.WorksheetFunction.Match(selectedString, wks.Columns(1), 0) 
    On Error GoTo 0 

    If row Then 

     value = wks.Cells(row, 2) 
     DomainOwnerTestBox.value = value 

    Else 

     'Value not found in the worksheet 'test' 

    End If 

End If 

End Sub 

Одна из проблем заключалась также в том, что существует несколько значений ввода, а не только в столбце 2, которые также разделены многими другими строками. Надеюсь, мой поблем объясняется понятным образом.

(2) Мой второй поблем, который является короче, касается того, как избежать заполнения всех текстовых полей в пользовательской форме. В одном вопросе есть более 200 входов для заполнения и всякий раз, когда я хочу проверить, то есть позиционирование ввода в базе данных, я получаю ошибку времени выполнения «Тип несоответствия». Однако, если я помещаю вход в каждую коробку, он проходит гладко. Здесь вычитается код, как я сохраняю свои данные из пользовательской формы. Вход:

Dim Datum As Date 
Dim SName As String 
Dim PotentialS As String 
Dim SuppNr As Long 
Dim Active As String 

Datum = Me.TextBox117 
SName = Me.SuppName 
PotentialS = Me.PotentialS 
SuppNr = Me.SuppNo 
Active = Me.Active 


'Go to the first empty line on the output sheet (Meta DB) in this workbook 
outputBook.Activate 
outputBook.Worksheets("Meta DB").Range("A3").Select 


If outputBook.Worksheets("Meta DB").Range("A3").Offset(1, 0) <> "" Then 
    outputBook.Worksheets("Meta DB").Range("A3").End(xlDown).Select 
End If 


'Go to A4 and from there always one below the last filled cell in A 
ActiveCell.Offset(1, 0).Select 
DatabaseRow = ActiveCell.row 


'Post Values for new Entry 
'Add a New Supplier Tab - Supplier Profile 
ActiveCell.value = Datum 
ActiveCell.Offset(0, 1).Select 
ActiveCell.value = SName 
ActiveCell.Offset(0, 1).Select 
ActiveCell.value = PotentialS 
ActiveCell.Offset(0, 1).Select 
ActiveCell.value = SuppNr 
ActiveCell.Offset(0, 1).Select 

Любая помощь и советы приветствуются. Я желаю вам всего приятного wekend.

+0

Таким образом, пользователь выбирает из выпадающего списка, вводит некоторые значения в некоторые текстовые поля, которые затем становятся значениями по умолчанию в указанных текстовых блоках, когда следующий раз пользователь делает тот же выбор combobox, это правильно? Не знаете, где вы выбрали привычку смещения select-activeecell, но вы могли бы сделать свой код намного короче и меньше подверженности ошибкам, напрямую ссылаясь на ячейки. Также рассмотрите возможность использования 'option explicit' в верхней части вашего кода, вы используете неопределенные переменные. Ссылка на пункт 2, вы не можете назначить переменную типа данных, а затем установить = null, проверить, является ли она незаполненной. –

+0

Просто хочу сказать, что вы хорошо себя зарекомендовали, пытаясь предоставить нам, насколько вы это сделали! Так держать! –

+0

Игнорирование вашей проблемы: вы можете использовать 'With ActiveCell' и' End With', чтобы сэкономить много времени, написав свой код. http://www.homeandlearn.org/with_end_with.html _ Приветствия в Германию, я думаю: P_ –

ответ

0

Во-первых, я думаю, что сокращение кода SaveCGStrategies_Click поможет понять VBA немного лучше, то, что вы сделали, один за другим проверяет каждый вариант, чтобы сохранить значения, но считайте, что выбран первый вариант, тогда вам никогда не нужно будет проверять остальные, как вы бы нашли совпадение, код также дублируется каждый раз, ниже проверяет выбор и запускает один экземпляр кода один раз, но против соответствующих ячеек.

Private Sub SaveCGStrategies_Click() 
Dim LngRow  As Long 
Dim outputBook As Workbook 
Dim outputSheet As Worksheet 

Set outputBook = ActiveWorkbook 
Set outputSheet = outputBook.Worksheets("Commodity Groups") 

'With Me.CGselectionStrategies 
Select Case Me.CGselectionStrategies.Value 

    Case "Halbzeuge (und Rohstoffe)" 
     LngRow = 2 
    Case "Mechanische Konstruktionsteile" 
     LngRow = 62 

    Case "Norm- und Katalogteile (ausser Elektro)" 
     LngRow = 87 

    Case "Elektrische, elektronische und optische Komponenten und Baugruppen" 
     LngRow = 127 

    Case "Hilfs-, Betriebs- und Produktionshifsmittel" 
     LngRow = 180 

    Case "Subsysteme und Anlagen" 
     LngRow = 256 

    Case "Handelsware" 
     LngRow = 299 

    Case "Dienstleistungen" 
     LngRow = 310 

    Case "Allgemeines und Administration" 
     LngRow = 360 

End Select 

outputSheet.Cells(LngRow, 11) = Me.NoteTargetMarket 
outputSheet.Cells(LngRow, 13) = Me.NoteAuthorMarketInfo 
outputSheet.Cells(LngRow, 14) = Me.NotePUMStrat 
outputSheet.Cells(LngRow, 15) = Me.NoteAuthorPUMStratInfo 
outputSheet.Cells(LngRow, 16) = Me.NotePUSStrat 
outputSheet.Cells(LngRow, 17) = Me.NoteAuthorPUSStratInfo 
outputSheet.Cells(LngRow, 18) = Me.NotePULStrat 
outputSheet.Cells(LngRow, 19) = Me.NoteAuthorPULStratInfo 

Set outputSheet = Nothing 
Set outputBook = Nothing 

End Sub 

Таким же образом вы ссылочного книгу, он также ссылается на таблицу, чтобы дать нам возможность писать в диапазоне рабочего листа, которые мы хотим с меньшим количеством кода. Я не использовал функции .Select и Activate, которые у вас были, поскольку они могут иметь проблемы с производительностью. Я также ссылался на значения напрямую и не помещал их в переменную во-первых, если вы планировали манипулировать ими до их записи в ячейку, тогда переменная может быть полезна, но если это прямая вставка из текстового поля в ячейку, мы может пройти через него.

Ваш второй вопрос требует большего ввода, чтобы быть уверенным, но я подозреваю, что относится к типам данных.

Dim Datum As Date 
Datum = Me.TextBox117 

Есть Me.TextBox117 дата в правильном формате даты? это может быть проверено, как показано ниже: -

If IsDate(Me.TextBox117) then Datum = CDate(Me.TextBox117) 

Функция CDate обеспечить значение передается в переменную в качестве даты.

Dim SuppNr As Long 
SuppNr = Me.SuppNo 

Действительно ли Me.SuppNo действительный номер? это может быть проверено, как показано ниже: -

If IsNumeric(Me.SuppNo) then SuppNr = CLng(Me.SuppNo) 

Моя рекомендация будет при получении его работы вы установите их все String или передавать их через, как есть.

+0

ваш улучшенный код работает как удовольствие, спасибо вам так много haha ​​ Я прочитаю о функции «Case» и попытаюсь реализовать его больше. К сожалению, у меня много времени, чтобы получить это и гораздо больше функциональности в инструменте Excel ... и это только та часть, где мне нужно все сэкономить Я не уверен, что это вопрос данных , потому что ошибка возникает только в том случае, если я оставляю соответствующий вход в TextBox пустым. Теперь я попытаюсь заменить все на Strings и вернуться к вам. Еще раз спасибо за то, что нашли время для такого обширного ответа :) – InternInNeed

+0

Собственно, ваш код должен показывать предыдущий выбор? Потому что это все еще не работает. Идея заключается в том, что «пользователь выбирает из combobox, вводит некоторые значения в некоторые текстовые поля, которые затем становятся значениями по умолчанию в указанных текстовых блоках при следующем выборе пользователем того же выбора combobox». - Пользователь HelloWorld так хорошо объяснил это в первых комментариях – InternInNeed

+0

Мне удалось заставить его работать с функцией IF для каждого значения выбора, поэтому неважно :) Я также удалил весь подход выбора и заменил его ссылкой на ячейку диапазоны. – InternInNeed

0

Привет одна вещь наверняка - вам нужно избавиться от всех этих .Select «ы

Они делают его невероятно трудно читать. Я сам только начал изучать VBA (около 3 недель назад). Пожалуйста, просмотрите следующую ссылку: How to avoid using Select in Excel VBA macros. Это должно помочь вам с вашей читабельностью VBA. Это также сделает ваш код примерно в разы быстрее.

Это также поможет вам использовать любую другую команду ActiveCell.

Другой наконечник вместо Вас имеющий

Dim *StringVariable* as string 

как строки кода, который вы начинаете с в начале - , если вы хотите назвать сотовый то, просто дать свой выбор, а затем сделать его = "Строка", например

Range("A1") = "This is a String" 

Я не достаточно опытен, с помощью VBA, чтобы знать, что случилось с вашей TextBox, но я надеюсь, что это хорошее начало, чтобы помочь вашей общей письменной форме VBA.

+0

Большое спасибо @lewisthegruffalo, я посмотрю на учебник и попытаюсь переработать мой код! – InternInNeed