Могу ли я выбрать диапазон на основе указанной строки c? - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть некоторый рабочий код, который находит столбец «R», выполняет итерацию и заменяет значения в разных столбцах (также жестко запрограммированных) на основе значения в «R». Я хотел бы сделать скрипт менее зависимым от размещения столбцов.

Я нашел и попробовал несколько вариантов, но не смог найти правильного решения. Я чувствую, что мне нужно использовать set, но я не уверен, как заменить Select Case ("R" и i). Значение и другие области, где Range ссылается на i. В идеале я могу заменить 'T', 'R', 'F' и 'N'.

Любой pu sh в правильном направлении приветствуется.

Sub BackfillUpdate()
    Dim LastRow As Long
    Dim i As Long
    LastRow = Range("T" & Rows.Count).End(xlUp).Row
    For i = 2 To LastRow
    Select Case Range("R" & i).Value
    Case "Text1"
            Range("F" & i).Value = "Example1"
    Case "Text2"
            Range("N" & i).Value = "Example2"
    Case "Text3", "Text4"
            Range("N" & i).Value = "Example3"
    End Select
    Next i
End Sub

РЕДАКТИРОВАТЬ : Приложение является одной из многих подпрограмм, но эта часть ищет в столбце значение, находит его, а затем заменяет другой столбец в значении той же строки на указанную c строку, основанную на том, что оно находит. Имя заголовка не изменится, строка не изменится, но размещение столбца может основываться на наборе данных.

Ответы [ 3 ]

1 голос
/ 28 апреля 2020

Вот один подход ....

Option Explicit

Sub BackfillUpdate()
    Dim ws As Worksheet
    Dim i As Long, T As Long, R As Long, F As Long, N As Long '<< use some better names...
    Set ws = Sheets("data")

    T = ColPos(ws.Rows(1), "HeaderT") '<< use your actual column header
    R = ColPos(ws.Rows(1), "HeaderR")
    F = ColPos(ws.Rows(1), "HeaderF")
    N = ColPos(ws.Rows(1), "HeaderN")
    'maybe add a check here to ensure all columns were located

    For i = 2 To ws.Cells(Rows.Count, T).End(xlUp).Row
        Select Case ws.Cells(i, R).Value
            Case "Text1"
                ws.Cells(i, F).Value = "Example1"
            Case "Text2"
                ws.Cells(i, N).Value = "Example2"
            Case "Text3", "Text4"
                ws.Cells(i, N).Value = "Example3"
        End Select
    Next i

End Sub

'find a header in rng and return its column number
Function ColPos(rng As Range, hdr As String) As Long
    Dim m
    m = Application.Match(hdr, rng, 0)
    ColPos = IIf(IsError(m), 0, CLng(m))
End Function
0 голосов
/ 28 апреля 2020

Не уверен насчет приложения, но для вас может быть лучше поместить ваши данные в таблицу.

Sub test()

Dim ws As Worksheet
Dim tbl As Object
Set ws = activeworkbook.activeworksheet
Set tbl = ws.ListObjects("tablename")

Dim rowcount As Integer
rowcount = tbl.ListRows.Count

For i = 1 To rowcount

Dim ColumnName As String ' or integer for index

ColumnName = "header-row-name or Index#"

Select Case tbl.ListRows(i, ColumnName).Value

Case "Text1"
        tbl.ListRows(i, ColumnName).Value = "Example1"
Case "Text2"
        tbl.ListRows(i, ColumnName).Value = "Example2"
Case "Text3", "Text4"
        tbl.ListRows(i, ColumnName).Value = "Example3"
End Select

Next i

End Sub

Если вы хотите, чтобы имя столбца или индекс были динамическими c, просто измените имя или создайте для него переменную и замените ColumnName.

0 голосов
/ 28 апреля 2020

Предполагая, что вашей строкой 'header' является строка 1, вы можете сделать эквивалент столбца для вашей переменной LastRow и l oop через диапазон, увеличивающий столбец.

Что-то вроде:

Sub BackfillUpdate()
    Dim LastColumn As Long
    Dim i As Long
    LastColumn = Cells(1, Columns.Count).End(xlToLeft).Column

    For i = 2 To LastColumn 
        Select Case Cells(1, i).Value 'Starting from "B1" and moving along columns until it finds your value.
        Case "Text1"
            Range("F" & i).Value = "Example1"
        Case "Text2"
            Range("N" & i).Value = "Example2"
        Case "Text3", "Text4"
            Range("N" & i).Value = "Example3"
        End Select
    Next i
End Sub

ЕСЛИ ваши Case диапазоны, которым вы присваиваете значения, должны быть более динамичными c также, рассмотрите цикл, как описано выше, и настройку переменных для каждого целевого столбца с Column числом (т. Е. - i) затем еще один l oop, используя переменные, чтобы найти цели и сделать свое дело.

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