2015-03-25 2 views
0

Я пытаюсь вытащить и обновить некоторые записи через UserForm, и я почти получил его, за исключением фрагмента кода, который не работает должным образом. Он должен переопределить предыдущую запись (любая информация найдена в той же строке, что и запись, найденная IDNum.Excel VBA UserForm - обновить/переопределить данные

По какой-то причине он начинает копировать данные по столбцу B, когда он должен переопределять все, начиная с Column A .

Вот код.

Private Sub RecordUpdate_Click() 
    Dim LastRow As Long 
    Dim IDNum As String 
    Dim rngIDNum As Range 
    Dim WriteRow As Long 
    Dim ws As Worksheet 

    Set ws = Worksheets("Records") 

    With ActiveSheet 
     LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 
     Set rngIDNum = .Range("E1:E" & LastRow) 
     IDNum = txtID.Value 
     WriteRow = Application.Match(IDNum, rngIDNum, 0) 
     Cells(WriteRow, 1).Select 
     With ActiveCell 
      .Offset(0, 1).Value = txtName.Value 
      .Offset(0, 2).Value = txtlName.Value 
      .Offset(0, 3).Value = txtGender.Value 
      .Offset(0, 4).Value = txtAge.Value 
      .Offset(0, 5).Value = txtID.Value 
     End With 
    End With 
End Sub 

Он оставляет нетронутыми все, что в Column A и копирует изменяемые данные от B до F вместо а Е. Все входы высоко ценятся.

ответ

2

Она должна начинаться с:

.Offset(0, 0).Value = txtName.Value 

Установка ColumnIndex к сделает его цель 1 столбец вправо.
Кроме того, вместо того, чтобы использовать Select вы можете работать непосредственно на объекте, как это:

With .Cells(WriteRow, 1) 
    .Offset(0, 0).Value = txtName.Value 
    . 
    . 
    .Offset(0, 4).Value = txtID.Value 
End With 

Или вы также можете попробовать эту версию кода с помощью Range.Find Method.

Private Sub RecordUpdate_Click() 
    Dim LastRow As Long 
    Dim IDNum As String 
    Dim rngIDNum As Range 
    Dim ws As Worksheet 

    Set ws = Worksheets("Records") 
    ' Find the ID 
    With ws 
     LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 
     IDNum = txtID.Value 
     Set rngIDNum = .Range("E1:E" & LastRow).Find(IDNum, .Range("E" & LastRow)) 
    End With 
    ' Inform and Exit if ID doesn't exist 
    If rngIDNum Is Nothing Then MsgBox "ID not found": Exit Sub 
    ' Update the values 
    With rngIDNum 
     .Offset(0, -4).Value = txtName.Value 
     .Offset(0, -3).Value = txtlName.Value 
     .Offset(0, -2).Value = txtGender.Value 
     .Offset(0, -1).Value = txtAge.Value 
     .Offset(0, 0).Value = txtID.Value 
    End With 
End Sub 

Я предполагал, что вы работаете на Worksheet("Records"), которые вы назначили в ws переменной.

+0

Спасибо за быстрый ответ и помощь. Я попробовал оба варианта и работал только первый вариант. Второй вариант с измененной версией скрипта вызвал ошибку. Ошибка времени выполнения 1004: Определенная пользователем или Object-defined ошибка. Я собираюсь с первым вариантом. Еще раз спасибо. – BlueSun3k1

+0

@ user1582396 Какая строка возвращает ошибку? – L42

+0

Указывает на .Offset (0, -4) .Value = txtName.Value. Сейчас у меня проблемы с обоими сценариями. по первому варианту WriteRow = Application.Match (IDNum, rngIDNum, 0) вызывает сбой сценария «WriteRow» Возвращает 0, когда я наводил на него надстройку во время отладки. – BlueSun3k1

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

  • Нет связанных вопросов^_^