2015-11-20 2 views
0

У меня возникла проблема с тем, чтобы мои циклы правильно пропускали записи. У меня есть несколько записей, которые необходимо обновить у мастера из многих работоргов. Каждое подчиненное устройство имеет другое имя (его пользователя), и мне нужно сделать мой цикл «Обновление» более эффективным, только сравнивая те записи, которые содержат имя пользователя, а затем сравнивает уникальные идентификаторы, а не то, что он в настоящее время делает, который сравнивает все уникальные идентификаторы, чтобы найти совпадение.Проблема с данными соответствует

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

В столбце Master и Slave 1 всегда есть уникальный идентификатор записи, а столбец 2 всегда является пользователем, которому назначена запись. Вот мой текущий тест кодирования (станет шаблоном для книг других пользователей):

Option Explicit 
Public Sub Agnes_Update() 

Dim owb As Workbook 
Dim Master, Slave As Worksheet 
Dim fpath As String 
Dim i, j As Integer 

fpath = Application.ActiveWorkbook.Path & "\Agnes.xlsx" 

Set owb = Application.Workbooks.Open(fpath) 
Set Master = ThisWorkbook.Worksheets("Allocated") 
Set Slave = owb.Worksheets("Work") 


For j = 2 To 10 '(the master sheet) 

For i = 2 To 10 '(the slave sheet) 
    'if ID cell is blank exit - ends loop when all updates are completed 
    If Trim(Slave.Cells(j, 1).Value2) = vbNullString Then Exit For 
    'if column 2 of master does not contain the current username being 
    'updated then move to next record 
    If Master.Cells(j, 2).Value = "Agnes" Then 
    'if unique ID in column 1 matches slave from master then begin 
    'updating of required cells 
    If Master.Cells(i, 1).Value2 = Slave.Cells(j, 1).Value2 Then 
     Master.Cells(i, 4).Value = Slave.Cells(j, 4).Value 
     Master.Cells(i, 5).Value = Slave.Cells(j, 5).Value 
     Master.Cells(i, 6).Value = Slave.Cells(j, 6).Value 
     Master.Cells(i, 7).Value = Slave.Cells(j, 7).Value 
     Master.Cells(i, 8).Value = Slave.Cells(j, 8).Value 
     Master.Cells(i, 9).Value = Slave.Cells(j, 9).Value 
     Master.Cells(i, 10).Value = Slave.Cells(j, 10).Value 
     Master.Cells(i, 11).Value = Slave.Cells(j, 11).Value 
     Master.Cells(i, 12).Value = Slave.Cells(j, 12).Value 
     Master.Cells(i, 13).Value = Slave.Cells(j, 13).Value 
     Master.Cells(i, 14).Value = Slave.Cells(j, 14).Value 
     Master.Cells(i, 15).Value = Slave.Cells(j, 15).Value 
     Master.Cells(i, 16).Value = Slave.Cells(j, 16).Value 
     Master.Cells(i, 17).Value = Slave.Cells(j, 17).Value 
     Master.Cells(i, 18).Value = Slave.Cells(j, 18).Value 
     Master.Cells(i, 19).Value = Slave.Cells(j, 19).Value 
     Master.Cells(i, 20).Value = Slave.Cells(j, 20).Value 
     Master.Cells(i, 21).Value = Slave.Cells(j, 21).Value 
     Master.Cells(i, 22).Value = Slave.Cells(j, 22).Value 
     Master.Cells(i, 23).Value = Slave.Cells(j, 23).Value 
    End If 
    End If 
    Next 
Next 

Workbooks("Agnes").Close 

End Sub 

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

Я считаю, что текущая проблема с кодом лежит в строке If Master.Cells(j, 2).Value = "Agnes" Then, так как удаление этой строки позволяет коду пройти через все уникальные идентификаторы, чтобы найти и обновить мастер во всех совпадениях, но я бы предпочел только попробовать сопоставлять уникальные идентификаторы, когда имя пользователя найдено в столбце 2, чтобы попытаться сделать код более быстрым и эффективным.

Помогите мне исправить этот код для меня?

+0

| Это не совершенно ясно, что здесь ошибка. Подпрограмма никогда не вводит внутренний 'If', даже если имя в строке« Agnes »? Нужно ли обрезать ведущие или конечные пробелы из «Master.Cells» (j, 2) .Value'? – stucharo

+0

Привет @stucharo Извинения, моя проблема - лист Allocated никогда не обновляет запись «Agnes» от подчиненного устройства, даже если он находится в ячейке, и я не могу заставить его это сделать. – Wowdude

ответ

1

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

Public Sub Agnes_Update() 
Dim owb As Workbook 
Dim wbname As String 
Dim Master, Slave As Worksheet 
Dim fpath As String 
Dim i, j As Integer 

    fpath = Application.ActiveWorkbook.Path & "\Agnes.xlsx" 

    Set owb = Application.Workbooks.Open(fpath) 
    wbname = Left$(owb.Name, InStrRev(owb.Name, ".") - 1) 
    Set Master = ThisWorkbook.Worksheets("Allocated") 
    Set Slave = owb.Worksheets("Work") 

    For j = 2 To 10 '(the master sheet) 

     'if column 2 of master does not contain the current username being 
     'updated then move to next record 
     If Master.Cells(j, 2).Value = wbname Then 

     For i = 2 To 10 '(the slave sheet) 

      'if ID cell is blank exit - ends loop when all updates are completed 
      If Trim(Slave.Cells(j, 1).Value2) = vbNullString Then Exit For 

       'if unique ID in column 1 matches slave from master then begin 
       'updating of required cells 
       If Master.Cells(i, 1).Value2 = Slave.Cells(j, 1).Value2 Then 

        Slave.Cells(j, 4).Resize(, 20).Copy 
        Master.Cells(i, 4).PasteSpecial Paste:=xlPasteValues 
       End If 
      End If 
     Next 
    Next 

    owb.Close SaveChanges:=False 
End Sub 
+0

Привет @Bob Phillips, спасибо за ваш ответ. У меня был 'If Trim (Slave.Cells (j, 1) .Value2) = vbNullString Then Exit For' above' If Master.Cells (j, 2) .Value = wbname Then', потому что количество строк может меняться на каждом поэтому для 'For' для' i' и 'j' будет установлено значение 1000, а' vbNullString' закончит цикл преждевременно, если закончится строка. Будет ли это иметь значение? или есть лучший способ? Остальное, однако, выглядит потрясающе, и я скоро проверю код. Еще раз спасибо! – Wowdude

+0

Здравствуйте, @Wowdude - вы правы, этот оператор ссылается только на переменную j, а не на i, поэтому нет смысла оставлять ее внутри внутреннего цикла. Это не должно иметь такой большой разницы, поскольку он немедленно выйдет, когда это будет выполнено, но он не будет менять его снова и снова. Хорошее место, я должен был заметить это сам :-) –

+0

Спасибо @Bob Phillips - совершенно верно, похоже, что это было просто позиционирование петель = D – Wowdude

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