Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Вставить данные, двигаясь ВВЕРХ

Автор вопроса: rjkОтветов: 2

Может ли кто-нибудь предоставить код, который говорит что-то вроде: НАЧАЛО В НИЗУ, если значение в "C" пустое, посмотрите на "B" (если не пустое значение копии в C и D); если "B" пусто, посмотрите на "A" (если не пусто, скопируйте значение в B и D); если "A" пусто, перейдите к следующему (если не пусто, скопируйте значение в A и D).

Мне нужно, чтобы скрипт начинался внизу страницы и двигался ВВЕРХ. Например, начните со строки 9 и закончите, когда логика пройдет через строку 1.

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

END RESULT
color      12
primary    35
blue       1
shape      685
rounded    1
oval       25
size       21
big        56
giant      10


DATA:
     A       B        C      D
1   size    big     giant   10
2   size    big             56
3   size                    21
4   shape   rounded oval    25
5   shape   rounded          1
6   shape                   685
7   color   primary blue    1
8   color   primary         35
9   color                   12
  • Ваш вопрос будет более ясным, если вы отредактируете свои образцы данных и требуемый результат, чтобы включить хотя бы один случай, когда A пусто. Tim Williams 10.01.2012
  • Как насчет того, чтобы оставить отзыв и/или отметить последние вопросы как решенные, прежде чем начинать новые. Reafidy 10.01.2012

excelvbaexcel-2007

Ответы

Ответ 1 · рейтинг 1 · Siddharth Rout

Тони уже дал вам самый простой способ добиться того, чего вы хотите, но если вам все еще нужен код, который дает вам ТОЧНЫЙ результат, как у вас, попробуйте это. Вывод будет в Col F:G

Option Explicit

Sub Sample()
    Dim LastRow As Long, Rw As Long, i As Long

    LastRow = Range("D" & Rows.Count).End(xlUp).Row
    Rw = 1

    For i = LastRow To 1 Step -1
        If Len(Trim(Range("C" & i).Value)) = 0 Then
            If Len(Trim(Range("B" & i).Value)) = 0 Then
                If Len(Trim(Range("A" & i).Value)) <> 0 Then
                    Range("F" & Rw).Value = Range("A" & i).Value
                    Range("G" & Rw).Value = Range("D" & i).Value
                End If
            Else
                Range("F" & Rw).Value = Range("B" & i).Value
                Range("G" & Rw).Value = Range("D" & i).Value
            End If
        Else
            Range("F" & Rw).Value = Range("C" & i).Value
            Range("G" & Rw).Value = Range("D" & i).Value
        End If

        Rw = Rw + 1
    Next i
End Sub

Ответ 2 · рейтинг 1 · Tony Dallimore

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

Скопируйте следующую формулу в E1 и скопируйте вниз, и вы получите значения, которые вы ищете.

=IF(C1="",IF(B1="",A1,B1),C1)

Это не в обратной последовательности, как вы перечисляете требуемый результат. Вы хотите, чтобы он был отсортирован, или вы просто показываете последовательность вычислений?

Дополнительный раздел в ответ на дополнительную информацию

Перейдите к нижней части столбца F, в настоящее время F9, и введите:

=ROW(F$9)-ROW(F9)

Скопируйте эту формулу вверх по столбцу, чтобы получить числа от 0 до 8. Теперь вы можете сортировать по столбцу F в возрастающей или убывающей последовательности в зависимости от того, какое представление вы хотите.

Я оставлю Siddharth Rout, чтобы дать вам эквивалент VBA. Кстати, Сиддхарт создал два дополнительных столбца, так что результат будет в той последовательности столбцов, которую вы показываете. Я подумал, что это хорошее дополнение. Вы можете сделать то же самое с формулами, если предпочитаете формульный подход.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы