- Excel VBA 質問スレ Part34
331 :デフォルトの名無しさん[sage]:2014/08/16(土) 00:33:45.00 ID:3d9Onywu - >>330
カンマ区切りは関係ないと思います。 Dim ws As Worksheet Dim flag As Boolean と書いても動くはずですよ。 あと、宣言の位置の違いは その変数のスコープ(有効範囲)に関わるものですので これまた型が違うというエラーとは関係ないと思われます。 Sub(Functionも同様、以下同じ)のなかで宣言したものはSubの中だけで有効になり Subの外で宣言したものはそのモジュール内(またはもっと広い範囲)で有効です。 ちなみに、変数のスコープは可能な限り狭いほうが望ましいとされていますので なるべくSubのなかで宣言したほうがよろしいですよ。
|
- Excel VBA 質問スレ Part34
333 :デフォルトの名無しさん[sage]:2014/08/16(土) 10:54:07.50 ID:3d9Onywu - On Error Resume Next と On Error Goto 〜 Resume Next の2パターンで書いてみた
Sub test1() Dim ShName As String 'シート名を指定するための変数 ShName = "a" 'シート名の指定 With ThisWorkbook On Error Resume Next 'エラーを無視するように指定 Sheets(ShName).Select '指定されたシートを選択、この時点でシートが存在すればそれがアクティブになるが、存在していなければ別のシートがアクティブのまま On Error GoTo 0 'エラー無視の状態を解除 If ActiveSheet.Name <> ShName Then 'アクティブなシート名の確認 Worksheets.Add after:=Sheets(Sheets.Count) '新たなシートを既存シートの末尾に追加 ActiveSheet.Name = ShName 'アクティブシートの名前を変更 End If ' 'この時点で目的の名前のシートが選択されているので、好きなように処理をする End With End Sub Sub test2() Dim ShName As String ShName = "b" With ThisWorkbook On Error GoTo Err: 'エラーが出たらエラー処理に飛ぶ Sheets(ShName).Select On Error GoTo 0 'この時点で目的の名前のシートが選択されているので、好きなように処理をする End With Exit Sub Err: 'エラー処理 Worksheets.Add after:=Sheets(Sheets.Count) ActiveSheet.Name = ShName Resume Next 'エラー発生の次の行に戻る End Sub
|
- Excel VBA 質問スレ Part34
339 :デフォルトの名無しさん[sage]:2014/08/16(土) 12:21:30.97 ID:3d9Onywu - >>338
Sheets(1)以外がアクティブな状態で、 Set a = Sheets(1).Range(Cells(1, 1), Cells(2, 2)) だとエラーになるけど、 Set a = Sheets(1).Cells(1, 1).Resize(2, 2) ならエラーにならない。 なぜそうなのかの理由は分からない。
|
- Excel VBA 質問スレ Part34
340 :339[sage]:2014/08/16(土) 12:26:32.73 ID:3d9Onywu - と、>>339を書いてから理由が分かった。
Sheets(1)がアクティブな状態では Set a = Sheets(1).Range(Cells(1, 1), Cells(2, 2)) と書けば Set a = Sheets(1).Range(Sheets(1).Cells(1, 1), Sheets(1).Cells(2, 2)) の意味になるが、 Sheets(1)以外がアクティブだと(たとえばSheets(2) がアクティブなら) Set a = Sheets(1).Range(Sheets(2).Cells(1, 1), Sheets(2).Cells(2, 2)) と言う風になっちゃうからエラーが出るんだ。
|
- Excel VBA 質問スレ Part34
341 :339[sage]:2014/08/16(土) 12:47:19.68 ID:3d9Onywu - つまり、
Cells()の部分がポイントで、 Cells(1, 1) とはすなわち ActiveSheet.Cells(1, 1) を意味している訳だ。 だから、Sheets(1)の "A1:B2" をRange型のオブジェクト変数 "a" に入れたいなら Dim a As Range Set a = Range(Sheets(1).Cells(1, 1),Sheets(1).Cells(2, 2)) とするべきで(もちろん>>339にも書いたように他のやり方も有るけど)、 Rangeの前のSheets(1)は不要だし、無意味ってことになる。
|
- Excel VBA 質問スレ Part34
343 :339[sage]:2014/08/16(土) 13:29:52.22 ID:3d9Onywu - まぁ、答えが分かった後からならなんとでも言えますし・・・
|
- Excel VBA 質問スレ Part34
345 :デフォルトの名無しさん[]:2014/08/16(土) 13:35:21.31 ID:3d9Onywu - (そんな事みんな分かってるよ・・・)
|
- Excel VBA 質問スレ Part34
347 :339[sage]:2014/08/16(土) 14:01:12.31 ID:3d9Onywu - >>346
それは違うでしょう、現に質問があったわけですから。 私もこの質問が出るまでそんなこと意識して無かったですし。 私や質問者のレベルが貴方もしくは貴方の想定レベルよりも 低いと仰りたいならそれは構いませんが、 それをここに書き込むことに意義があるとも思えないです。
|
- Excel VBA 質問スレ Part34
350 :デフォルトの名無しさん[sage]:2014/08/16(土) 20:33:56.39 ID:3d9Onywu - >>349
あぁ、そういえばそうですね。 標準モジュールのことしか想定してませんでした。 ご指摘ありがとうございます。
|
- Excel VBA 質問スレ Part34
354 :デフォルトの名無しさん[sage]:2014/08/16(土) 23:41:01.27 ID:3d9Onywu - >>353
ググッたけどオブジェクト型は定数に出来ないらしいです。 http://www.tipsfound.com/VBA/02006.vbhtml ここに >定数は数値や日付、文字列などの値型を設定できます。Object 型は定数にできません。 と書いてありました。
|