2015-01-05 1 views
0

Один из многих сообщений на эту тему, скорее всего, отвечает на мой вопрос, но я слишком новичок в этом, чтобы признать Это. Следующий код вводит ввод из пользовательской формы и публикует следующую строку в таблице. Он работает каждый раз, когда используется кнопка btsubmit. Строкой кода, вызывающей ошибку времени выполнения, является список проводников. Range (1, 13) .Value = "123".Ошибка времени выполнения '1004': код ошибки, определенный приложением или объект, работает каждый раз, когда я запускаю

Private Sub btnsubmit_Click() 
    Dim ssheet As Worksheet 
    Dim wirelist As ListObject 
    Dim wirelistrow As ListRow 

    Set ssheet = Sheets("Database") 
    Set wirelist = ssheet.ListObjects(1) 
    Set wirelistrow = wirelist.ListRows.Add 

    ssheet.Unprotect Password:="wire$" 

    wirelistrow.Range(1, 13).Value = "123" 
    findrowintable = ssheet.Range("M65536").End(xlUp).Row 
    wirelistrow.Range(1, 12).Value = findrowintable 

    Nextrowdata = findrowintable 
    ssheet.Range("A" & Nextrowdata) = Me.tbdate 

end sub 

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

+1

Я хотел бы попросить вас создать резервную копию и, возможно, просто пересмотреть вопрос, чтобы объяснить, где вы хотите сохранить значения. т.е. TextBox1 в столбец C и т. д. Предполагая, что все идут в одну строку. Или объясните, что вы пытаетесь выполнить. Иногда может быть лучший способ, если было ясно, что вы собираетесь делать в общей картине, а не просто решить эту проблему с нынешним подходом. Если это имеет смысл .... – peege

+0

Сколько полей находится в UserForm? Каковы их имена и какой столбец будет содержать ценность каждого из них? Как бы то ни было, вы пытаетесь поместить некоторые данные в «Таблицы» («База данных»). Ячейки ([newRow], 13) »и, возможно, дата в столбце A? – peege

ответ

0

Посмотрите на этот код и посмотрите, можете ли вы его адаптировать к своей ситуации.

Что происходит:

  • Пользовательская форма активизирован и SheetName установлен, и вспомогательный ClearData вызывается.

  • Когда вы нажимаете кнопку «Обновить», вызывается субпозиция PutData.

  • PutData просто помещает данные из элементов управления UserForm (текстовые поля, поля списка, поля со списком, флажки и т. Д.) В лист, основанный на адресе.

  • ClearData сбрасывает UserForm, чтобы очистить свежую дату в поле TextBox.

  • Если вы хотите построить навигатор для перемещения по всем записям, это еще одна история, но если вы это сделали, то элемент GetData сделает полную противоположность PutData. Я приведу пример GetData, но не буду добавлять элементы управления навигации для краткости.

Результатом является то, что вы будете передавать значения из пользовательской формы в новой строке рабочего листа при нажатии «Обновить», а затем сбросить с новой датой.

Screenshot

Переводников: включенных в примере

- UserForm_Activate 
- cmdUpdate_click 
- cmdClear_Click 
- PutData 
- ClearData 
- GetData (Bonus) 

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

Dim lastRow As Long, lRow As Long 
Dim sheetName As String 

Private Sub UserForm_Activate()  
    sheetName = "Database" 
    Call ClearData   
End Sub 

Private Sub cmdUpdate_Click() 
    Call PutData   
End Sub 

Private Sub cmdClear_Click() 
    Call ClearData  
End Sub 

Private Sub PutData()  
    'Save the Text from the Control into the sheet, using .Cells(row,col) 
    Sheets(sheetName).Cells(lRow, 1) = txtDate.Text 
    Sheets(sheetName).Cells(lRow, 13) = txtValue.Text 

    ActiveWorkbook.Save 
    Call ClearData  
End Sub 

Private Sub ClearData() 
    txtDate.Text = Now  'Reset the UserForm to blank with the date as NOW. 
    txtValue.Text = "" 

    'Re-Acquire the last Row and set the new row variable. 
    lastRow = Sheets(sheetName).Range("A" & Rows.count).End(xlUp).row 
    lRow = lastRow + 1  
End Sub 

Примечание: событие нажмите для командных кнопок просто вызовите подпрограмму, которая делает фактическую работу. Причина этого очевидна с помощью sub ClearData. Он вызывается как при активации формы, так и после обновления, а также нажатии кнопки cmdClear. Поэтому вместо того, чтобы писать три раза и обновлять его или исправлять, когда он изменяется, все это в одном месте, и вы вызываете его из нескольких источников.

Бонус: Этот дополнительный элемент является дополнительным, который вы можете использовать, если вы решите перемещаться по всем своим записям. Для этого у вас будет кнопка для Prev, Next, First, Last, New и т. Д., А затем каждый снимет или повысит значение lRow соответствующим образом и вызовет GetData.

Here is a link to an answer I provided that does exactly that, имена переменных немного отличаются от этого, но функциональность понятна.

Я включаю его, потому что он показывает Как заполнить UserForm данными из листа.

Private Sub GetData() 
    'If you get a navigating control for your row source, you can use a GetData sub 
    'To bring data from your sheet to the User Form. 
    'Changing lRow changes the Sheets Row Source. Call GetData to refresh the Form. 

    txtDate.Text = Sheets(sheetName).Cells(lRow, 1) 
    txtValue.Text = Sheets(sheetName).Cells(lRow, 13)  
End Sub 

также: Поскольку я не вижу ничего в коде защиты рабочих листов, я не в том числе не-защищая их, чтобы избежать путаницы в будущем читателей. Это просто дает рабочий пример того, как перемещать данные в UserForms и Worksheets и из них.

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