Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2013)
もしシート名が数値の場合を条件式的に書くと
投稿日時: 20/07/19 23:30:11
投稿者: ぜんだまん
メールを送信

「もしシート名が数値の場合は条件式1(シートを順番に開く)を起動
そうでない場合はループを抜ける」を条件式で書くと
下記ではないのでしょうか、動きません。
「Elseに対するifがありません」と出ます。
よろしくおねがいします。
 
 
Sub 集計2()
 
Dim i As Long
Dim num As Long
Dim number As Long
        
       If IsNumeric(Worksheets(i)) Then '数値か否か
        
            For i = 1 To 4
            Worksheets(Format(num + i)).Activate
        Else
           Exit For
           Next i
        End If
           
End Sub

回答
投稿日時: 20/07/20 08:29:48
投稿者: baoo

Worksheets(i)ってのはシート名なんでしょうか?
それを考えて頂けたら。

回答
投稿日時: 20/07/20 08:39:34
投稿者: baoo

あと、エラーについてですがFor文の中にElseが入ってます。
結論から言うとこういう構文は出来ません。
 

回答
投稿日時: 20/07/20 09:01:35
投稿者: simple

ワークシートの名前を相手にするなら、
Worksheets(i).Name
とする必要があります。
  
こんな風に線がからまってはいけません。

 ┏  If IsNumeric(Worksheets(i)) Then    '数値か否か
 ┃┏   For i = 1 To 4
 ┃┃       Worksheets(Format(num + i)).Activate
 ┗╂   Else
   ┃       Exit For
   ┗   Next i
     End If

実行したいことが不明ですが、忖度するとこんなことですか?
    For i = 1 To 4
        If IsNumeric(Worksheets(i).Name) Then    '数値か否か
            Worksheets(i).Activate
            Exit For
        End If
    Next i
もう一度、文法事項を確認しなおされたほうがよいと思います。

回答
投稿日時: 20/07/20 10:16:56
投稿者: WinArrow
投稿者のウェブサイトに移動

>動きません。
For i = 1 To 4
    If 条件 Then
      '処理A
    Else
   '処理B
   End If
Next i
のように、構文を組み立てましょう。
 
変数:num
は必要なの?
シートをActiveにする必要あるの?
 

投稿日時: 20/07/20 20:38:15
投稿者: ぜんだまん
メールを送信

baoo様、 simple様、 WinArrow様、回答ありがとうございます。
そして、説明不足だったようで申し訳ありません。
 
やりたい事というのは
 
Aブックのシート名"1"のB20:C20に電灯の型番、本数が入っているとします。(B20:D20など日によって増減する)
シートは1〜30まであり30番目のシートの右横には文字列で書かれたシートがあります。
初めにAブックの一番右にXシートという作業用のシートを作成します。
このXシートA2セルに1〜30の各日に使用した型番と本数を累積コピペ(値のみ)していきます。
文字列のシートの手前でループを抜けて次にいけないかと考え"IsNumeric"という数値を認識
できる場合trueを返すのでIF文と組み合わせて使えないかと考えました。
 
Xシートに30日分の表ができるかと思います。
この表をオートフィルターで電灯の種類分だけフィルタリングします。
例)
FHF32W 6
FHF32W 1
FHF32W 4
これを種類分実行して"FHF32W 11"の部分だけBブックへコピペして種類毎の本数使用量一覧を作成したいと考えています。
分からないのはAシートの"1"を選択して"2"シートを選択するところまではループで処理させようと
おもいますが、このループの中にもXシートのA2セルを選択して際下行に貼り付けるというループがあり
こういうプロシージャが作成可能なのかどうか、どういう風に組み立てて作成していったらいいか
わからない状態です。
実力が伴わない状態でハードルの高いプロシージャを作ろうとしているのは分かっています。
イメージ伝わりましたでしょうか
よろしくお願いします。

回答
投稿日時: 20/07/20 21:06:34
投稿者: WinArrow
投稿者のウェブサイトに移動

理解力がなくて済みませんが、
まったくわかりません。
質問は、シート名が数字か?の判定方法でしょう?
コードに書かれていないことまで、説明する必要があるのかな?
 
最初のコードの
>For i = 1 To 4
これはなんですか?
数字のシート名が30あるんだったら
For i = 1 To 30
になるのでは?
 
と思ったいするが、
シートは勝手に移動できちゃうから
 
For i = 1 To Sheets.Count
の方がよいでしょう。
そして、数字ではないシートが出現したら
ループを抜けるのではなく、単純に処理非対称とする方がよいでしょうね・・・
 
シート名が数字/文字列の判定は、
IsNumeric(Sheets(i).Name)
です。

回答
投稿日時: 20/07/20 21:17:07
投稿者: simple

>そして、説明不足だったようで申し訳ありません。
というより、こちらの回答は読んだのですか?
それを読んでの感想は?
理解できましたか?

投稿日時: 20/07/20 21:21:57
投稿者: ぜんだまん
メールを送信

WinArrow様返信ありがとうございます。
 
テストだったのでこのページには1〜4と書きましたが、実際の処理は月によって28日だったり、30日だったりなのでその月に作られたシートの数字(日数)の数によって(文字列のシートがきたらループ処理を抜ける)変えたいと思っています。
 
分からない部分はいろいろあるのですが、Aのブック内で1シートのセルをコピー、ペーストして2のシートに戻ってコピーする部分はループですね?
この中にもさらにXシートのA2セルを選択し、型式を選択しペーストする部分もループではないかとおもったのでそんなことが可能なのかどうかが知りたいです。

投稿日時: 20/07/20 21:35:39
投稿者: ぜんだまん
メールを送信

simple様
 
For iからNEXT iの間にIF〜end IFが入っていなかったということですね。
 
書いていただいた文は
 
"もしシートが数値ならシートを開く、そうでなければ
ループを抜ける"
 
という風に理解していいのでしたら私がしたいことであっています。
 
ありがとうございます。

投稿日時: 20/07/20 21:50:12
投稿者: ぜんだまん
メールを送信

ありがとうございました