2015-05-09 3 views
3

Я пишу код VBA в Excel, чтобы изменить значение определенного столбца:Excel VBA код, чтобы отрицать значения

  • Если клетку C (я) является «Дебет» многосвязность количества в клетке B (i) на -1
  • в противном случае ничего не делать!

Ниже мой код, но, к сожалению, она не работает :(

Private Sub Calc() 
    For Each transType In Worksheets("Sheet2").Range("C4", "C100") 
    myRow = transType.Row 
    oldAmount = Worksheets("Sheet2").Range("B" & myRow) 
    If transType.Value = "D" Then 
    newAmount.Value = oldAmount.Value * -1 
    Else: 
    newAmount = oldAmount 
    End If 
    Cells(myRow, "B").Value = newAmount 
    Next transType 
    End Sub 
+1

вещи, которые нужно высматривать: 1. определить типы переменных. Я довольно уверен, что ваш VBE не знал, что вы считаете «transType» «диапазоном»; 2. Не ссылайтесь на свойства неопределенных переменных. Если переменная определена, '.', написанная после имени переменной, позволит вам выбрать из списка, если она не отображается, вы ошибаетесь. 3. Удалите ненужные шаги, указав новое значение равным старому значению. Продолжайте, хотя, вы будете писать удивительные подводные лодки в кратчайшие сроки. – user3819867

+1

Согласно вашему описанию, вы хотите сравнить столбец C с * Debit *, но ваш код сравнивает его с * D *. Если вы используете 'If Left (transType.Value, 1) =" D "Then'? – Jeeped

+0

@ Jeeped Извините за смешение в моих камерах, у меня было «D». Когда я писал здесь, я написал «Debit», чтобы сделать его более понятным. Ура! –

ответ

1
Private Sub Calc() 
Dim transType As Range, oldAmount as range 'important 
For Each transType In Worksheets("Sheet2").Range("C4", "C100") 
myRow = transType.Row 
If transType.Value Like "D*" Then 'if it's "D" something, e.g. "D" or "Deb" or "Debit" 
    Worksheets("Sheet2").Range("B" & myRow).Value = Worksheets("Sheet2").Range("B" & myRow).Value * -1 
End If 
'Cells(myRow, "B").Value = newAmount 'this won't work, it asks for index, the index for column B is 2 
Next transType 
End Sub 
+0

«Ячейки (myRow,« B »). Value = newAmount' это будет работать точно так же, как« Ячейки (myRow, 2) .Value = newAmount' – BrakNicku

+0

Я живу ложью. Mi scuzi. – user3819867

0

Там, кажется, немного месива методов и некоторые шаги, вероятно, могут быть удалены .

Private Sub Calc() 
    Dim transType As Range 
    With Worksheets("Sheet2") 
     For Each transType In .Range("C4").Resize(97, 1) 
      If Left(transType.Value, 1) = "D" Then _ 
       transType.Offset(0, -1) = transType.Offset(0, -1).Value * -1 
     Next transType 
    End With 
End Sub 

Try работать в пределах определенного пространства. Определение рабочего листа с с/End With пункта и предваряя все .Cell и .Range ссылки с периодом дадут этот рабочий лист родительским элементам. Поскольку вы перебираете For Each, вам нужно только смещать один столбец влево, чтобы получить доступ к столбцу B из столбца C. Как уже упоминалось в моем комментарии, я не знаю, используете ли вы Debit или D в качестве критериев, но это будет работать для обоих; функция Left просто не нужен, если столбец C содержит только D ..

0

Непосредственно с помощью EVALUATE

Worksheets("Sheet2").Range("D4:D100") = Evaluate("=IF(LEFT(Sheet2!C4:C100,1)=""D"",-1*(Sheet2!D4:D100),Sheet2!D4:D100)") 
Смежные вопросы