VBA для поиска столбца по имени и ссылочным значениям необходимо обновить, если он больше определенного диапазона - PullRequest
0 голосов
/ 09 января 2020

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

Sub replaceBlank()
    Dim rng As Range
    Selection.Value = Selection.Value
    For Each rng In Selection
        If rng = "" Or rng = " " Then
            rng.Value = "0"
        Else
        End If
     Next rng
End Sub

С этим примером кода я могу только выбрать столбцы и выполнить их. Вместо этого, есть ли возможность изменить список имен столбцов, тогда мы можем выполнить?

enter image description here

1 Ответ

1 голос
/ 09 января 2020

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

Я использую Excel 2016 ... Сначала выберите весь набор данных. Go в меню [Вставить] и выберите [Таблица]. Щелкните в любом месте внутри новой таблицы, и в конце ленты появится меню [Инструменты для таблицы -> Дизайн]. Go там и обратите внимание на поле [Table Name], поскольку оно потребуется вам в приведенном ниже коде, чтобы правильно установить переменную objList.

Имена столбцов жестко закодированы в массив, но вы можете загрузить Listbox с именами столбцов скрытым листом и по-настоящему полюбить его, если хотите:

    Sub replaceBlank()

    Dim rngRow As Range, rngColDataSet As Range
    Dim ws As Worksheet
    Dim objListCols As ListColumns
    Dim objList As ListObject

    Dim cntCols As Long, y As Long, MaxCols As Long
    Dim arColNames(1) As String

    'add column names as needed
    arColNames(0) = "Revenue"
    arColNames(1) = "Margin"

    Set ws = ActiveSheet 'because ActiveSheet won't list properties/methods and that just bugs me
    Set objList = ws.ListObjects("Table1")
    Set objListCols = objList.ListColumns

    MaxCols = objListCols.Count

    '--> loop each column in the table
    For cntCols = 1 To MaxCols
        '--> test if column is in the names you want processed
        For y = LBound(arColNames) To UBound(arColNames)
            If arColNames(y) = objListCols(cntCols).Name Then
                Set rngColDataSet = objListCols(cntCols).DataBodyRange.Areas(1)
    '-----------> OPTION 1: QUICK AND EFFICIENT!
                 rngColDataSet.Replace "", "0", xlWhole
                 rngColDataSet.Replace " ", "0", xlWhole
    '-----------> OPTION 2: IF YOU WANT TO ACCESS INDIVIDUAL CELL PROPERTIES OR METHODS <-------------------
    '            For Each rngRow In rngColDataSet
    '                If rngRow.Value = "" Or rngRow.Value = " " Then
    '                    rngRow.Value = "0"
    '                End If
    '            Next
               Exit For
            End If
        Next
    Next
End Sub

Благодаря @Zack E и @JvdV для вдохновения;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...