Excel (VBA)

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

 
(Windows 11 Pro : Excel 2021)
「全列5行目以降の()が無いセルの集計数」の ヘクセルさんへ
投稿日時: 23/03/05 17:10:02
投稿者: Nubo

早々に解決にされましたが、
 
自分で上げたサンプル(15:23:10)でtaitaniさんのコードを試してみましたか ?
私的には、違う気がします。
 
 
以下のコードで取り敢えず、15:23:10のケースでは「2」と表示されますが ?
 
但し、カッコは()は一組と判断して、(のみ検索
カッコが半角なのか、全角なのかは不明なので半角で統一、
 
なので以下のコードはコードとしては、不確実な点が多いです。
 
Option Explicit
 
Sub test()
 
    Dim SCnt1 As Long
    Dim lngRow As Long, lngCol As Long
    Dim LastRow As Long, LastCol As Long
    Dim Temp As String
    Dim ch1 As Long, ch2 As Long
     
    'LastRow = Cells(5, 1).End(xlDown).Row
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    'LastCol = Cells(5, 1).End(xlToRight).Row
    LastCol = Cells(5, Columns.Count).End(xlToLeft).Column
     
    For lngRow = 5 To LastRow
        For lngCol = 1 To LastCol
            Temp = Cells(lngRow, lngCol).Value
            ch1 = Len(Temp)
            ch2 = InStr(Temp, "(")
            If Temp <> "" Then
                If ch1 <> 1 And ch2 = 0 Then
                    SCnt1 = SCnt1 + 1
                End If
            Else
            End If
        Next
    Next
     
    MsgBox SCnt1
End Sub
 :?:

回答
投稿日時: 23/03/05 18:44:04
投稿者: ヘクセル

マクロ実行後に、何と集計数が「0」値でした。
そのままコード引用させていただきましたが「End Sub」の更に下に
Question」の記述がありましたが、これに何か漏れがあるのですか?
ちなみに入れてみましてコードを実行したら"error"になってしまいました

投稿日時: 23/03/05 18:55:47
投稿者: Nubo

    |[A] |[B] |[C] |[D]
 [1]| | | |
 [2]| | | |
 [3]| | | |
 [4]| | | |
 [5]|あ |さ |Z |
 [6]|あいうえお |指すせ(何ぬねの)|ゼット|
 [7]|か | | |
 [8]|かきこ(さし)| | |
 [9]| | | |
  
  
 あなたが提示した上記のシート構成では、エラー無く
 私の環境では、「2」と表示されました。
 (青字だけカウントで「2」で正解ですか?)
  
Windows11 / Office2021
 
>「 Question」の記述がありましたが、これに何か漏れがあるのですか?
 
      ?マークは、書き込みミスなので無視して下さい。
 
>"error"になってしまいました
 
      どこでどんなエラーが出たのか?
      知らせてもらえないとこちらでは何も判りません。
 
 
Option Explicit
 
Sub test()
 
    Dim SCnt1 As Long
    Dim lngRow As Long, lngCol As Long
    Dim LastRow As Long, LastCol As Long
    Dim Temp As String
    Dim ch1 As Long, ch2 As Long
     
    'LastRow = Cells(5, 1).End(xlDown).Row
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    'LastCol = Cells(5, 1).End(xlToRight).Row
    LastCol = Cells(5, Columns.Count).End(xlToLeft).Column
     
    For lngRow = 5 To LastRow
        For lngCol = 1 To LastCol
            Temp = Cells(lngRow, lngCol).Value
            ch1 = Len(Temp)
            ch2 = InStr(Temp, "(")
            If Temp <> "" Then
                If ch1 <> 1 And ch2 = 0 Then
                    SCnt1 = SCnt1 + 1
                End If
            Else
            End If
        Next
    Next
     
    MsgBox SCnt1
End Sub
 

回答
投稿日時: 23/03/05 19:49:29
投稿者: ヘクセル

よく見たら2つとも同じコードで何も変わってないですね
てっきり2つ目のは何か訂正していただけたものだと思っていました
なので2つとも同じ結果で「0」です
    またエラー表示が出た際の記述は無視したら、もちろんerror表示は出なくなりました
--------------------------------------------------------
 ?マークは、書き込みミスなので無視して下さい。
  
>"error"になってしまいました
  
      どこでどんなエラーが出たのか?
      知らせてもらえないとこちらでは何も判りません。
--------------------------------------------------------
 
15:23:10のケースでは「2」と表示されますが ?
 
集計数を出してください!と質問しているのに、なんで「0」や「2」が関係があるのか、何のことやらさっぱりわかりませんです???

投稿日時: 23/03/05 21:21:21
投稿者: Nubo

 
 
コードは標準モジュールにコピペして試していますか ?
 
 
 
「集計数」 とは、
 
青色で着色されたセルの個数を集計するとの意味では無いのですか?
「あいうえお」 と 「ゼット」でTOTAL 2個 ?
 
 
話が噛み合いません。
 問題を解く上で理解が違っているようなので
 今回のケースでは何が正解なのかを明らかにして下さい。
 
 
 
エラーが出たのに記述を無視したら、ERROR表示は無くなるとは?
ERRORが出た時点でそれから先エラーを
 無視してコードを先に進める事はできないはずです。
 無視して先にどうやって進めたの結果、「0」の結果が出るのか想像できません。
(百歩譲ってエラー後に先に進めたとしてその解が正しいわけがないです。)
 
前回も聞きましたが
どこでどんなエラーが出たのか回答が帰ってこないのでは続けられません。
 
 

回答
投稿日時: 23/03/05 22:22:56
投稿者: simple

ちょっと失礼します。
(1)

引用:
集計数を出してください!と質問しているのに、なんで「0」や「2」が関係があるのか、何のことやらさっぱりわかりませんです???

いやいや、0 とか 2 とかは、
テストデータについての集計結果についての話でしょう?
あなたの実際データは回答者にはわからないので、モデルデータで話をするのは、
こうした質問掲示板では一般的に行われる常識的な議論ですよ。
 
早く答えを出せとばかりに、回答のコードをもらうことばかり意識せずに、
互いに同じ土俵で結果を検証するステップをきちんと踏んでください。
お互いに協力して話を進めないといけないでしょう。
 
(2)
そもそもですが、最初のスレッドで、カウントの定義を
引用:
カウントする→()か含まれていないセルで、かつ1文字以上のセル
カウントしない→()か含まれているセルで、かつ1文字のみのセル
とされていますが、
これは正しいのですか?
 
・一文字以上というと一文字も含まれますが、それもカウントするんですか?
・()か含まれているセルで、かつ1文字のみのセル
 そういうものは元々ありえないじゃないですか?
 
また、文字の種類については制約的なことはあるんですか?
改めて明確にしてください。
>1文字とは五十音、漢字、アルファベットが1字のみで一桁の数字は無いです
何か色々書かれているけれど、わかりにくいです。
こうした議論で五十音とかいうのは余り聞きません。曖昧なので。
+=*といった記号などは?
文字の種類は気にせず、Len関数で調べるだけでいいんですね?
 
後戻りにならないよう、念のため確認しました。

回答
投稿日時: 23/03/05 23:52:26
投稿者: ヘクセル

 メッセージ内容を見返すと間違えてました
 ※お詫びして訂正させて頂きます
   [[[カウントの定義]]]
○各列1〜4行目はカウントしない
○カウントする →「()」="括弧は一組と判断"が含まれていないセルでかつ2文字以上のセル
○カウントしない→「()」="括弧は一組と判断"が含まれているセルか又は1文字のみのセル
             1文字は種を問わずLen関数で判断(但し記号種は無し)                       
○A列から最終列まで検索
○どの列のデータも途中行に空白(未入力)行が無く飛ばないで連続して埋まっている

投稿日時: 23/03/06 05:23:43
投稿者: Nubo

 
--- 3/5 23:52:26 のカウント条件の変更見ました。
 
修正された条件でも提示されたシート構成では、
解(集計数)は「あいうえお」 と 「ゼット」でTOTAL2になるのでは無いのですか ?
 
何が正解なのかを明らかにしてほしいのに全く返事が帰ってきません。
 
又、
エラーがどこでどんなエラーが発生したのかも何も依然として返事無く、
しかも前提条件が全く違うように事になってしまいました。
 
自分の伝えたいこと事だけを一歩的に記載するだけで
私が知りたいことの答えが何も帰ってきません。
会話が成り立たない状態ですね。

 
あなたは使えるコードだけが欲しいのでしょうが
私の続けるモチベーションが保てません。
 
以後は、他の人の回答をお待ち下さい。

回答
投稿日時: 23/03/06 10:40:21
投稿者: simple

仕様の記述の修正により、明らかになりました。ご苦労様でした。
 
改めて、Nuboさん提示のコードを、あなたの出されたサンプルに適用した結果について、
お知らせください。
 
なお私も実行してみましたが、個数は2と算出されるように思います。
想定結果と異なるのであれば、どこで異なることになるのか
ステップ実行して確認して頂きたいですね。
 
なお、一応、私も自分なりに作成したものが手元にはありますが、
まずは、上に書いたことを実行して頂くのが順序かと思います。

回答
投稿日時: 23/03/06 11:24:26
投稿者: ヘクセル

simpleさま
さすがシンプル イズ ベストさんです
当方のつたない質問をご理解していただき解釈されコードが無事完成していただいた様にご推察致します
前回の方は、すでに御辞退されたようで今もっての検証は無用かなと思いました
simpleさんがこのまま先決が順序とあくまでも筋を通せというのであれば完成コードのご提示は諦めます
もともとこのコードは、おおよそあとどのくらい残っているか知りたかったわけで、あくまでのエクセルマクロのビタ一文も狂わない正確な数値結果を必要ではなかったのです
安易な気持ちで質問してしまい、こんなにもつれ込むとは想像も付きませんでした
 
前回の方の→「あいうえお」 と 「ゼット」でTOTAL 2個 ? どっからこのような解釈が生まれたか全くこちらが逆に質問したいぐらいでした

回答
投稿日時: 23/03/06 11:37:16
投稿者: simple

引用:
前回の方の→「あいうえお」 と 「ゼット」でTOTAL 2個 ? どっからこのような解釈が生まれたか全くこちらが逆に質問したいぐらいでした

あなたが最初の質問で挙げているケースでは、その二つの文字列だけ青字にされていますよね。
2個ではないとしたら、正解は何なのでしょうか?

回答
投稿日時: 23/03/06 12:57:41
投稿者: simple

再掲します。

引用:
いやいや、0 とか 2 とかは、
テストデータについての集計結果についての話でしょう?
あなたの実際データは回答者にはわからないので、モデルデータで話をするのは、
こうした質問掲示板では一般的に行われる常識的な議論ですよ。

少数のデータ(ただし、ありうるケースは尽くしている)を使って検証する
ということを理解されていないのではないですか?
だから話が噛み合わないのですよ。
あなたもコードを書いて、簡単なデータで確認したり、
部分的に作っていくとき、そうしたサンプルデータを使って順次確認したりしないですか?

回答
投稿日時: 23/03/06 15:43:56
投稿者: simple

結果がゼロということであるなら、テストデータでステップ実行して
なぜカウントされるべきところがカウントされないのか、ご自分で検証してください。
・コピーペイストした先が標準モジュールであれば、今アクティブなシートが対象になります。
  それが本来のものか確認。
・シートモジュールにコピーペイストしたのであれば、アクティブシートに関わらず、
 そのシートが前提になります。
その辺が怪しい気がします。
 
Nuboさんのコードは、あなたが 23/03/06 11:24:26に書かれた仕様に対して十分機能すると思います。
(微修正が必要かもしれませんが)
よく検証してください。
私はこれで失礼させていただきます。

回答
投稿日時: 23/03/06 16:52:10
投稿者: taitani
投稿者のウェブサイトに移動

一応。。。
https://www.moug.net/faq/viewtopic.php?t=82115
 

引用:
投稿者: taitaniさんへ
カウント数が5241986と出ましたが
やっぱり集計数がおかしいと思いませんでしょうか?
ちなみにCOUNTA関数は、選択範囲の空白セルを除いたセルの個数だということでしたら
全列の最下行は、5000行を超える列はないので
=COUNTA(A5:HXP5000)でやると53104と集計されます
なので1文字のみ又は「()」が入力されているセル数を除くと実際にはもっと少なくなるはずなのではないでしょうか?

 
HXP列は→6048列目
データが5000とのことなので、(まぁ、上4行は抜きにして) とりあえず、4000 とします。
6048×4000=24192000 となります。
最高:24192000 (すべてのセルがカウント対象とした場合)
前回; 5241986 (私の前回の VBA) ※カウントが間違っている可能性あり。
 
それを踏まえ、
引用:
○各列1〜4行目はカウントしない
○カウントする →「()」="括弧は一組と判断"が含まれていないセルでかつ2文字以上のセル
○カウントしない→「()」="括弧は一組と判断"が含まれているセルか又は1文字のみのセル
             1文字は種を問わずLen関数で判断(但し記号種は無し)                       
○A列から最終列まで検索
○どの列のデータも途中行に空白(未入力)行が無く飛ばないで連続して埋まっている

 
引用:
=COUNTA(A5:HXP5000)でやると53104と集計されます

 
空白行?空白セル?が無いとしたら、それもおかしくないですか???

投稿日時: 23/03/08 09:31:02
投稿者: Nubo

simpleさんも既に退席されました。
 
taitaniの質問にも回答がない状態なので
このスレを立ち上げた当事者として
結局、何が正解かも何も判明しませんでしたが
解決してないけど解決として後処理しますね。