2016-11-30 3 views
0

Моя конечная цель состоит в том, чтобы пользователи выбирали диапазон, который они хотели бы дублировать, из выпадающего списка, а затем, нажав кнопку «добавить», он будет вставляться на Лист.VBA .range («Может ли формула перейти сюда?»)

Мои диапазоны называются в формате WorkSheet_RangeName, поэтому, например, раздел «Нефтяная печь» будет иметь названный диапазон «DataInput_OilFurnace». Таким образом, все мои диапазоны начнутся с «DataInput_», и пробелы должны быть удалены.

Sub AddExtraSection() 

Dim copySheet As Worksheet 
Dim pasteSheet As Worksheet 
Dim addSection As Range 

Set copySheet = Worksheets("Data Input") 
Set pasteSheet = Worksheets("Add Extra Section") 
Set addSection = Worksheets("Add Extra Section").Range("C3").Formula = _ 
"=""DataInput_""&SUBSTITUTE($C$3, "" "", """")" 

copySheet.range(addSection).Copy 
pasteSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial 

End Sub 

Если я не могу использовать формулу, я могу иметь имя диапазона быть конкретной ячейке (как, у меня есть формула под моей выпадающего списка, заполняющий с названием Range)?

Set addSection = Worksheets("Add Extra Section").ActiveCell.Offset(1, 0).Formula = "=INDIRECT($C$4)" 

Я новичок в VBA, так что если все это кажется починилась половины догадки ... это потому, что это! Спасибо за любую помощь!

EDIT - РЕШЕНИЕ

a.k.a диапазона, не может иметь формулу внутри него, и мне нужно, чтобы исправить мой набор addSection

Sub AddExtraSection() 

Dim copySheet As Worksheet 
Dim pasteSheet As Worksheet 
Dim addSection As range 

Set copySheet = Worksheets("Data Input") 
Set pasteSheet = Worksheets("Add Extra Section") 
Set addSection = copySheet.range("C3") 
addSection.Formula = "=""DataInput_""&SUBSTITUTE('Add Extra Section'!C3,"" "","""")" 

copySheet.range(addSection).Copy 
pasteSheet.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial 

End Sub 
+2

Строковый литерал в 'Range («что-то») 'может быть любым, что Excel может понять как относящееся к диапазону ячеек:' 'A1" ',' "A1: B12" ',' "$ A: $ B", '" SomeNamedRange "', что угодно. Но нет, не формула. –

+0

Phooey. Спасибо за разъяснение! – Haley

ответ

1

Вы получаете ошибку? Я бы подумал, что ваша линия pasteSheet.Cells(... может выдать ошибку. Посмотрите, как вы добавили имя листа до .Cells()? Вы всегда должны делать это с Rows() и Columns() тоже, так что линия будет: pasteSheet.Cells(pasteSheet.Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial.

Кроме того, вы не можете сделать mySheet.Range([formula]). Это нужно разбить. Вы бы вместо этого хотите сделать

Set addSection = Worksheets("Add Extra Section").Range("C3") 
addSection.Formula = "=""DataInput_""&SUBSTITUTE($C$3, "" "", """")" 

Я думаю что должен сделать это для вас. Кроме того, быстрое примечание, если вы делаете PasteSpecial только, чтобы получить значение вставили, немного более быстрый способ, чтобы установить диапазоны, равные друг друга, что позволяет избежать использования буфера обмена:

Range([destination range]).Value = Range([range to copy]).Value

Итак, попробуйте это:

Sub AddExtraSection() 

Dim copySheet As Worksheet 
Dim pasteSheet As Worksheet 
Dim addSection As Range 

Set copySheet = Worksheets("Data Input") 
Set pasteSheet = Worksheets("Add Extra Section") 
Set addSection = pasteSheet.Range("C3") 
addSection.Formula = "=""DataInput_""&SUBSTITUTE($C$3, "" "", """")" 

pasteSheet.Cells(pasteSheet.Rows.Count, 1).End(xlUp).Offset(1, 0).Value = addSection.Value 
End Sub 

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

Sub AddExtraSection() 

Dim pasteSheet As Worksheet 

Set pasteSheet = Worksheets("Add Extra Section") 
'Next line will put "DataInput_[RANGE NAME]" in cell C3 of "Data Input" worksheet 
Worksheets("Data Input").Range("C3").Formula = "=""DataInput_""&SUBSTITUTE('Add Extra Section'!$C$3, "" "", """")" 

pasteSheet.Cells(pasteSheet.Rows.Count, 1).End(xlUp).Offset(1, 0).Value = _ 
    Worksheets("Data Input").Range("C3").Value 
End Sub 

Мы никогда не использовали copySheet, поэтому я удалил это. Кроме того, если вы не планируете расширять этот макрос, то pasteSheet и addSection добавляет путаницу, поэтому я попытался сохранить его простым.

На листе ввода данных мы хотим получить именованный диапазон, указанный в ячейке C3.

Именованный диапазон указан в листе «Добавить дополнительную секцию», ячейка C3. Возьмите эту строку и удалите пробелы. Затем добавьте «DataInput_» в начало. Это то, что делает линия ...Formula =. (Посмотрите на формулу назад, Excel сначала заменит пробелы, а затем объединит это с «DataInput_»).

Затем, наконец, возьмите строку «DataInput_ [NAMED RANGE]» и поместите ее в последнюю строку «Добавить дополнительную секцию» +1.

Edit2: Извините, но думать об этом, еще лучше было бы, чтобы избежать использования рабочего листа, и сделать работу в самой VBA:

Sub updateNamedRange() 
Dim destinationCell As Range, inputCell As Range 

Set destinationCell = Worksheets("Add Extra Section").Cells(Worksheets("Add Extra Section").Rows.Count, 1).End(xlUp).Offset(1, 0) 
Set inputCell = Worksheets("Add Extra Section").Cells(3, 3) 

destinationCell.Value = "DataInput_" & WorksheetFunction.Substitute(inputCell, " ", "") 

End Sub 
+0

Разве эта формула не будет циркулярной ссылкой? – Comintern

+0

@Comintern - Может быть, честно говоря, я действительно не проверял формулу, но просто замечал, как вы это сделаете в VBA. Я думаю, что, возможно, '$ C $ 3' относится к другому листу? Возможно, это должно быть '' = "" DataInput _ "" & SUBSTITUTE ('Data Input'! $ C $ 3, "" "", "" "") "?? – BruceWayne

+1

Трудно сказать, что я предполагал, но это не может быть просто '$ C $ 3', если он переходит в' .Range ("C3") '. – Comintern