2017-12-20 4 views
1

選択の最初のセルを取得して6番目のセルにマージするマクロを作成しようとしています。エラー400が発生しています。Excel行を選択する

Sub SignPage() 
Dim ws As Worksheet, BasePoint As Range, row As Long, singlecell As Long, 
singleCol As Long, sLong As Long, sShort As String 
Set BasePoint = Selection 
row = BasePoint.row 
Range(Cells(row, BasePoint.Columns(1)), Cells(row, BasePoint.Columns(6))).Merge 

End Sub 

答えて

2

ポイントは、Basepointの最初の列を参照してその列を取得する必要があります。あなたの行がこれに似改正する場合、これは、達成することができますアドバイスとして

Range(Cells(row,BasePoint.Columns(1).Column),Cells(row,BasePoint.Columns(6).Column)).Merge 

  • は変数としてrowcolumnCellsRangeなどのような名前を使用しないでください、 ExcelオブジェクトモジュールライブラリVBAにもそれらが使用されます。あなたの場合はBasePoint.rowです。変数rowがない場合、VBEditorはBasePoint.Rowと自動的に書き込まれます。マットのマグカップは、コメントで述べた@としてHow to avoid using Select in Excel VBA

  • とき、CellsRangesの「親」と表示するのは良い習慣です -

  • は、それが文脈にもよるが、Selectionを回避しようそれらを使用しています。あなたのケースではこのように 、このような何か:


With Worksheets(1) 
     .Range(.Cells(row, BP.Columns(1).Column), .Cells(row, BP.Columns(6).Column)).Merge 
End With 

そして、それは常に最初のワークシート(またはどちらかあなたがする必要があります)にしていないと呼ばれることになるActiveSheet、を参照することになり、場合はParent記載されていません。 (私はそれが1行に行くことを確認する代わりにBasePointBPを書かれている。)

+2

FWIW 'cell'、' row'、 'column'などに何も問題はありません。 VBAはそれらをまったく使用しません。 VBAはExcelオブジェクトモデルではなく、ExcelオブジェクトモデルはVBAではありません。 Excelオブジェクトモデルには、「行」または「列」または「セル」グローバルスコープオブジェクトはありません。だから、最悪の場合、 'Range.Row'は' Range.row'として表示されますが、これはまったく影響しません。 'row'と' column'(と 'cell')は完全に良い局所変数名で、何もシャドーイングしていません。不適格の 'Cells'と' Range'呼び出しは、持っている習慣のはるかに危険です。 –

+0

私は選択を使って開始列と終了列を知っているだけでなく、行を知っています。だから、私は必要なページにサインページを作ることができます。そして、その選択は、構築の基点として使用されます。 –

+2

@JacobLenertz 'Selection'が少なくとも6列幅でない場合、このコードはエラーをスローすると思います。 –

3

これは十分なはずです:

Selection(1).Resize(, 6).Merge 

説明:SelectionはそうSelection(1)左上のセルをとり、複数のセルにまたがることができます - したがって、我々は常に1つの細胞を参照する。

+0

これは受け入れられる回答でなければなりません。 'Selection'のタイプチェックが欠落し、IntelliSenseを取得するためにおそらく' Range'にキャストされますが、選択が少なくとも6カラム幅でない場合、エラーは発生しません。 –

+1

@ Mat'sMugはい、「選択」は複数のセルにまたがることができるので、私は答えを編集しました:) – JohnyL

関連する問題