2014-11-08 2 views
1

Мне нужно выполнить некоторый код VBA при изменении листа. Для этого у меня ситуация If-then-else.использовать имя столбца ListObject в VBA

В любой конкретной строке (у меня есть переменное число строк (т.е. позиции)):

if column "Type" = Range("A") then 
    column "Amount" needs to be unlocked 
    set to the value of Range("B") and locked 
else if column "Type" = Range("C") then 
    column "Amount" needs to be unlocked 
    set to the value of Range("C") and locked 
else 
    the column "Amount" needs to unlocked. 

В случае изменения рабочего листа, разблокировать/замок с помощью ActiveSheet.Protect и .Unprotect с паролем из диапазона ,

Теперь я пытаюсь выяснить, как это сделать. В частности, как использовать имена столбцов - например, в формуле?

+0

Не уверены, именно то, что вы просите, но использовать имя столбца в VBA, как и на листе, вы используете его так же, как и любое другое задание диапазона Name'd: ** range («Table1 [Name]») ** возвращает объект диапазона, относящийся к столбцу «Имя». Но, как предложил Андре, вам, возможно, стоит более внимательно изучить ListObject для более эффективного кодирования. –

ответ

0

=== для Excel 2007+ ===

Если вы используете Excel 2007+, я рекомендую использовать ListObject, ListColumns и ListRows (изучение объектной модели).

Философия моего подхода:

  1. формы, данные и отчеты всегда должны быть разделены, так что ...

  2. Соберите все ваши данные в таблицу, в специальном листе. Выберите свои данные и Ctrl + (T или L). Убедитесь, что на каждом листе есть только 1 таблица данных.

  3. Используя таблицы, вы сможете использовать объекты ListObject, ListColumns и ListRows.

Готовый код для всего.

Public Sub test() 
    IntersectColumnRows ActiveSheet, "", "Type", "Amount", Range("A1"), Range("B1"), Range("C1") 
End Sub 

Public Sub IntersectColumnRows(currentSheet As Worksheet, sheetPassword As String, columnTitle_Type As String, columnTitle_Amount As String, rangeA As Range, rangeB As Range, rangeC As Range) 

    'variable declaration 
    Dim listO As ListObject 
    Set listO = currentSheet.ListObjects(1) 

    'Takes care of sheet protection 
    Dim isSheetProtected As Boolean 
    isSheetProtected = currentSheet.ProtectionMode 
    If isSheetProtected Then _ 
     currentSheet.Unprotect (sheetPassword) 

    'store your type column 
    Dim columnRangeType As Range 
    Set columnRangeType = listO.ListColumns(columnTitle_Type).Range 
    'store your 2nd column 
    Dim columnRangeAmount As Range 
    Set columnRangeAmount = listO.ListColumns(columnTitle_Amount).Range 

    'the actual routine you are asking for 
    Dim listR As ListRow 
    For Each listR In listO.ListRows 
     'intersect the TYPE column with the current row 
     Dim typeRangeIntersection As Range 
     Set typeRangeIntersection = Application.Intersect(listR.Range, columnRangeType) 
     'intersect the AMOUNT column with the current row 
     Dim amountRangeIntersection As Range 
     Set amountRangeIntersection = Application.Intersect(listR.Range, columnRangeAmount) 

     'the logic you required 
     If typeRangeIntersection.Value = rangeA.Value Then 
      amountRangeIntersection.Locked = False 
      amountRangeIntersection.Value = rangeB.Value 
      amountRangeIntersection.Locked = True 
     ElseIf typeRangeIntersection.Value = rangeC.Value Then 
      amountRangeIntersection.Locked = False 
      amountRangeIntersection.Value = rangeC.Value 
      amountRangeIntersection.Locked = True 
     Else 
      amountRangeIntersection.Locked = False 
     End If 
    Next 

    'Cleans up sheet protection 
    If isSheetProtected Then _ 
     currentSheet.Protect (sheetPassword) 
End Sub 

Вот "как я-сделал-это":

  1. Хранить ListColumn.Range для всех требуемых столбцов (тип, количество)

  2. для цикла с каждым ListRow ...

  3. I пересекает ListRow.Range с ListColumn.Range

  4. Применить нужную логику

Помимо кода, изучить, как ...

  1. Я включил PROTECT/ПАРОЛЬ логику там, так что вы можете удалить его, если вы хотите.

  2. Каждые переменные имеет очень явное имя

  3. Я не включал жесткое закодированное значение, так что остается параметрической, если вам нужно адаптировать некоторые вещи для разных листов

+0

Привет, Андре, изучите это и дайте знать. И, да, забыл упомянуть об этом для Excel 2010. –