Excel (VBA)

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

 
(指定なし : 指定なし)
各シートのA列にある”雇用保険”と書いたセルの行を求めたいのですが。。
投稿日時: 17/06/09 07:59:49
投稿者: J-south

どなたかご教授お願いします。
 
集計シート以外の各シートのA列に”雇用保険”と書いたセルがあります。
100枚以上のシートですが、このセルが全てA列の、18行目、27行目、28行目にバラバラにあります。
 
この行を各シートのE1に書き込もうと思いましたが、全シート同じ数字が出てしまいます。
根本的に間違っているのでしょうが、どなたか解決策を教えて頂きたいです。
 
よろしくお願いします。
。m(_ _)m。
 
なお、最終的には、18行目のブックと3つにに分けるのが目的です。
 
---------------------------------------
Sub 各シート雇用保険行をE1に記入()
 
Dim sh As Worksheet
Dim x As Long
   
   For Each sh In Worksheets
 
         If sh.Name <> "集計" Then
         
          x = Application.Match("雇用保険", Columns(1).Cells, 0)
           
         sh.Cells(1, 5).Value = x
          
            
        End If
         
     Next
          
End Sub

回答
投稿日時: 17/06/09 11:58:05
投稿者: Suzu

引用:
集計シート以外の各シートのA列に”雇用保険”と書いたセルがあります。
100枚以上のシートですが、このセルが全てA列の、18行目、27行目、28行目にバラバラにあります。

 
だとして、E1 に どのように表示したいのですか?
 
A列に 「雇用保険」が記入されているせるが ひとつ(以上)あり
その「雇用保険」と表示されている 行数 を 同じワークシートの E1 に書き込みたい?
 
 2つめ以降があったらどうする?
 
 
少なくとも
x = Application.Match("雇用保険", Columns(1).Cells, 0)
                                  ^^^^^^^^^^
 
この記載の場合、アクティブシートの A列が検索対象となってますので
 同じ結果しか出ないのは当たり前です。

投稿日時: 17/06/10 04:40:43
投稿者: J-south

Suzu 様
 
おはようございます。
 
>だとして、E1 に どのように表示したいのですか?
その「雇用保険」と表示されている 行数 を 同じワークシートの E1 に書き込みたいのです。
 
 
 
>2つめ以降があったらどうする?
考えていませんでした。
二つ目があったらE2に行数を記入し、三つめがあったら同じくE2に”_”でつないで記入できたら都合がいいです。
 
 
>この記載の場合、アクティブシートの A列が検索対象となってますので
   For Each sh In Worksheets
         If sh.Name <> "集計" Then
こうしているので、各シートで計算するとお思いました。
 
 
>同じ結果しか出ないのは当たり前です。
何分初心者です。
そこがわからないので質問しております。
 
ご教授いただけば幸いです。
よろしくお願いします。

回答
投稿日時: 17/06/10 06:06:34
投稿者: simple

横から失礼します。
 
もし、以下のように書いてあれば話はちがってきます。

    For Each sh In Worksheets
        sh.Select    ' ← ◆ ここに注目
        If sh.Name <> "集計" Then
            x = Application.Match("雇用保険", Columns(1).Cells, 0)
            sh.Cells(1, 5).Value = x
        End If
    Next
# これはこう書くべきということではなく、こうした処理が
# 行われると暗黙のうちに前提としているのではないか、という指摘です。
 
各シートの処理の繰り返しを意味する
For Each sh In Worksheets
    '処理
Next
では、それぞれのシートをアクティブにする動作は含みません。
そのことで、画面更新の負荷もなくなり、処理時間の短縮が図られます。
 
初心のころは、シートをSelectする処理を書きがちですが、
慣れてくると、シートやセルを選択する処理は殆ど書かなくなります。
そういう書き方でも想定外の結果にならないような工夫が必要です。
今回の例であれば、
    x = Application.Match("雇用保険", sh.Columns(1).Cells, 0)
と書くのが正解です。

投稿日時: 17/06/10 07:08:13
投稿者: J-south

simple様
 
ありがとうございました。
 
なるほど、分かりました。
 

引用:

  For Each sh In Worksheets
        sh.Select ' ← ◆ ここに注目
        If sh.Name <> "集計" Then

 
引用:

   x = Application.Match("雇用保険", sh.Columns(1).Cells, 0)

 
 
この「sh.」に関する使い方よく分かりました。
 
とても助かりました。
ありがとうございます!
 
めげずにマクロをもっとやります。
 Very Happy