映画のエンドロール観る派?観ない派?

指定する列の範囲はAから始まり、X~Z位までです。行は決まっています。先ず次の文で列の範囲を取得します。
Range("A1").CurrentRegion.Select
I = .Selection.Columns.Count
例えば5行目のI列を指定する時はどうすれば良いでしょうか。
Range("A5:" & I & "5").Select では、エラーになります。

A 回答 (4件)

■ 1 点目



> .Range("A1").CurrentRegion.Select

Range の前にピリオドがあるので、With ~ が省略されているのでしょう。
抜粋のコードでは正確なコメントがしにくいのですけど、恐らくシートを
切り替えて実行するとエラーになるのですよね?

  With Worksheets("Sheet1")

のようなコードでシートを指定しているのではないですか?

> .Range(Cells(I, 1), Cells(I + 40, PrintCol)).Select 'この文でエラー発生

仮に With Worksheets("Sheet1") が省略されているとするなら、この
コードを Sheet2 がアクティブの状態で実行すればエラーが発生します。

わかり易くコードを補完して書けば、この行は以下のように解釈されて
実行されてます。

Worksheets("Sheet1").Range(ActiveSheet.Cells(I, 1), ActiveSheet.Cells(I + 40, PrintCol)).Select

Worksheets("Sheet1") は With によって補完されるもの。以下に続く
Range() の括弧内の Cells はシートを指定しないと現在アクティブな
シートとなります。

つまり、Sheet2 がアクティブな状態なら、次のコードと同意です。

Worksheets("Sheet1").Range(Worksheets("Sheet2").Cells(I, 1), Worksheets("Sheet2").Cells(I + 40, PrintCol)).Select

Worksheets("Sheet1").Range ~ で Sheet1 にあるセルを参照するよー...
としているのに、肝心の Range の中身で異なるシート、つまり Sheet2
のセルを指定してます。

これはイメージし易いと思いますが、物理的に不可能っぽいです。

■ 2 点目

Select メソッドは「アクティブシートの中にあるものに対してのみ有効」
なので、現在アクティブでない別シートにあるものを Select しようと
するとエラーになります。これは VBA の仕様です。


■ 回避策ですが...一例を示しておきます。

With ActiveSheet
  ' 列数をカウント
  PrintCol = .Range("A1").CurrentRegion.Columns.Count
  ' 罫線の描画
  For I = 1 To PrintRow Step 41
    Range(.Cells(I, 1), .Cells(I + 40, PrintCol)).Borders.Weight = xlThin
  Next I
End With

# んーー。。。Rem を使う辺りから Basic 系言語の経験がある方だと
# 推察致します。#2 や #3 のコードは VBA では良く使われるテクニック
# ですから、とりあえずお試しを。

この回答への補足

度々すみません。回避策でもだめでした。とりあえずRangeを使った文はエラーにならないので、邪道ですが、Cellsの代わりにRangeで切り抜けることにしました。本当に不思議です。

Rem 行,列数をカウント
.Range("A1").CurrentRegion.Select
PrintCol = .Selection.Columns.Count
Select Case PrintCol
Case 20: PrintCol = "T"
Case 21: PrintCol = "U"
Case 22: PrintCol = "V"
Case 23: PrintCol = "W"
Case 24: PrintCol = "X"
Case 25: PrintCol = "Y"
Case 26: PrintCol = "Z"
Case 27: PrintCol = "AA"
Case 28: PrintCol = "AB"
Case 29: PrintCol = "AC"
End Select
PrintRow = .Selection.Rows.Count


Rem 罫線の描画
For Qq = 1 To PrintRow Step 41
.Range("A" & Qq & ":" & PrintCol & Qq + 40).Select
.Selection.Borders.Weight = xlThin
.Selection.Borders(xlInsideVertical).Weight = xlHairline
.Selection.Borders(xlInsideHorizontal).Weight = xlHairline
Next Qq

補足日時:2007/04/30 12:34
    • good
    • 0
この回答へのお礼

お付き合いありがとうございました。

お礼日時:2007/04/30 22:29

CurrentRegion はなかなか曲者なのであまりお勧めしませんが。



Dim r As Range
' Range("A1").CurrentRegion の範囲と 5行目全体、Rows(5)で
' 重なるセルの参照を試みます
Set r = Intersect(Range("A1").CurrentRegion, Rows(5))
' 参照できれば選択
If Not r Is Nothing Then
   r.Select
End If

とか。元のコードを生かすなら

Range("A1").CurrentRegion.Select
I = Selection.Columns.Count
' Cells(5,"A") は A5セルのこと。列の部分は列番号でも文字列でも
' 指定可能。ただし、この例での I は列番号に相当する数値を格納
' した変数なので""で括らない。
Range(Cells(5,"A"),Cells(5,I)).Select

この回答への補足

知りたいのは前に書いたような事ですが、次の文にすると1回目は問題なく2回目エラーになります。
Rem 列数をカウント
.Range("A1").CurrentRegion.Select
PrintCol = .Selection.Columns.Count

Rem 罫線の描画
For I = 1 To PrintRow Step 41
.Range(Cells(I, 1), Cells(I + 40, PrintCol)).Select 'この文でエラー発生
.Selection.Borders(xlEdgeLeft).Weight = xlThin
.Selection.Borders(xlEdgeTop).Weight = xlThin
.Selection.Borders(xlEdgeBottom).Weight = xlThin
.Selection.Borders(xlEdgeRight).Weight = xlThin
Next I

補足日時:2007/04/29 00:42
    • good
    • 0

こんにちは。



A5から変動列 i 列まで...なら
Range(Cells(5, 1), Cells(5, i)).Select


Range("A5").Resize(, i).Select

または
Sub sample()
  Range("A1").CurrentRegion.Rows(5).Select
End Sub
など^ ^

この回答への補足

>A5から変動列 i 列まで...なら
>Range(Cells(5, 1), Cells(5, i)).Select
この文が使えそうなのですが、次のようにするとエラーになります。
With objExcel
中略
.Range(Cells(5, 1), Cells(5, 24)).Select
中略
End With

実行時エラー '1004':
'Range'メソッドは失敗しました:'_Application'オブジェクト

何がいけないのでしょうか。

補足日時:2007/04/29 00:32
    • good
    • 0

やりたいことが良く分かりませんが


>例えば5行目のI列を指定する時
Range(Cells(5, i), Cells(5, i)).Select

> Range("A5:" & I & "5").Select では、エラーになります。
たぶん
Range(Cells(1, i), Cells(5, i)).Select
のことかな?
    • good
    • 0
この回答へのお礼

知りたかったのは後の方です。こんな方法があったのですね。でも、
.Range("A1:X41").Select
上の文は何回やっても問題無いのですが、代わりに次の文にすると1回目は問題なく、同じ所を2回目通るとエラーになってしまいます。
全く同じ事をやっていると思うのですが何が原因なんでしょうか。。

.Range(Cells(1, 1), Cells(41, 24)).Select

実行時エラー '1004':
'Cells'メソッドは失敗しました:'_Global'オブジェクト

お礼日時:2007/04/29 00:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!