2016-02-14 4 views
1

Я работаю с некоторыми данными о Excel 2011 для Mac (версия 14.3.1), которые мне нужны для построения графика и добавления дополнительных данных позже. Для этого я использую имена для диапазонов, как объясняется here. В основном создайте диапазоны имен с формулой =OFFSET($A$2,0,0,COUNTA($A:$A)-1) (на испанском языке: =DESREF($A$2,0,0,CONTARA($A:$A)-1)).Запретить включение имен листов при добавлении имени для диапазона ячеек с помощью vba

У меня есть много столбцов, так что я написал эту VBA, чтобы сделать это для меня:

Sub Botón6_AlHacerClic() 
For i = 1 To Columns.Count 
    Names.Add Name:=ActiveSheet.Name & Range(Cells(1, i).Address).Value, RefersTo:="=DESREF(" & Cells(2, i).Address & ",0,0,CONTARA(" & Replace(Cells(1, i).Address, "$1", "") & ":" & Replace(Cells(1, i).Address, "$1", "") & ")-1)" 
Next i 
End Sub 

Где:

  1. Cells(2, i).Address является идентификатор соты для второго ряда (например: $ A $ 2)
  2. Replace(Cells(1, i).Address, "$1", "") это строка букву (например: $ A)

Проблема, с которой я столкнулась, заключается в том, что при вводе имен вручную она заменяет формулу =DESREF($A$2,0,0,CONTARA($A:$A)-1) на =DESREF(Sheet1!$A$2,0,0,CONTARA(Sheet1!$A:$A)-1), что прекрасно и отлично работает. Но когда я делаю это с помощью vba, он заменяет его =Sheet1!DESREF(Sheet1!$A$2,0,0,CONTARA(Sheet1!$A:$A)-1), который не работает.

Я попытался с различными вариантами Add manual и даже попытался запустить этот код после того, как имена были созданы, чтобы исключить Sheet1! в начале, но в конце они держат Sheet1!:

Sub Botón7_AlHacerClic() 
Set nms = ActiveWorkbook.Names 
For i = 1 To nms.Count 
    nms(i).RefersTo = Replace(nms(i).RefersTo, ActiveSheet.Name & "!DESREF", "DESREF") 
Next i 
End Sub 

Другая вещь, которую я попытался было заменить Лист1 DESREF за то, что не является функцией:

Sub Botón7_AlHacerClic() 
Set nms = ActiveWorkbook.Names 
For i = 1 To nms.Count 
    nms(i).RefersTo = Replace(nms(i).RefersTo, ActiveSheet.Name & "!DESREF", "DESREFF") 
Next i 
End Sub 

И в этом случае это дает мне: =DESREFF($A$2,0,0,CONTARA($A:$A)-1) Но я гаванью» t найти способ сделать это с DESREF без добавления Sheet1!

Как я могу предотвратить лист1! от появления в начале?
Спасибо

+0

Когда вы говорите, что VBA меняется в '= Лист1 DESREF (Лист1 $! A $ 2,0,0, CONTARA (Sheet1! $ A: $ A) -1) ', какой именно VBA это делает? Похоже, что ваш первоначальный фрагмент будет перезаписывать все, что есть. Можете ли вы указать на определенную строку VBA, которая приводит к этому изменению? – Hambone

+0

Это в строке: 'Names.Add Name: = ActiveSheet.Name & Range (Ячейки (1, i) .Address) .Value, RefersTo: =" = DESREF ("& Cells (2, i) .Address & ", 0,0, CONTARA (" & Replace (Ячейки (1, i) .Address, "$ 1", "") & ":" & Replace (Ячейки (1, i) .Address, "$ 1", "") & ") -1)" ' Кроме того, даже когда я пытаюсь заменить его на' nms (i) .RefersTo = Replace (nms (i) .RefersTo, ActiveSheet.Name & "! DESREF", "DESREF") 'он все еще пишет _Sheet1! DESREF_. С другой стороны, если я делаю 'nms (i) .RefersTo = Replace (nms (i) .RefersTo, ActiveSheet.Name &"! DESREF "," DESREFF ")' он будет писать '= DESREFF (Sheet1! $ A $ 2,0,0, CONTARA (Sheet1! $ A: $ A) -1) ' –

+0

Вау, это сумасшествие. Я чувствую, что могу заставить это работать, если только я могу повторить этот вопрос. Каждый раз Excel/VBA делает именно то, что, как я думаю, должен - я не могу заставить его воссоздать вашу ошибку. Если это все еще проблема, и вы можете повторить шаги (в вашем OP), которые вызывают ошибку, я с удовольствием рассмотрю ее. Возможно, вам придется быть конкретным - «Выделите столбец C, назовите его« blah », запустите VBA Sub« XYZ ». Я понимаю, что это не так важно для вас, поэтому я позволю вам решить. – Hambone

ответ

0

Я попытался с различными версиями Excel и это, кажется, ошибка в Excel 2011 для Mac (версия 14.3.1).

Я попробовал его в следующих версиях, и он не добавил Sheet1! в начале:

  1. EXcel для Mac 14.3.9
  2. Excel для Windows, 16.0.6001.1054

теперь проблема с как из этих версий является следующее:
У меня есть колонку со следующими ячейками:

C1-> data 
C2-> 400 
C3-> 100 
C4-> 100 

И после C5 emp ти.Я запустить скрипт для создания имен:

Sub Botón6_AlHacerClic() 
For i = 1 To Columns.Count 
    Names.Add Name:=ActiveSheet.Name & Range(Cells(1, i).Address).Value, RefersTo:="=DESREF(" & Cells(2, i).Address & ",0,0,CONTARA(" & Replace(Cells(1, i).Address, "$1", "") & ":" & Replace(Cells(1, i).Address, "$1", "") & ")-1)" 
Next i 
End Sub 

И это создало мне имя Sheet1data со ссылкой: =DESREF(Sheet1!$C$2;0;0;CONTARA(Sheet1!$C:$C)-1), который является правильным. Но если я перехожу в какую-либо ячейку и вставляю формулу =SUM(Sheet1data), она разрешает ошибку формулы #Name?, хотя объяснение формулы, похоже, указывает на правильные ячейки.

Более странно, если после его создания я иду, чтобы изменить имя и просто нажмите Enter, формула работает автоматически и представляет . Если я снова перейду к редактору названий, он отобразит =DESREF(Sheet1!$C$2;0;0;CONTARA(Sheet1!$C:$C)-1), который будет таким же, как и раньше.

Наконец I found this web with examples там, где был один объясняя что-то подобное тому, что я хотел бы сделать:

Sub DynamicNames() 
    Dim LastCol As Long, _ 
     LabelRow As Long, _ 
     Col As Long 
    Dim sName As String 
    Dim c As Range 
    Dim Sht As String 

    'assign row and column parameters 
    '**adjust for the row containing your headings 
    LabelRow = 1 
    LastCol = Range("IV1").End(xlToLeft).Column 

    'grab sheet name 
    Sht = "'" & ActiveSheet.Name & "'" 

    For Each c In Range(Cells(LabelRow, 1), Cells(LabelRow, LastCol)) 
    Col = c.Column 
    sName = c.Value 
    If Len(sName) > 1 Then 
     'replace spaces with underscores 
     sName = Replace(sName, " ", "_", 1) 
     'create the name 
     ActiveWorkbook.Names.Add Name:=sName, RefersToR1C1:= _ 
     "=OFFSET(" & Sht & "!R2C" & Col & ",0,0,COUNTA(" & Sht & "!C" & Col & ")-1,1)" 
    End If 
    Next c 
End Sub 

Основное различие заключается в том, что они где с помощью RefersToR1C1 вместо RefersTo, поэтому я изменил его, но его все еще не работал. В конце концов я изменил формулы на английском, даже если я должен был написать их на испанском языке вручную и сделал окончательный трюк: Names.Add Name:=ActiveSheet.Name & Range(Cells(1, i).Address).Value, RefersToR1C1:="=OFFSET(" & ActiveSheet.Name & "!R2C" & Cells(2, i).Column & ",0,0,COUNTA(" & ActiveSheet.Name & "!C" & Cells(2, i).Column & ")-1)"

Итак, проблемы, где:

  1. в программе Excel 2011 для Mac (версия 14.3 .1), похоже, есть ошибка.
  2. Использование RefersToR1C1 вместо RefersTo упрощает работу с формулами vba и, возможно, это помогло.
  3. Несмотря на то, что во всех моих Excel я использую испанские формулы, те, что в vba должны быть на английском языке. (Я попробовал параметр _ RefersToR1C1Local_, но это дало мне ошибку).

Наконец, код, который работал:

Sub Botón6_AlHacerClic() 
    For i = 1 To Columns.Count 
     Names.Add Name:=ActiveSheet.Name & Range(Cells(1, i).Address).Value, RefersToR1C1:="=OFFSET(" & ActiveSheet.Name & "!R2C" & Cells(2, i).Column & ",0,0,COUNTA(" & ActiveSheet.Name & "!C" & Cells(2, i).Column & ")-1)" 
    Next i 
End Sub 

Я надеюсь, что это помогает кто-то там :)

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