トップページ > プログラム > 2014年08月16日 > 3d9Onywu

書き込み順位&時間帯一覧

3 位/158 ID中時間01234567891011121314151617181920212223Total
書き込み数10000000001032100000100110



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
339
Excel VBA 質問スレ Part34

書き込みレス一覧

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 型は定数にできません。

と書いてありました。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。