2015-03-02 3 views
0

Я пытаюсь добавить следующую логику в макрос в Excel из SQL прока и у меня возникают проблемы преобразования его:Если тогда еще или если thenifif vba?

CASE WHEN Dept < '600' THEN '0' + convert(varchar,RTRIM(Dept)) 
when Dept between '650' and '899' THEN convert(varchar,RTRIM(Dept)) + '0' 
ELSE convert(varchar,RTRIM(Dept)) + '0' END As Dept_Num 

На дисплее я хочу это:

  • Если число Dept в таблице 1 [DEPT1] находится между 0 и 599, затем добавьте ведущий ноль, aka 001 станет 0001.
  • Если номер Департамента в таблице 1 [DEPT1] находится между 650 и 899, затем добавьте следующее ноль, aka 650 становится 6500.
  • Если число Dept в Table1 [dept1] любое другое число, добавить следующий ноль, иначе 600 становится 6000.

    Dim deptnum As Integer, result As String 
    deptnum = Range("Table1[Dept1]").Value 
    If deptnum < 600 Then deptnum = Left(Range("Table1[Dept1]") & "0000", 4) 
    Ifelse deptnum = Right(Range("Table1[Dept1]") & "0000", 4) 
    

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

+0

Что это значит для VBA? Пройдет ли оно через каждое значение в таблице и где-нибудь выведет соответствующие значения? Является результатом результат или вам что-то нужно? – cronos2546

+0

Да, я хочу, чтобы он прошел каждое значение в столбце «Dept1» и добавил либо префикс, либо суффикс ноль. – CoffeeCoder

ответ

0
Dim varcell as Variant 

For Each varcell in ThisWorkbook.Sheets("DeptData").ListObjects(1).ListColumns(8).DataBodyRange 
    If varcell.value < 600 Then 
     varcell.value = "0" & cstr(varcell.value) 
    Else 
     varcell.value = cstr(varcell.value) & "0" 
    End If 
Next 

Пожалуйста, обратите внимание, что необходимо обновить точки, где "есть.

+0

Dim varcell как вариант Для каждого varcell в этой книге. _ Листы (DeptData). _ ListObjects (1). _ ListColumns (8) .DataBodyRange Я получаю ошибку времени выполнения «9», индексом вне диапазона. Не знаете, что я делаю неправильно? – CoffeeCoder

-1

Похоже, что вам просто не хватает нескольких ключевых слов. Кроме того, форматирование это ниже образом сделает это более очевидным:

Dim deptnum As Integer, result As String 
deptnum = Range("Table1[Dept1]").Value 
If deptnum < 600 Then 
    deptnum = Left(Range("Table1[Dept1]") & "0000", 4) 
Else 
    deptnum = Right(Range("Table1[Dept1]") & "0000", 4) 
End If 
0
Sub Testdeptnum() 

Dim deptnum As Integer 
Dim result As String 
Dim deptrng As Range 
Dim SourceSheet As Worksheet 
Set SourceSheet = ThisWorkbook.Sheets("Data") 
Set deptrng = SourceSheet.Range("DEPT1") 
For Each c In deptrng.Cells 
    If c.Value < 600 Then 
     deptnum = c.Value 
     result = "0" & deptnum 
     SourceSheet.Cells(c.Row, 2).NumberFormat = "00##" 
     SourceSheet.Cells(c.Row, 2).Value = result 
    ElseIf c.Value > 650 And c.Value < 899 Then 
     deptnum = c.Value 
     result = deptnum & "0" 
     SourceSheet.Cells(c.Row, 2).NumberFormat = "00##" 
     SourceSheet.Cells(c.Row, 2).Value = result 
    Else 
     deptnum = c.Value 
     result = deptnum & "0" 
     SourceSheet.Cells(c.Row, 2).NumberFormat = "00##" 
     SourceSheet.Cells(c.Row, 2).Value = result 
    End If 
Next c 
End Sub 

Я не совсем уверен, что формат ваших данных Table1 в этом я не могу быть уверен, что его формат должен быть таргетинг и т.д.

Суть его заключается в следующем : вам нужно перебирать ячейки, а не диапазон. Значение range.value не может вернуть значение для каждой ячейки, оно вернет одно значение. Чтобы оценить индивидуальное значение каждой ячейки в диапазоне, вам нужно пройти через диапазон в цикле (я использовал «Для каждого»).

Помните, что результаты могут различаться в зависимости от формата вашей книги/данных. Здесь моя «Таблица 1» считается листом, который вы можете заменить, как вам нужно. Если Table1 является вашей книгой или именем файла, вам не нужно включать ее вообще, если вы также не взаимодействуете с другим файлом/книгой в той же функции/модуле.

Смежные вопросы