2013-07-14 3 views
6

Почему следующее не работает:VBA Excel Range() с аргументом Cell

Range(Cells(1,1)).Value = 3

Cells(1,1) должны быть по существу то же самое, используя A1 правильно?

(я понимаю, что я мог бы просто сделать Cells(1,1).Value = 3, но я просто любопытно, почему он не работает.)

Я прочитал запись MSDN, и это показывает, что первый аргумент должен быть A1 стиль, но что-то вроде этого делает работу:

Range(Cells(1,1), Cells(2,3)).Value = 2

Полностью запутаться.

ответ

2

Если вы хотите использовать свойство Cells для указания параметров объекта диапазона (если я правильно помню - я не использовал VBA в течение некоторого времени), вам необходимо эффективно предоставить два аргумента.

Так что, если вы хотите, чтобы ссылаться на объект диапазона, который имеет только одну ячейку, то вам нужно написать:

Range(Cells(1, 1), Cells(1, 1)).value = "Hello World" 
+0

Почему это должно быть, я понятия не имею, хотя ... –

+0

Это просто сбивает с толку, потому что это противоречит их если я могу позвонить (говорит, что вы должны использовать A1-стиль в качестве первого аргумента). Я думаю, это просто одно из тех странных дизайнерских решений, с которыми вам нужно жить. – user943870

+0

Не совсем, если вы прокрутите вниз документацию, вы увидите, что существуют различные условия, если вы используете свойство Cells ... В этом разделе он фактически не упоминает стиль A1 (очевидно, поскольку он касается свойства Cells). –

12

Когда Range используется с одним параметром, параметр интерпретируется как имя диапазона ,

Range(Cells(1,1)) 

такая же, как с помощью

Range(Cells(1,1).Value) 

Таким образом, вы получите результат только значение Cells(1,1) является допустимым диапазоном адресов в A1 стиле

Только тогда, когда прошло два параметра диапазонвыхода они интерпретируются как углы диапазона.

+0

+1 хороший пост Крис. – brettdj

+0

Хороший, но может ли он быть более полным с ячейками (1,1). Пример использования? – LuizAngioletti

+1

Диапазон (ячейки (1,1) .Value) выдает ошибку на моей машине. Диапазон (ячейки (1,1) .Address) работает. – user3032689

-2

При использовании «ячеек» необходимо сформулировать Object.cells, , например. Application.cells (2,2) или activeWorksheet.cells

+0

больше описание? – tod

3

Вместо обращения к одной ячейке, как это:

Range(Cells(1,1), Cells(1,1)) 

Вы можете написать:

Range(Cells(1,1).Address) 
1

Для одной ячейки ее много проще: использовать ячейки по умолчанию() функция:

Cells(1,1) = "hello world" 

или использовать клетки из листовых (в) функции:

Dim sht as Worksheet 
Set sht = Sheets("myworksheet") ' or: = Sheets(1) 
sht.Cells(1,1) = "hello world" 

Для диапазона вам нужно будет использовать два параметра, как описано в других приведенных здесь ответах. Но преимущество заключается в том, что вы можете установить целый ряд полей в значение. И вы можете работать на листе, который не является «активным», за кулисами.Например:

Const colRand = 4 
Const colDiff = 5 

Dim sht as Worksheet, rngHi As Range, rngRand As Range, rngDiff As Range 
Set sht = Sheets("myworksheet") ' or: = Sheets(1) 

Set rngHi = sht.Range(sht.Cells(1,1), sht.Cells(3,3) 
rngHi = "hello world" 

Set rngRand = sht.Range(sht.Cells(1,colRand), sht.Cells(8,colRand) ' column 4, rows 1-8 
rngRand = "=RAND()" 

Set rngDiff = sht.Range(sht.Cells(2,colDiff), sht.Cells(8,colDiff) ' column 5, rows 2-8 
' using FormulaR1C1 in case the sheet isn't set to use that type of formula 
Set rngDiff.FormulaR1C1="=RC[-1] - R[-1]C[-1]" ' on previous columnn, diff between this row and previous row 

Объяснение:

Функция клетки принимает либо:
параметра строки - в котором можно указать диапазон A1_And_Colon Style
или два параметра Клеточных - начальную ячейку диапазона и конечную ячейку.

Так, чтобы установить диапазон с «ячеек», необходимо дать обе ячейки, разделенные запятой:

Range(Cells(1,1), Cells(1,1)) = "hello world" 
Range(Cells(2,2), Cells(3,4)) = "you cannot square around, but you can round a square" 
Sheets(1).Cells(5,5) = "=Round(Sqrt(5))"