2013-04-03 14 views
6

Miałem nadzieję napisać makro, które wykonuje bardzo powtarzalne zadanie, ale wprowadzenie VBA jest trudniejsze niż oczekiwano. Nauczę się programować makra w Excelu, kiedy mam trochę czasu, ponieważ wydaje się to bardzo przydatne, ale nie mogę spędzić od 5 do 12 godzin w tym tygodniu.Zapisywanie formuły w komórce w zależności od wartości innej komórki

Może ktoś tu może pomóc!

Mam kilka plików excel, które następują ten wzór:

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

Jeżeli tekst i numer alternatywny losowo do kilku tysięcy komórek. Muszę kolumna D trzymać, gdy kolumna C jest liczbą, różnica z poprzedniego numeru, w przeciwnym razie musi pozostać puste:

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 

Więc algorytm jest:

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 

Nie dbam jeśli dla pierwszej lub ostatniej komórki nie działa.

Dziękuję bardzo za pomoc lub jeśli możesz wskazać mi, gdzie mogę znaleźć odpowiedź na to pytanie.

EDYCJA: jest to uproszczona wersja problemu, są 2 rzeczy, których nie wiem, jak dobrze z makrami programu Excel: wybierz komórkę i powiedz, czy komórka jest liczbą ... dla rekordu, liczba komórki zostały przekonwertowane z tekstu na format liczbowy.

Odpowiedz

13

Daj to strzał:

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 spróbuj teraz. –

+0

W jakiej linii? Pracuje do ukończenia po moim zakończeniu. –

+0

Czy wprowadziłeś * wszystkie * zmiany (dodano kilka znaków ampersands, a także usunięto '.Text' z linii ustawiających formuły). –

8

Potrzebny VBA?

Włóż nową kolumnę przed kolumna C
Kolumna C ze swoimi wartościami staje kolumna D
Być może trzeba columnheaders ..
w Put komórce C2: =IF(E2=0;0;SUM(E$2:$E2)) identyfikuje wiersze z numerem
W komórce E2 umieścić: =IF(ISNUMBER(D2);1;0) to ustawia kolejność dla każdego wiersza z numerem używać obok w WYSZUKAJ.PIONOWO
w F2 komórka put: =IF(ISNUMBER(D2);ABS(D2-VLOOKUP(MAX($C$1:C1);$C$1:D1;2;0));"")
kolumny autouzupełniania C, E i F.
w kolumnie F dostaniesz wyniki, z wyjątkiem pierwszego, który jest „#VALUE "

+0

rzeczywiście by działało, tylko makro jest tym, do czego naprawdę przeznaczone. Jakikolwiek sposób nadal otrzymujesz +1 – Daren

+0

+1 dobry, aby uniknąć VBA i używać funkcji Excela tam, gdzie to możliwe! –

+1

+ 1 Dla rozwiązania Non VBA :) –

-1

Cześć, możesz to zrobić za pomocą formuły if i nazwanej formuły. if (liczba, nazwa wzoru, 0)

o nazwie formuła (= formuła odnośnika)

+1

Czy to odpowiedź? –

Powiązane problemy