2017-01-17 4 views
2

Следуя предыдущему вопросу, у меня есть код, который обновляет определенные ячейки в динамической таблице на основе содержимого строки заголовка и первого столбца. Постоянными значениями являются фиксированные значения в коде, но теперь мне нужно иметь возможность ссылаться на это на таблицу сопоставления на то, что несколько ячеек могут быть обновлены за один раз.Использовать таблицу в качестве постоянных значений в VBA с listobjects

Существующий код и пример таблицы, с которой мне нужно работать, приведены ниже.

sub ChangeTable() 

Dim wsMapping As Worksheet 
Dim wsData As Worksheet 
Dim tbl As ListObject 
Dim x As Long 
Dim i As Long 
Dim hdrCount As Long 

Const ACCT_NO = "ABCD1234" 
Const HEADING = "Analysis/*" 
Const NEW_VAL = "80321" 


Set wsData = Worksheets("Test Sheet") 
Set wsMapping = Worksheets("Mapping") 


Set tbl = wsData.ListObjects("Data") 
hdrCount = tbl.HeaderRowRange.Columns.Count 

For x = 1 To tbl.ListRows.Count 
    With tbl.ListRows(x) 
     If .Range(1, 1).Value2 = ACCT_NO Then 
      For i = 2 To hdrCount 
       If (tbl.HeaderRowRange(i).Value2 Like HEADING) Then 
        If (Not IsEmpty(.Range(1, i).Value)) Then 
        .Range(1, i).Value = NEW_VAL 
        End If 
       End If 
      Next 
     End If 
    End With 
Next 

End Sub 

На отдельном листе в Excel будет таблица со столбцом для номера счета и нового значения. Для изменения может быть до 10 различных номеров учетных записей, которые могут быть переменными каждый раз, когда файл создается, поэтому код должен иметь возможность обрабатывать переменное число констант каждый раз, когда он используется.

ABCD1234 80310 
ABCD1235 80311 
ABCD1236 80312 
ABCD1237 80313 
ABCD1238 80314 
ABCD1239 80315 
ABCD1240 80316 

Я думаю, что мне нужно, чтобы определить диапазон таблицы и сказать что-то вроде:

Если не IsEmpty (Cells (х, 1)) Тогда (Const ACCT_NO = Cells (х, 1) И Const NEW_VAL = ячейки (x, 2))

и прокручивать каждую строку в таблице. Будет ли это работать?

+0

Вы бьете меня к этому Скотт, я просто прибирать стол, а также – AlanB

ответ

0

Кроме того, что вы не можете изменить значение, хранящееся в константе (они по определению постоянны, то есть неизменяемы), это звучит так, будто вы на правильном пути.

Объявите свои текущие константы как обычные строковые переменные (например, Dim ACCT_NO As String), а затем вы можете использовать If not IsEmpty(Cells(x, 1)) Then ACCT_NO = Cells(x, 1): NEW_VAL = Cells(x, 2) в цикле.

Возможно, ваш код будет в конечном итоге выглядит так:

Sub ChangeTable() 

    Dim wsMapping As Worksheet 
    Dim wsData As Worksheet 
    Dim tbl As ListObject 
    Dim x As Long 
    Dim i As Long 
    Dim rowAcctNo As Long 
    Dim lastrowAcctNo As Long 
    Dim wsAcctNo As Worksheet 
    Dim hdrCount As Long 

    Dim ACCT_NO As String 
    CONST HEADING = "Analysis/*" 
    Dim NEW_VAL As String 

    Set wsData = Worksheets("Test Sheet") 
    Set wsMapping = Worksheets("Mapping") 
    Set wsAcctNo = Worksheets("AcctNos") 'or whatever the sheet is called 
    'Determine how many account number rows to process 
    With wsAcctNo 
     lastrowAcctNo = .Cells(.Rows.Count, "A").End(xlUp).Row 
    End With 

    Set tbl = wsData.ListObjects("Data") 
    hdrCount = tbl.HeaderRowRange.Columns.Count 

    For rowAcctNo = 1 to lastRowAcctNo 
     If Not IsEmpty(wsAcctNo.Cells(rowAcctNo, 1)) Then 
      ACCT_NO = wsAcctNo.Cells(rowAcctNo, 1).Value 
      NEW_VAL = wsAcctNo.Cells(rowAcctNo, 2).Value 
      For x = 1 To tbl.ListRows.Count 
       With tbl.ListRows(x) 
        If .Range(1, 1).Value2 = ACCT_NO Then 
         For i = 2 To hdrCount 
          If (tbl.HeaderRowRange(i).Value2 Like HEADING) Then 
           If (Not IsEmpty(.Range(1, i).Value)) Then 
            .Range(1, i).Value = NEW_VAL 
           End If 
          End If 
         Next 
        End If 
       End With 
      Next 
     End If 
    Next 
End Sub 
+0

это работало удовольствие, спасибо за вашу помощь – AlanB

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