Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1541 / 13644 ツリー ←次へ | 前へ→

【73667】For Nextについて教えてください のり 13/1/31(木) 23:34 質問[未読]
【73668】Re:For Nextについて教えてください kanabun 13/2/1(金) 0:44 発言[未読]
【73669】Re:For Nextについて教えてください kanabun 13/2/1(金) 0:46 発言[未読]
【73670】Re:For Nextについて教えてください のり 13/2/1(金) 7:56 質問[未読]
【73671】Re:For Nextについて教えてください kanabun 13/2/1(金) 8:21 発言[未読]
【73691】Re:For Nextについて教えてください のり 13/2/2(土) 18:43 発言[未読]
【73694】Re:For Nextについて教えてください kanabun 13/2/3(日) 1:44 発言[未読]
【73696】Re:For Nextについて教えてください 13/2/3(日) 8:17 回答[未読]
【73697】Re:For Nextについて教えてください 13/2/3(日) 8:20 発言[未読]
【73698】Re:For Nextについて教えてください のり 13/2/3(日) 11:34 お礼[未読]
【73699】Re:For Nextについて教えてください kanabun 13/2/3(日) 17:09 発言[未読]
【73700】Re:For Nextについて教えてください ピクルス 13/2/4(月) 8:28 回答[未読]
【73701】Re:For Nextについて教えてください kanabun 13/2/5(火) 10:01 発言[未読]
【73703】Re:For Nextについて教えてください マナ 13/2/5(火) 19:56 発言[未読]
【73711】Re:For Nextについて教えてください 13/2/6(水) 6:49 発言[未読]
【73710】Re:For Nextについて教えてください 13/2/6(水) 6:21 発言[未読]
【73729】Re:For Nextについて教えてください kanabun 13/2/6(水) 23:23 発言[未読]

【73667】For Nextについて教えてください
質問  のり  - 13/1/31(木) 23:34 -

引用なし
パスワード
   どなたか教えてください
エクセルのFor Nextで困っています。
For 1 To シートの数
 If Range("A2")="" Then
   次のシートに移る
 Else
   通常処理
 End If
Next
のようにしたいのですがうまくいきません
どのようにしたら良いのでしょうか?
わかりにくい書き方で済みませんが宜しくお願いします。

【73668】Re:For Nextについて教えてください
発言  kanabun  - 13/2/1(金) 0:44 -

引用なし
パスワード
   ▼のり さん:

>For 1 To シートの数
> If Range("A2")="" Then
>   次のシートに移る
> Else
>   通常処理
> End If
>Next
>のようにしたいのですがうまくいきません
>どのようにしたら良いのでしょうか?

左端のシートから順に そのシートの[A2]セルをみて そのセルが空白だったら
「次のシートに移る」、そうでなかったら「通常処理」をして
次のシートに移る、
ということですか?

Dim i As Long

For i = 1 To シートの数
 If Worksheets(i).Range("A2")="" Then
   次のシートに移る
 Else
   通常処理
 End If
Next

【73669】Re:For Nextについて教えてください
発言  kanabun  - 13/2/1(金) 0:46 -

引用なし
パスワード
   よく考えると、

Dim i As Long

For i = 1 To Worksheets.Count ' シートの数
 If IsEmpty(Worksheets(i).Range("A2").Value) Then
   次のシートに移る
 Else
   通常処理
 End If
Next

のほうがよかった。。。

【73670】Re:For Nextについて教えてください
質問  のり  - 13/2/1(金) 7:56 -

引用なし
パスワード
   kanabunさんありがとうございます。
説明不足ですみません
下記の次の処理に移る方法(次のカウントに移る)が
良くわからないんです。

EXIT FORだと処理が中断してしまい
IFをつかってもうまくいかないので・・・


▼kanabun さん:
>よく考えると、
>
>Dim i As Long
>
>For i = 1 To Worksheets.Count ' シートの数
> If IsEmpty(Worksheets(i).Range("A2").Value) Then
>   次のシートに移る
> Else
>   通常処理
> End If
>Next
>
>のほうがよかった。。。

【73671】Re:For Nextについて教えてください
発言  kanabun  - 13/2/1(金) 8:21 -

引用なし
パスワード
   ▼のり さん:

>下記の次の処理に移る方法(次のカウントに移る)が
>良くわからないんです。
>
>EXIT FORだと処理が中断してしまい
>IFをつかってもうまくいかないので・・・

ああ、次のシートに移る のところは「何もしない」としておけばいいです。

>>For i = 1 To Worksheets.Count ' シートの数
>> If IsEmpty(Worksheets(i).Range("A2").Value) Then
    '次のシートに移る
>> Else
>>   通常処理
>> End If
>>Next

または

>>For i = 1 To Worksheets.Count ' シートの数
  If Not IsEmpty(Worksheets(i).Range("A2").Value) Then
>>   通常処理
>> End If
>>Next

でも、いいけど。
[A2]に何か値が入っているときだけ処理をする
って感じですね。

【73691】Re:For Nextについて教えてください
発言  のり  - 13/2/2(土) 18:43 -

引用なし
パスワード
   kanabunさんありがとうございます。
やっぱり私の説明不足でした。
次のカウントに移る方法ががわからないのです
例えば(i)=3の場合に("A2")のセルが 0 or ""の時
このカウントを抜けて次のカウントの4に移る
方法が良くわからないのです。

Exit ForだとForから抜けてしまいますので・・・

【73694】Re:For Nextについて教えてください
発言  kanabun  - 13/2/3(日) 1:44 -

引用なし
パスワード
   ▼のり さん:

>やっぱり私の説明不足でした。
>次のカウントに移る方法ががわからないのです
>例えば(i)=3の場合に("A2")のセルが 0 or ""の時
>このカウントを抜けて次のカウントの4に移る
>方法が良くわからないのです。
>
>Exit ForだとForから抜けてしまいますので・・・

どうにもおっしゃることが分からないのですが、
逆に、

>>For i = 1 To Worksheets.Count ' シートの数
>> If IsEmpty(Worksheets(i).Range("A2").Value) Then
    '次のシートに移る
>> Else
>>   通常処理
>> End If
>>Next

または

>>For i = 1 To Worksheets.Count ' シートの数
  If Not IsEmpty(Worksheets(i).Range("A2").Value) Then
>>   通常処理
>> End If
>>Next

で、なぜだめなのですか?
各シートの[A2]セルを見て 何か値が入っているときだけ「処理」をし、
空白のときは そのシートでの処理はしないで「つぎのシート」へ行く。。
「空白のとき」という条件ですから 0 のときも処理をすることになります
けど、そのあたりは主題ではないですよね?

具体的に「通常処理」のところは どんな処理をするのでしょう?
計算ですか?
印刷ですか?

【73696】Re:For Nextについて教えてください
回答    - 13/2/3(日) 8:17 -

引用なし
パスワード
   こんにちは。

VBAには「次のループに移る」という命令はありません。
仕方ないので代わりに goto 文を使います。
一般に goto 文を使うとコードがスパゲティになって読みに
くくなるので好ましくない、とされています。
goto 文を使うのは真にやむを得ない場合に限ります。つまり
・ほかに方法がない
・goto文を使わないことでかえってコードの構造が難解になる


Sub loopTest()
 For i = 1 To シートの数
  If Range("A2") = "" Then
    '次のシートに移る
    GoTo Label
  Else
    '通常処理
  End If
 Next
Label:
End Sub


▼のり さん:
>どなたか教えてください
>エクセルのFor Nextで困っています。
>For 1 To シートの数
> If Range("A2")="" Then
>   次のシートに移る
> Else
>   通常処理
> End If
>Next
>のようにしたいのですがうまくいきません
>どのようにしたら良いのでしょうか?
>わかりにくい書き方で済みませんが宜しくお願いします。

【73697】Re:For Nextについて教えてください
発言    - 13/2/3(日) 8:20 -

引用なし
パスワード
   訂正です。
labelの位置に誤りがありました。

Sub loopTest()
 For i = 1 To シートの数
  If Range("A2") = "" Then
    '次のシートに移る
    GoTo Label
  Else
    '通常処理
  End If
Label:
 Next
End Sub


▼佳 さん:
>こんにちは。
>
>VBAには「次のループに移る」という命令はありません。
>仕方ないので代わりに goto 文を使います。
>一般に goto 文を使うとコードがスパゲティになって読みに
>くくなるので好ましくない、とされています。
>goto 文を使うのは真にやむを得ない場合に限ります。つまり
>・ほかに方法がない
>・goto文を使わないことでかえってコードの構造が難解になる
>
>
>Sub loopTest()
> For i = 1 To シートの数
>  If Range("A2") = "" Then
>    '次のシートに移る
>    GoTo Label
>  Else
>    '通常処理
>  End If
> Next
>Label:
>End Sub
>
>
>▼のり さん:
>>どなたか教えてください
>>エクセルのFor Nextで困っています。
>>For 1 To シートの数
>> If Range("A2")="" Then
>>   次のシートに移る
>> Else
>>   通常処理
>> End If
>>Next
>>のようにしたいのですがうまくいきません
>>どのようにしたら良いのでしょうか?
>>わかりにくい書き方で済みませんが宜しくお願いします。

【73698】Re:For Nextについて教えてください
お礼  のり  - 13/2/3(日) 11:34 -

引用なし
パスワード
   佳 さん有難う御座います。
解決しました。
Gotoを使えばよいのではと思ってもいましたが
使わない方が良いとの記憶があり使いませんでした。
どうしても使わなければ前に進めない場合が
ある場合に使うことにします。

kanabunさんも何回も教えて下さり有難う御座いました。

▼佳 さん:
>訂正です。
>labelの位置に誤りがありました。
>
>Sub loopTest()
> For i = 1 To シートの数
>  If Range("A2") = "" Then
>    '次のシートに移る
>    GoTo Label
>  Else
>    '通常処理
>  End If
>Label:
> Next
>End Sub
>
>
>▼佳 さん:
>>こんにちは。
>>
>>VBAには「次のループに移る」という命令はありません。
>>仕方ないので代わりに goto 文を使います。
>>一般に goto 文を使うとコードがスパゲティになって読みに
>>くくなるので好ましくない、とされています。
>>goto 文を使うのは真にやむを得ない場合に限ります。つまり
>>・ほかに方法がない
>>・goto文を使わないことでかえってコードの構造が難解になる
>>
>>
>>Sub loopTest()
>> For i = 1 To シートの数
>>  If Range("A2") = "" Then
>>    '次のシートに移る
>>    GoTo Label
>>  Else
>>    '通常処理
>>  End If
>> Next
>>Label:
>>End Sub
>>
>>
>>▼のり さん:
>>>どなたか教えてください
>>>エクセルのFor Nextで困っています。
>>>For 1 To シートの数
>>> If Range("A2")="" Then
>>>   次のシートに移る
>>> Else
>>>   通常処理
>>> End If
>>>Next
>>>のようにしたいのですがうまくいきません
>>>どのようにしたら良いのでしょうか?
>>>わかりにくい書き方で済みませんが宜しくお願いします。

【73699】Re:For Nextについて教えてください
発言  kanabun  - 13/2/3(日) 17:09 -

引用なし
パスワード
   ▼のり さん:
>佳 さん有難う御座います。
>解決しました。
>Gotoを使えばよい

いや、だから、このばあい、Goto は不要ですよ

Sub Test()
 For i = 1 To シートの数
  If Worksheets(i).Range("A2") = "" Then
               '← ここには 何も書かなくてよい
  Else
    通常処理
  End If
 Next
End Sub

【73700】Re:For Nextについて教えてください
回答  ピクルス  - 13/2/4(月) 8:28 -

引用なし
パスワード
   ▼のり さん:
>どなたか教えてください
>エクセルのFor Nextで困っています。
>For 1 To シートの数
> If Range("A2")="" Then
>   次のシートに移る
> Else
>   通常処理
> End If
>Next
>のようにしたいのですがうまくいきません
>どのようにしたら良いのでしょうか?
>わかりにくい書き方で済みませんが宜しくお願いします。
Sub Test()
  Dim Active As Integer
  Dim i As Integer
  Active = 1
  Worksheets(Active).Activate
  
  For i = 1 To Sheets.Count
    ' 最後のシートでなければ
    If Active <> Sheets.Count Then
      Active = Active + 1
      If ActiveSheet.Range("A2").Value = "" Then
        Worksheets(Active).Activate
      Else
        通常処理 (Active)
      End If
    ' 最後のシートだったら
    Else
      If ActiveSheet.Range("A2").Value <> "" Then
        通常処理 (Active)
      End If
    End If
  Next i
End Sub

Function 通常処理(Active As Integer)
  ActiveSheet.Range("A1").Value = "通常処理"
  Worksheets(Active).Activate
End Function
↑ こんな感じでしょうか?

【73701】Re:For Nextについて教えてください
発言  kanabun  - 13/2/5(火) 10:01 -

引用なし
パスワード
   ▼のり さん:

(どうも伝わっていないようなので、もういちど 説明させてください)

> 例えば(i)=3の場合に("A2")のセルが 0 or ""の時
> このカウントを抜けて次のカウントの4に移る
> 方法が良くわからないのです。

>EXIT FORだと処理が中断してしまい
>IFをつかってもうまくいかないので・・・

●各ワークシートの[A2]セルが空白だったら何もしないで次にシートに移る
●(何か値が入っているときだけ 通常処理をして)次のシートに移る

という手順は
●「次のシートに移る」という共通処理の部分は
  For〜Nextで実現していますから、
●あとは For〜Next のなかに「通常処理をしない条件」を If文のなかに
 書けばいいです。
________________________________________
Dim ws As Worksheet
For Each ws In Worksheets
  If IsEmpty(ws.[A2].Value) Then
       '←(ココには 何もcodeを書く必要がありません)
  Else
    通常処理
  End If
Next ws '←● 次のワークシートへ

または すなおに「通常処理をする条件」をIf文の中に書けばいいです。
________________________________________
Dim ws As Worksheet
For Each ws In Worksheets
  If Not IsEmpty(ws.[A2].Value) Then
    通常処理
  End If
Next ws '次のワークシートへ


>("A2")のセルが 0 or ""の時
> このカウントを抜けて次のカウントの4に移る
判定条件が Orで2種類あるときも 「Or 使わないで」こう書けばいいです。
________________________________________
Dim ws As Worksheet
For Each ws In Worksheets

  Select Case ws.[A2].Value
   Case "", 0
   Case Else
      通常処理
  End Select

Next ws '次のワークシートへ


もちろんFor Each 〜 Nextでなく、これまでのように
For〜Nextを使って書いてもいいです。

>>For i = 1 To Worksheets.Count ' ワークシートの数
>> If IsEmpty(Worksheets(i).Range("A2").Value) Then
    '次のシートに移る
>> Else
>>   通常処理
>> End If
>>Next ' 次のシートに移る

または

>>For i = 1 To Worksheets.Count ' ワークシートの数
  If Not IsEmpty(Worksheets(i).Range("A2").Value) Then
>>   通常処理
>> End If
>>Next ' 次のシートに移る

【73703】Re:For Nextについて教えてください
発言  マナ  - 13/2/5(火) 19:56 -

引用なし
パスワード
   ▼のり さん:
> If Range("A2")="" Then

のりさんのコードで思い通りにならなかったのは、
Range("A2")にシート修飾されていないからではないでしょうか。

つまり、kanabunさんのように

> Worksheets(i).Range("A2")

とすることがポイントでは?

【73710】Re:For Nextについて教えてください
発言    - 13/2/6(水) 6:21 -

引用なし
パスワード
   こんにちは。

最初にこの質問を見たとき、どちらだろうか?と思いました。
1)例示のコードで 次のループに飛ぶ方法を知りたい
2)一般論として java言語のcontinueに相当するVBAの命令を知りたい
 (continue:その後のコードを飛ばして次のループに飛ぶ)

1)については、私が見た時点ですでにkanabunさんから適切な回答が
なされていましたが、質問者さんは満足していませんでした。
それで2)のラインで回答したところ 満足されました。
ここから2)の質問だったのではないかなと考えられます。


▼のり さん:
>どなたか教えてください
>エクセルのFor Nextで困っています。
>For 1 To シートの数
> If Range("A2")="" Then
>   次のシートに移る
> Else
>   通常処理
> End If
>Next
>のようにしたいのですがうまくいきません
>どのようにしたら良いのでしょうか?
>わかりにくい書き方で済みませんが宜しくお願いします。

【73711】Re:For Nextについて教えてください
発言    - 13/2/6(水) 6:49 -

引用なし
パスワード
   マナさんこんにちは。
横から失礼します。

のりさんの このコードはたぶん「擬似コード」です。
コードのざっくりとした流れを書きとめるためのもので
本スレでは、「こういうカンジのことをしたいのだけど」
という意味で出されている、と思います。

あくまでも「カンジ」ですから、エラーが出てもOK.
仮にコンパイルを通らなくても、問題有りません。
(1行目なんて、ぜったいエラーになりますでしょう?
でも、やりたいことは伝わりますでしょう?)

QAで質問者が擬似コードを出すのは珍しいですね。回答側が
方向を示すために出すのはときどき見かけますが。

QA以外では、大きなコードを書くときなど 最初に構成を
考えるときに擬似コードを使ったりします。


▼マナ さん:
>▼のり さん:
>> If Range("A2")="" Then
>
>のりさんのコードで思い通りにならなかったのは、
>Range("A2")にシート修飾されていないからではないでしょうか。
>
>つまり、kanabunさんのように
>
>> Worksheets(i).Range("A2")
>
>とすることがポイントでは?

【73729】Re:For Nextについて教えてください
発言  kanabun  - 13/2/6(水) 23:23 -

引用なし
パスワード
   ▼佳 さん:
こんにちは。

おっしゃる通りかもしれません。
つまり、

 If 条件 Then
 
 Else
   処理
 End If

と書いたとき、
「If 条件 Then」の次の行に 何も書かない というのは
構文規則の観点から 不自然ではないか?
ここには 何か書くべきだけれど、どう書いたらいいのか分からない。。。
そんなことが質問の主旨だったのかも? とも、思えてきました。

▼のり さん:
 くどいですが、 「If 条件 Then」の次の行に 何もすることがなければ
何も書く必要はありません。
何か書かなければいけないという規則はありません。
逆に、何か書くとしたら、


 If 条件 Then
    Goto Label
 Else
   処理
 End If
Label:

みたいな書き方になります。
そちらのほうが読みやすければ、Goto を使って書いても OK です。

1541 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free