2015-08-03 4 views
0

Я не могу понять это. Я пытаюсь сделать свой формуляр более динамичным. Но всегда говорит, что prev не найдено, но я установил prev как рабочий лист. PrevSheetName возвращает имя предыдущего листа (что работает). Пожалуйста, помогите мне, в моем другом коде я всегда пытался использовать «ActiveSheet.Previous», но, похоже, он не работает с формулами.vba - ссылки на рабочие листы в формуле

Set prev = Worksheets(PrevSheetName) 
Set rng = ActiveSheet.Range("D3") 
rng.FormulaR1C1 = "=SUMIF(prev!C[1],RC[-2],prev!C[5])" 
Range("D3").Copy Range("D4:D" & lRow) 

Это мой первый код и работает

Set rng = ActiveSheet.Range("D3") 
rng.FormulaR1C1 = "=SUMIF('Projekt 1'!C[1],RC[-2],'Projekt 1'!C[5])" 
Range("D3").Copy Range("D4:D" & lRow) 

и это мой PrevSheetName, уже ставит имя в " "

Function PrevSheetName(Optional ByVal WS As Worksheet = Nothing) As String 
    Application.Volatile True 
    Dim S As String 
    Dim Q As String 
    If IsObject(Application.Caller) = True Then 
     Set WS = Application.Caller.Worksheet 
     If WS.Index = 1 Then 
      With Application.Caller.Worksheet.Parent.Worksheets 
       Set WS = .Item(.Count) 
      End With 
     Else 
      Set WS = WS.Previous 
     End If 
     If InStr(1, WS.Name, " ", vbBinaryCompare) > 0 Then 
      Q = "'" 
     Else 
      Q = vbNullString 
     End If 
    Else 
     If WS Is Nothing Then 
      Set WS = ActiveSheet 
     End If 
     If WS.Index = 1 Then 
      With WS.Parent.Worksheets 
       Set WS = .Item(.Count) 
      End With 
     Else 
      Set WS = WS.Previous 
     End If 
     Q = vbNullString 
    End If 
    PrevSheetName = Q & WS.Name & Q 
End Function 

Я просто хочу, чтобы обменять «Projekt 1 'с предыдущим листом

+0

Как я вижу, вы используете« prev »как часть формуляра, как вы бы набирали его на листе excel и а не как переменная VBA. попробуйте следующее: заменить '' = SUMIF (prev! C [1], RC [-2], prev! C [5]) "' с '" = SUMIF ("& prev.name &"! C [1 ], RC [-2], "& prev.name &"! C [5]) "' Процесс, который вы делаете в vba, аналогичен тому, как вводить формуляр в ячейку excel вручную. Это означает, что имя рабочего листа должно быть частью значения вашей ячейки, а не именем переменной. – psychicebola

+0

спасибо, но как я его исправить? – ANNEH

+0

Я отправил свой комментарий на ранний ;-) Теперь исправлено – psychicebola

ответ

0

Если имя листа содержит пробелы, а также concatention вам нужно будет добавить «вокруг имени в формуле, как это» = SumIf («» & PrevSheetName & «'C [1! ], RC [-2], '"& PrevSheetName &"'! C [5]) «

+0

спасибо, что сработало для меня – ANNEH

0

prev - это буквальная часть формулы. Он ищет лист под названием «prev». Вам нужно сцепить формула: "=SUMIF(" & PrevSheetName & "!C[1],RC[-2]," & PrevSheetName & "!C[5])"

+0

Вам действительно нужно 'prev.Name' и в обеих частях формулы. – ChipsLetten

+0

mhh, он не работает – ANNEH

+0

PrevSheetName возвращает мне строку (например, «sheet1») – ANNEH

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