Преобразование скрипта Google Apps в VBA - PullRequest
0 голосов
/ 25 февраля 2020

Полагаю, это будет немного лениво, но я работаю над этим уже несколько часов, чтобы заставить его работать в Google Sheets. Теперь мне нужно также заставить его работать в Excel, используя VBA. Это довольно простой скрипт для опытных программистов, которым я не являюсь. : -)

У меня есть диапазон букв в электронной таблице. Каждая буква представляет значение. Сценарий Google Apps выглядит следующим образом:

function Arsarbetstid(v,year) {
  switch(year) {

    case 2020:    // Tider gällande 2020
      var n=6.7,  // N
          np=9,   // N+
          k=8.8,  // K
          km=7,   // K-
          k4=4,   // K4
          d=8.8,  // D
          h=12,   // H
          hp=13;  // H+
      break;

    case 2019:    // Tider gällande 2019
      var n=6.9,  // N
          np=9,   // N+
          k=8.7,  // K
          km=7,   // K-
          k4=4,   // K4
          d=9,    // D
          h=12,   // H
          hp=13;  // H+
      break;

    case 2018:    // Tider gällande 2018
      var n=6.9,  // N
          np=9,   // N+
          k=8.7,  // K
          km=7,   // K-
          k4=4,   // K4
          d=9,    // D
          h=12,   // H
          hp=13;  // H+
      break;

    case 2017:    // Tider gällande 2017
      var n=7,    // N
          np=9,   // N+
          k=8.8,  // K
          km=7,   // K-
          k4=4,   // K4
          d=9.1,  // D
          h=12,   // H
          hp=13;  // H+
      break;

    case 2016:    // Tider gällande 2016
      var n=7,    // N
          np=9,   // N+
          k=8.8,  // K
          km=7,   // K-
          k4=4,   // K4
          d=9.1,  // D
          h=12,   // H
          hp=13;  // H+
      break;

    case 2015:    // Tider gällande 2015
      var n=7,    // N
          np=9,   // N+
          k=8.8,  // K
          km=7,   // K-
          k4=4,   // K4
          d=9.1,  // D
          h=12,   // H
          hp=13;  // H+
      break;

    case 2014:    // Tider gällande 2014
      var n=7,    // N
          np=9,   // N+
          k=8.8,  // K
          km=7,   // K-
          k4=4,   // K4
          d=9.1,  // D
          h=12,   // H
          hp=13;  // H+
      break;

    case 2013:    // Tider gällande 2013
      var n=7,    // N
          np=9,   // N+
          k=8.8,  // K
          km=7,   // K-
          k4=4,   // K4
          d=9.1,  // D
          h=12,   // H
          hp=13;  // H+
      break;

    default:      // Tider gällande om inget årtal anges.
      var n=6.7,  // N
          np=9,   // N+
          k=8.8,  // K
          km=7,   // K-
          k4=4,   // K4
          d=8.8,  // D
          h=12,   // H
          hp=13;  // H+
      break;   

  }

  var total = 0;
  for (var i=0;i < v.length;i++) {
    var row = v[i];
    for (var j=0;j < row.length;j++) {
       switch(row[j]) {
         case "N":
           total += n;
           break;
         case "N+":
           total += np;
           break;
         case "D":
           total += d;
           break;
         case "H":
           total += h;
           break;
         case "H+":
           total += hp;
           break;
         case "K":
           total += k;
           break;
         case "K-":
           total += km;
           break;
         case "K4":
           total += k4;
           break;
                  }
    }
  }

  return total;
};

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

VBA пока выглядит так, но не работает.


Public Function arsarbetstid(v As Range, year As Integer)
Dim total As Double
    Select Case year
        Case 2020
            n = 6.7
            np = 9
            k = 8.8
            km = 7
            k4 = 4
            d = 8.8
            h = 12
            hp = 13
        Case 2019
            n = 6.7
            np = 9
            k = 8.8
            km = 7
            k4 = 4
            d = 8.8
            h = 12
            hp = 13
        Case 2018
            n = 6.7
            np = 9
            k = 8.8
            km = 7
            k4 = 4
            d = 8.8
            h = 12
            hp = 13
        Case 2017
            n = 6.7
            np = 9
            k = 8.8
            km = 7
            k4 = 4
            d = 8.8
            h = 12
            hp = 13
        Case 2016
            n = 6.7
            np = 9
            k = 8.8
            km = 7
            k4 = 4
            d = 8.8
            h = 12
            hp = 13
        Case 2015
            n = 6.7
            np = 9
            k = 8.8
            km = 7
            k4 = 4
            d = 8.8
            h = 12
            hp = 13
        Case 2014
            n = 6.7
            np = 9
            k = 8.8
            km = 7
            k4 = 4
            d = 8.8
            h = 12
            hp = 13
        Case 2013
            n = 6.7
            np = 9
            k = 8.8
            km = 7
            k4 = 4
            d = 8.8
            h = 12
            hp = 13
        Case Else
            n = 6.7
            np = 9
            k = 8.8
            km = 7
            k4 = 4
            d = 8.8
            h = 12
            hp = 13
    End Select
    For i = 0 To v.Length
        Row = v(i)
        For j = 0 To Row.Length
        Select Case Row(j)
            Case "N"
                total = total + n
            Case "N+"
                total = total + np
            Case "D"
                total = total + d
            Case "H"
                total = total + h
            Case "H+"
                total = total + hp
            Case "K"
                total = total + k
            Case "K-"
                total = total + km
            Case "K4"
                total = total + k4
            End Select
        Next
    Next
    arsarbetstid = total
End Function

Буду очень признателен за помощь.

1 Ответ

0 голосов
/ 25 февраля 2020

Последняя часть будет выглядеть примерно так:

For Each c In v.Cells
    Select Case c.Value
        Case "N": total = total + n
        Case "N+": total = total + np
        'etc

    End Select
Next c

При попытке отладки UDF проще вызывать его из Sub:

Sub Tester()
    Debug.Print arsarbetstid(Range("C5:I57"), 2019)
End sub

Тогда вы можете увидеть, что проблема не в том, чтобы просто получить # ЗНАЧЕНИЕ!

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