2013-04-03 5 views
6

Я надеялся написать макрос, который выполняет очень повторяющуюся задачу для меня, но вход в VBA сложнее, чем ожидалось. Я узнаю, как программировать макросы для Excel, когда у меня есть время, потому что это кажется чрезвычайно полезным, но я не могу потратить 5-12 часов на этой неделе.Напишите формулу в ячейку в зависимости от значения другой ячейки

Возможно, кто-то здесь может помочь!

У меня есть несколько файлов Excel, которые следуют этому шаблону:

Column C - Column D 
-------------------- 
text  | (empty) 
number | (empty) 
number | (empty) 
text  | (empty) 
number | (empty) 
text  | (empty) 
text  | (empty) 
number | (empty) 
text  | (empty) 
number | (empty) 

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

Column C - Column D 
-------------------- 
text  | (empty) 
3  | (empty) 
14  | (=C3-C2) : 11 
text  | (empty) 
16  | (=C5-C3) : 2 
text  | (empty) 
text  | (empty) 
21  | (=C8-C5) : 5 
22  | (=C9-C8) : 1 

Так алгоритм:

var previousNumberCell 
var i = 1 

for all (selected) cells/rows 
if (Row(i).column(C) holds number) { 
    Row(i).column(D).value = "=C"+i+"-"C"+previousNumberCell 
    previousNumberCell = i; 
} 
i++ 

End 

Я не забочусь если для первой или последней ячейки это не работает.

Большое спасибо за помощь, или если вы можете указать мне, где я могу найти ответ на этот вопрос.

EDIT: это упрощенная версия проблемы, есть две вещи, которые я не знаю, как хорошо работать с макросами excel: выберите ячейку и скажите, является ли ячейка числом ... для записи, номер ячейки были преобразованы из текстового формата в число.

ответ

13

Дайте этот выстрел:

Sub MyMacro() 
Dim rng as Range 
Dim cl as Range 
Dim lastNum as Range 
Set rng = Range(Selection.Address) 'Make sure that your active SELECTION is correct before running the macro' 

If Not rng.Columns.Count = 1 Then 
    MsgBox "Please select only 1 column of data at a time.",vbCritical 
    Exit SUb 
Else: 
    For each cl in rng 
     If IsNumeric(cl.Value) Then 
      If lastNum Is Nothing Then 
       cl.Offset(0,1).Formula = "=" & cl.Address 
      Else: 
       cl.Offset(0,1).Formula = "=" & cl.Address & "-" & lastNum.Address 

      End If 
      set lastNum = cl 
     End If 
    Next 
End If 

End Sub 
+0

@Daren попробуйте сейчас. –

+0

На какой линии? Он работает до конца. –

+0

Вы сделали * все * изменения (добавили несколько амперсандов, а также удалили '.Text' из строк, устанавливающих формулы). –

8

Требуется ли VBA?

вставить новый столбец перед тем столбец C
Колонка C с вашими значениями становится столбец D
Вам может понадобиться columnheaders ..
в ячейке C2 положить: =IF(E2=0;0;SUM(E$2:$E2)) это определяет строки с номером
В ячейке Е2 поместить: =IF(ISNUMBER(D2);1;0) это устанавливает порядок для каждой строки с номером использовать следующий в ВПР
в ячейки F2 положить: =IF(ISNUMBER(D2);ABS(D2-VLOOKUP(MAX($C$1:C1);$C$1:D1;2;0));"")
автозаполнения колонок C, E и F.
в колонке F вы получите результаты, за исключением первого, который является «#VALUE "

+0

это действительно сработало бы, просто макрос - это то, что действительно предназначалось для этого. В любом случае у вас все еще есть +1 – Daren

+0

+1, чтобы избежать VBA и использовать функции Excel, где это возможно! –

+1

+ 1 Для решения без VBA :) –

-1

Привет, вы можете сделать это с помощью формулы if и названной формулы. если (ISNUMBER, названная формула, 0)

названа формула (= поиск формулы)

+1

Это ответ? –