Ошибка Null при использовании операторов If для циклического прохождения определенных листов - PullRequest
0 голосов
/ 29 января 2019

Я получаю сообщение об ошибке «Невозможно ввести нулевое значение в качестве имени элемента или поля в отчете сводной таблицы»

   Sub loopthruallsheets()

    Dim Shts() As Variant
    Dim Sheet As Worksheet


   Shts = Array("1", "3", "5", "7")

 For Each Sheet In ActiveWorkbook.Worksheets
 With Sheet
    If .Range("G2").Value = 1 Then
        .Range("H10:H11").Value = .Range("N10:N11").Value
        .Range("H14:H22").Value = .Range("N14:N22").Value
        .Range("H27:H29").Value = .Range("N27:N29").Value
        End If
    If .Range("G2").Value = 2 Then
        .Range("H10:H11").Value = .Range("O10:O11").Value
        .Range("H14:H22").Value = .Range("O14:O22").Value
        .Range("H27:H29").Value = .Range("O27:O29").Value
        End If
     If .Range("G2").Value = 3 Then
        .Range("H10:H11").Value = .Range("P10:P11").Value
        .Range("H14:H22").Value = .Range("P14:P22").Value
        .Range("H27:H29").Value = .Range("P27:P29").Value
        End If
     If .Range("G2").Value = 4 Then
        .Range("H10:H11").Value = .Range("Q10:Q11").Value
        .Range("H14:H22").Value = .Range("Q14:Q22").Value
        .Range("H27:H29").Value = .Range("Q27:Q29").Value
        End If
    If .Range("G2").Value = 5 Then
        .Range("H10:H11").Value = .Range("R10:R11").Value
        .Range("H14:H22").Value = .Range("R14:R22").Value
        .Range("H27:H29").Value = .Range("R27:R29").Value
        End If
    If .Range("G2").Value = 6 Then
        .Range("H10:H11").Value = .Range("S10:S11").Value
        .Range("H14:H22").Value = .Range("S14:S22").Value
        .Range("H27:H29").Value = .Range("S27:S29").Value
        End If
    If .Range("G2").Value = 7 Then
        .Range("H10:H11").Value = .Range("T10:T11").Value
        .Range("H14:H22").Value = .Range("T14:T22").Value
        .Range("H27:H29").Value = .Range("T27:T29").Value
        End If
    If .Range("G2").Value = 8 Then
        .Range("H10:H11").Value = .Range("U10:U11").Value
        .Range("H14:H22").Value = .Range("U14:U22").Value
        .Range("H27:H29").Value = .Range("U27:U29").Value
        End If
    If .Range("G2").Value = 9 Then
        .Range("H10:H11").Value = .Range("V10:V11").Value
        .Range("H14:H22").Value = .Range("V14:V22").Value
        .Range("H27:H29").Value = .Range("V27:V29").Value
        End If
    If .Range("G2").Value = 10 Then
        .Range("H10:H11").Value = .Range("W10:W11").Value
        .Range("H14:H22").Value = .Range("W14:W22").Value
        .Range("H27:H29").Value = .Range("W27:W29").Value
        End If
    If .Range("G2").Value = 11 Then
        .Range("H10:H11").Value = .Range("X10:X11").Value
        .Range("H14:H22").Value = .Range("X14:X22").Value
        .Range("H27:H29").Value = .Range("X27:X29").Value
        End If
    If .Range("G2").Value = 12 Then
        .Range("H10:H11").Value = .Range("Y10:Y11").Value
        .Range("H14:H22").Value = .Range("Y14:Y22").Value
        .Range("H27:H29").Value = .Range("Y27:Y29").Value

         End If
       End With
         Next Sheet
      End Sub

Мне нужен код для копирования и вставки значения в определенном месте, но скаждый отдельный период (месяцы 1-12) представляет собой отдельный столбец данных.Мой код ошибки в период 4 (это мой текущий период для нашего финансового года)

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Это ответ @BruceWayne с вашим массивом 1/3/5/7 - (имена, а не индексы)

 Sub loopthruallsheets()
 Dim Shts() As Variant
 Dim Sheet As Variant
 Dim startCol As Long
    startCol = 13 ' 13 is Column M
 Dim celVal As Long

 Shts = Array("1", "3", "5", "7")

 For Each Sheet In Shts
    With Worksheets(Sheet)
    celVal = .Range("G2").Value
    .Range("H10:H11").Value = .Range(.Cells(10, startCol + celVal), .Cells(11, startCol + celVal)).Value
    .Range("H14:H22").Value = .Range(.Cells(14, startCol + celVal), .Cells(22, startCol + celVal)).Value
    .Range("H27:H29").Value = .Range(.Cells(27, startCol + celVal), .Cells(29, 
  startCol + celVal)).Value
    End With
  Next Sheet
  End Sub
0 голосов
/ 29 января 2019

Нет необходимости иметь столько If операторов (или использовать Select Case).Это просто шаблон, который вы можете использовать с Cells() вместо просто Range():

Sub t()
Dim sheet As Worksheet
Dim startCol As Long, celVal As Long, i As Long
Dim shts() As Variant

startCol = 13 ' 14 is Column M

shts = Array(1, 3, 5, 7)

For i = LBound(shts) To UBound(shts)
    With ActiveWorkbook.Worksheets(shts(i))
        celVal = .Range("G2").Value
        .Range("H10:H11").Value = .Range(.Cells(10, startCol + celVal), .Cells(11, startCol + celVal)).Value
        .Range("H14:H22").Value = .Range(.Cells(14, startCol + celVal), .Cells(22, startCol + celVal)).Value
        .Range("H27:H29").Value = .Range(.Cells(27, startCol + celVal), .Cells(29, startCol + celVal)).Value
    End With
Next i

End Sub

Из вашего комментария я также настроил цикл For, чтобы вместо этого просто проходить по определенным листам, которые вы хотите,(Я также предположил, что 1, 3, 5, 7 - это лист индексов , который вы хотите использовать, а не фактическое имя листа. Если листы действительно имеют имя 1, 3 и т. Д., Используйте shts = Array("1", "3", "5", "7"))

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