VBA вложенный IF / ElseIF помогает создать условную гиперссылку - PullRequest
1 голос
/ 05 августа 2020

Надеюсь, что кто-то может помочь - я полагаю, что есть что-то очень простое, что я делаю неправильно.

Ситуация такова:

  • У меня есть таблица с переменными строками (месяц до месяца)
  • Четыре столбца, в которых тот, который я пытаюсь поместить формулу в (CaseLink), пуст

Образец таблицы

  • Столбец «Система» имеет одно из трех значений; CSv1, CSv2, PIA
  • В столбце № дела будут числа - без повторов или согласованности
  • В столбце CaseLink возникла проблема - я пытаюсь вставить одну из трех гиперссылок на включите значение в столбец Case #. Целевая ссылка основана на значении в столбце System

Раньше у меня было только две переменные в столбце System, и я мог найти их с помощью простого оператора IF, поскольку оно было либо истинным, либо ложным. Теперь с третьей переменной у меня возникают трудности с форматом If / ElseIF. Вот что я пробовал:

Оригинальный оператор if, который работает:

    
       Range("C2").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(RC[-2]=""CSv1"",HYPERLINK(CONCATENATE(""https://open. cloudav.com/servicedeliverdo.aspx?rdx=9992956J43211&conv="",RC[-1]),RC[-1]),HYPERLINK(CONCATENATE(""https://open.topcloudav.com/ha2servicedeliverdo.aspx?conv="",RC[-1]),RC[-1]))"
    
    Range("D3").Select

Вариант 1: (возвращает ошибку: подпрограмма или функция не определены в Concatenate)

       Range("C2").Select
If ActiveCell.Offset(0, -2).Value = "CSv1" Then Hyperlink (CONCATENATE("https://open.cloudav.com/servicedo.aspx?rdx=9992956J43211&conv="),RC[-1]),RC[-1]))

ElseIf ActiveCell.Offset(0, -2).Value = "CSv2" Then Hyperlink (CONCATENATE("https://open.cloudav.com/topservicedo.aspx?conv="),RC[-1]),RC[-1]))

ElseIf ActiveCell.Offset(0, -2).Value = "PIA" Then Hyperlink (CONCATENATE("https://dev.devroot.net/browse/PIA-"),RC[-1]),RC[-1]))
    
End If

    Range("D3").Select

Вариант 2: (это возвращает ошибку, указывающую, что ElseIF не определено

       Range("C2").Select
ActiveCell.FormulaR1C1 = _
        "IF(RC([-2])) = ""CSv1"" Then Hyperlink (CONCATENATE(""https://open.cloudav.com/servicedo.aspx?rdx=9992956J43211&conv="", RC[-1]), RC[-1])))"

elseif_
    ActiveCell.FormulaR1C1 = _
        "IF(RC([-2]) = ""CSv2"" then Hyperlink (CONCATENATE(""https://open.cloudav.com/topservicedo.aspx?conv="", RC[-1]), RC[-1])))"

elseif_
    ActiveCell.FormulaR1C1 = _
        "IF(RC([-2]))= ""PIA"" Then"
        Hyperlink (concatenate("https://dev.devroot.net/browse/PIA-", (RC([-1])), (RC([-1]))))
    
End If

    Range("D3").Select

Я также пробовал ActiveCell.Offset, а не ActiveCell.Formula с аналогичными результатами сбоя

Есть мысли?

Ответы [ 2 ]

0 голосов
/ 06 августа 2020

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

Я придумал простой способ сделать это самостоятельно в один вложенный оператор IF:

Range("C2").Select
   
    ActiveCell.FormulaR1C1 = _
        "=IF(RC[-2]=""CSv1"",HYPERLINK(CONCATENATE(""https://open.cloudav.com/deliverdo.aspx?rdx=9992956J43211&conv="",RC[-1]),RC[-1]),IF(RC[-2]=""CSv2"",HYPERLINK(CONCATENATE(""https://open.cloudav.com/topdeliverdo.aspx?conv="",RC[-1]),RC[-1]),IF(RC[-2]=""PIA"",HYPERLINK(CONCATENATE(""https://dev.devroot.net/browse/PIA-"",RC[-1]),RC[-1]))))"
    Range("A2").Select

0 голосов
/ 05 августа 2020

В вашем коде есть много вещей, которые можно улучшить:

  • Использовать переменную вместо жесткого кода
  • не выбирать
  • Отступ лучше

Я пытался воспроизвести то, что вы делали,

Sub hyperlink()

Dim firstcellrow As Long       ' First row where your code acts
Dim systemcellcollumn As Long  ' Column w the system entries
Dim linkcollumn As Long        ' Column where you want to link stuff

firstcellrow = 1       ' In my case
systemcellcollumn = 2  'From your image
linkcollumn = 4        'From your image

Dim activecellrow As Long ' Its a long name but thats actualy just a counter
Dim system As String      ' Not needed if u use cell.text directly into select case

Dim i As Long
For i = 0 To 2 ' 0 to whatever you want
activecellrow = firstcellrow + i

system = Worksheets("test").Cells(activecellrow, systemcellcollumn).Text ' Not necessary, see comment under "Select Case"
Select Case system 
' or Select Case Worksheets("test").Cells(activecellrow, systemcellcollumn).Text 
    Case "CSv1"
         Cells(activecellrow, linkcollumn).FormulaR1C1 = "=IF(RC[-2]=""CSv1"",HYPERLINK(CONCATENATE(""https://open. cloudav.com/servicedeliverdo.aspx?rdx=9992956J43211&conv="",RC[-1]),RC[-1]),HYPERLINK(CONCATENATE(""https://open.topcloudav.com/ha2servicedeliverdo.aspx?conv="",RC[-1]),RC[-1]))"
    Case "CSv2"
        'etc 
    Case "PIA"
    'etc
End Select
Next

End Sub

Этот код может быть не идеальным, но уже является более общим и работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...