Макрос VBA для изменения содержимого ячейки каждые X строк - PullRequest
0 голосов
/ 25 февраля 2019

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

  1. Мне нужно найти последний экземпляр в наборе данных однозначного числа (1-9), изменить его на звездочку(*) и переходите к началу, повторяя это изменение каждые 7 ячеек.

  2. Затем мне нужно выбрать соседнюю ячейку над звездочкой и изменить это содержимое на звездочку (*) и продолжайте движение вверх через каждые 25 ячеек, повторяя изменение.

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

У меня мало опыта в VBA, и я испытываю большие трудности.Я пытался заглянуть в RegExp для поиска и замены, но не смог понять это.Я пытался использовать MOD для автоматизации подсчета 7 или 25 клеток вверх, но увы не смог.

Любые идеи будут оценены.

1 Ответ

0 голосов
/ 25 февраля 2019

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

Если у вас есть ссылка на ячейку через объект .Range(), используйте следующие функции

В следующем предполагается, что должно быть определено следующее

Dim r as Range
  • x = r.Value получить значение ячейки.
  • x = r.Cels(i,j).Value получить значение i -ой строки и j -ого столбца в таблице, начиная с r.Чтобы получить значение 7 ниже, вы пишете x = r.Cells(7,1).Value
  • Set r = r.Offset(i,j), перемещаете i строки вниз и j поперек.Они могут быть положительными, нулевыми или отрицательными.Например, чтобы переместиться на одну строку вверх, r.Offset(-1,0)
  • Set r = r.Resize(n,m) разверните диапазон в таблицу с n строками и m столбцами, начиная с r в левом верхнем углу.
  • x = r.Resize(n,m).Value возвращает двумерный массив из таблицы значений.Работает в обратном порядке также r.Resize(n,m).Value = x для назначения нескольких значений одним махом.

Теперь, в зависимости от количества строк, с которыми вы имеете дело, я предлагаю вам прочитать все значения в память, циклическиданные, чтобы найти то, что вы ищете, внести изменения и записать обратно.

Предположим, ваши данные начинаются с C3.В окне кода VBA для листа (не модуля) напишите что-то вроде этого

Dim n As Long, i As Long, index As Long
Dim r As Range, target As String, j As Long

'Find how many rows are filled
Set r = Range("C3")
n = Range(r, r.End(xlDown)).Rows.Count
Set r = r.Resize(n, 1)

'Read all the values into memory
Dim vals() As Variant
vals = r.Value

'Loop from the end and find the target digit
target = "7"

' Start from bottom and search contents for the target digit
i = n
Do While i >= 1
    index = InStr(1, vals(i, 1), target, vbTextCompare)
    If index > 0 Then
        ' Found it. 'i' contains the row the target is found.
        Exit Do
    End If
    i = i - 1
Loop

If i = 0 Then
    'None found
    Exit Sub
End If

' Start from i and go back every 7 to change the value into a '*'
For i = i To 1 Step -7
    vals(i, 1) = "*"
    ' Start from the row above (i-1) and go back every 25
    For j = i - 1 To 1 Step -25
        vals(j, 1) = "*"
    Next j
Next i

'Write the changes back to the sheet
r.Value = vals
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...