[[20200623003453]] 『検索システムおよびシート検索』(ピエトロ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『検索システムおよびシート検索』(ピエトロ)

エクセルで実現可能なのかわからず、
実現可能なのかとプログラムとなると
どのように書いていけばよいか、教えていただけないでしょうか。
お願いいたします。

シート 1

 ___C___  ___D___
 検索名▼ 検索ボタン

シート 2(新規入力)

 ___C___  ___D___
 ビル名 入力ボタン

シート 3

  ___A____ __B____
管理番号   ビル名
1     A
2     B
3     C

シート A
シート B
シート C

***********

シート1で
セルにビル名又は▼を押して
A又はB又はCのいづれかを選択して検索ボタンをクリックすると

シートA又はB又はCへ飛ぶ

一方、シート2で新規に入力されたビル名を入力ボタンで、
シート3に順番に登録されていく。
そしてシート〇←ビル名を作成されていく。

シート2で新規を入力後、シート1の検索で
先ほど、入力したビル名が検索でき、検索ボタンで
シート〇へ飛んでいく。

**********

VLOOKUP関数でシートで飛ぶことはできると思うのですが
新規で、順番に蓄積されていくビル名を
VLOOKUP関数で補うことはできるのでしょうか。

思いつかず、困っております。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


特定のシートにジャンプするには
Application.Gotoメソッドを使うとよいと思います。
できているところまで示されると、皆さんからコメントが入ると思います。
(γ) 2020/06/23(火) 08:48

Dim items() As Variant

items = WorksheetFunction.Transpose(Worksheet3.Range("B5:B9").Value)

Range("B2").Validation. _

     Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:=Join(items, ",") 

シート3からシート1へ検索データを引っ張るプログラムをまずは考えています。
(ピエトロ) 2020/06/24(水) 07:57


こんばんは。
(γ)さんありがとうござます。

現在までに考えた内容を記載いたします。
まだまだ、エラーが解決できず、困っております。
お知恵をお借りできないでしょうか

Sub Sample_Goto()

Dim items() As Variant

items = WorksheetFunction.Transpose(Worksheet3.Range("B5:B9").Value) 'シート3のB列からビルAを選択

Range("B2").Validation._Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:=Join(items, ",")

    Application.Goto Worksheets("SheetA").Range("C3"), True 'ビルAが記載されているシートAへ飛ぶ

End Sub

(ピエトロ) 2020/06/26(金) 00:17


やりたいことがピンと来てませんが、
■1
いらないアンダースコアがついてるので構文エラーになってませんか?
 Range("B2").Validation._Add
      ↓
 Range("B2").Validation.Add

さらに、事前に入力規則が設定されている可能性はないのでしょうか?
https://www.moug.net/tech/exvba/0050121.html

■2
また、「Worksheet3」とは何を想定してるのですか?

(もこな2 ) 2020/06/26(金) 01:06


 Sub Sample_Goto()のなかに
 ・リストを使った入力規則の設定 と
 ・Application.Gotoを使ったジャンプが
 同時に盛り込まれていますが、
 その二つは別の話ですよね。ひとつのプロシージャにする意図がよくわかりません。

 それと、
 Application.Goto Worksheets("SheetA").Range("C3"), True 
 については、
   s = シート名をいれたセルの値
   Application.Goto Worksheets(s).Range("C3"), True 
 のような感じになるのではないですか?

 取り急ぎ。

(γ) 2020/06/26(金) 07:28


こんにちは。
まずは要件をまとめることから始めましょう。

>シート1で
>セルにビル名又は▼を押して
>A又はB又はCのいづれかを選択して検索ボタンをクリックすると
>シートA又はB又はCへ飛ぶ

>一方、シート2で新規に入力されたビル名を入力ボタンで、
>シート3に順番に登録されていく。
>そしてシート〇←ビル名を作成されていく。

>シート2で新規を入力後、シート1の検索で
>先ほど、入力したビル名が検索でき、検索ボタンで
>シート〇へ飛んでいく。

これを整理すると
1a.シート1の「?1」セルに入力規則(リスト)を設定する。
  1a1.リストはシート3の「?2」の範囲の値にする。
1b.シート1に「検索」ボタンを置く。
  このボタンを押すと、1aで決めたシートに移動する。
2a.シート2の「?3」セルに”ビル名”を入力する。
2b.シート2に「入力」ボタンを置く。
  このボタンを押すと、
  2b1.シート3の「??」セルに2aで入力した値を入力する。
  2b2.シートを新規作成し、シート名を2aで入力した値にする。

このような感じでしょうか。

(子つばめ) 2020/06/26(金) 16:59


いくつか不明なところがありますね。
 A.シート1の入力規則を設定するセル
 B.シート2のビル名を入力するセル
 C.シート3の入力規則のリスト対象になるセル

この3つです。
Aについては、最初に示してくれたものではシート1のC列になっていますが、
その後示してくれたコードではB2セルになっています。
これをはっきりセル番地で決めてもらえるとうれしいです。
Bについては、最初に示してくれたものではシート2のC列になっています。
これも行を含めたセル番地で教えてください。
Cについては、コードではWorksheet3のB5:B9となっています。
シート3のB列の5行目以降という理解でいいですか?

仮に、

 Aはシート1のB2セル
 Bはシート2のC1セル
 Cはシート3のB5セルから下(その下に別の表はないもの)

として、続けたいと思います。
(子つばめ) 2020/06/26(金) 17:14


>もこな2さま

ご回答ありがとうございます。

>Range("B2").Validation.Addです。

>事前に指定はしておりません。

>Worksheet3
シート3の間違いです。
すいません。

>γさま
イメージは、その通りです。

>子つばめさま
ご回答ありがとうございます。

>1a1.リストはシート3の「?2」の範囲の値にする。

  「B2」以降を検索します。

>2a.シート2の「?3」セルに”ビル名”を入力する。
 「C3」入力させます。

>2b1.シート3の「??」セルに2aで入力した値を入力する。
 シート3「B3」以降にリスト化される。

>Aについては、最初に示してくれたものではシート1のC列になっていますが、
>その後示してくれたコードではB2セルになっています。
>これをはっきりセル番地で決めてもらえるとうれしいです。
 シート3のB2列です。

>Bについては、最初に示してくれたものではシート2のC列になっています。
>これも行を含めたセル番地で教えてください。

 シート2「C3」入力させます

>Cについては、コードではWorksheet3のB5:B9となっています。
>シート3のB列の5行目以降という理解でいいですか?

シート3は、B列のの3行目からとなります。

(ピエトロ) 2020/06/28(日) 19:22


Sub Sample_Goto()

Dim items() As Variant

items = WorksheetFunction.Transpose(シート3.Range("B3:B2000").Value)
'シート3のB列からビルAを選択

Range("B2").Add Type:=xList, AlertStyle:=xStop, Formula1:=Join(items, ",")

Application.Goto Worksheets("SheetA").Range("B2"), True 'ビルAが記載されているシートAへ飛ぶ
Application.Goto Worksheets("SheetB").Range("B2"), True 'ビルBが記載されているシートAへ飛ぶ
Application.Goto Worksheets("SheetC").Range("B2"), True 'ビルCが記載されているシートAへ飛ぶ
'以降、続く

End Sub

(ピエトロ) 2020/06/28(日) 19:29


すいません
>Application.Goto Worksheets("SheetA").Range("B2"), True 'ビルAが記載されているシートAへ飛ぶ
>Application.Goto Worksheets("SheetB").Range("B2"), True 'ビルBが記載されているシートBへ飛ぶ
>Application.Goto Worksheets("SheetC").Range("B2"), True 'ビルCが記載されているシートCへ飛ぶ

の間違いです。

(ピエトロ) 2020/06/28(日) 20:05


Private Sub シート 1_Activate()
CommandButton1_Click()
Dim my_sheet As Worksheet
Dim shname

For Each my_sheet In Worksheets
シート 3.AddItem (my_sheet.Name)
Next my_sheet

Private Sub シート 3_Change()
Worksheets(シート 3.Value).Select
Unload Me

shname = Userシート 1.シート 3.Value
Sheets(shname).Activate

End Sub

他サイトで、似たモノを拾ってきたのですが
わかりません。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1057051160?__ysp=RVhDRUzjgafjgIHjgrfjg7zjg4jlkI3jgpLjg6rjgrnjg4g%3D

(ピエトロ) 2020/06/28(日) 23:41


■3
見づらいので「2020/06/28(日) 19:29」に提示されたものを整理すると↓になりますよね?
    Sub Sample_Goto()

        '★1
        Range("B2").Add _
            Type:=xList, _
            AlertStyle:=xStop, _
            Formula1:=Join(WorksheetFunction.Transpose(シート3.Range("B3:B2000").Value), ",")

        '★2
        Application.Goto Worksheets("SheetA").Range("B2"), True 'ビルAが記載されているシートAへ飛ぶ
        Application.Goto Worksheets("SheetB").Range("B2"), True 'ビルBが記載されているシートAへ飛ぶ
        Application.Goto Worksheets("SheetC").Range("B2"), True 'ビルCが記載されているシートAへ飛ぶ

        '以降、続く
    End Sub

■3−1
★1の部分について、同じことを確認しますが「シート3」とは何を想定しているのですか?

■3-2
★2の部分、無条件で飛んでよいのですか?
どこかのセルの値で条件分岐するんじゃないのですか?

■4
>他サイトで、似たモノを拾ってきたのですが
意味も分からず適当に変えてもダメです。
今回はほぼ参考にならないでしょう。(changeイベントくらいは関係あるかもですが)

(もこな2 ) 2020/06/29(月) 05:58


>もこな2さま

ありがとございます。
■3−1
★1の部分について、同じことを確認しますが「シート3」とは何を想定しているのですか?

全てのデータを集約しているシートとなります。

  ___A____ __B____
管理番号   ビル名
1     A
2     B
3     C
4     D
以下続く

シート2で、新規で取得したビル名を入力すると、シート3に追加で登録されていきます。
これをずっと続けます。

シート1は、シート3で登録しているビル名を検索するシートです。
そして、シート1のビル名を検索し、検索ボタンを押すとシートAに飛びまず。

■3-2
★2の部分、無条件で飛んでよいのですか?
どこかのセルの値で条件分岐するんじゃないのですか?

シート3で登録しているビル名を検索するシート1からビル名を選択し。シート3へ飛びまず。

■4
わかりました。
すいません。
(ピエトロ) 2020/06/30(火) 06:06


■5
>全てのデータを集約しているシートとなります。
えーっとそういうことじゃないです。

 シート3.Range("B3:B2000")
      ↓
 Worksheets("シート3").Range("B3:B2000")
  とか、別途
 Dim シート3 As Worksheet
 Set シート3 = Worksheets("シート3")

とか必要じゃないの?って言ってます。

■7
>シート3で登録しているビル名を検索するシート1からビル名を選択し。シート3へ飛びまず。
提示されたコードだと"無条件"で順番に飛びますよね?それでいいんですか?
例えば、↓のように条件分岐するんじゃないですか?と言ってます。

    Select Case Worksheets("シート3").Range("A1").Value
        Case Is = "ビルA"
            Application.Goto Worksheets("SheetA").Range("B2"), True

        Case Is = "ビルB"
            Application.Goto Worksheets("SheetB").Range("B2"), True

        Case Is = "ビルC"
            Application.Goto Worksheets("SheetC").Range("B2"), True
    End Select

(もこな2 ) 2020/06/30(火) 07:08


>もこな2さま

お返事ありがとうございます。
■5
おっしゃるとおりです。

■7
おっしゃるとおりです。
シート1で選択された、ビル名を検索して、検索ビル名を選び選択ボタンを押すと〜という条件ですので

ビル名とシート名の条件提示が必要と考えられます。

(ピエトロ) 2020/07/01(水) 05:53


ちょっと話が見えなくなりました、
>おっしゃるとおりです。
と仰るなら、そのようにされたらどうですか?

また、すでに指摘があることですが、アクティブシートのB2セルの入力規則をマクロで設定することと、何らかの条件(おそらく、アクティブシートのB2セルの値)でシートを切り替えることは、別動作ではないですか?

(もこな2 ) 2020/07/01(水) 07:39


もこな2さま
お返事ありがとうございます。

別動作と言うのは、別のプログラムという意味でしょうか?

検索のプログラムとシートへ飛ぶプログラムは別で作成した方が良いということでしょうか。

検索した言葉をシートへ飛ばすのは、一連の流れだと考えて考えて考えています
(ピエトロ) 2020/07/01(水) 22:19


私が勘違いしてるだけかもしれませんが↓のようにしたいのでは?
 (1) シート1のB2セルに入力規則を設定する
 (2) ユーザーがシート1のB2セルの値を入力規則をつかって変更する
 (3) シート1のB2セルの値が変化したら、セルの値をチェックして対応するシートをアクティブにする

この場合、(1)と(3)の動作は一連じゃないですよね?
(一連の操作にしてしまうと、(2)の操作ができないので。)

(もこな2 ) 2020/07/02(木) 07:38


追加で。

>>さらに、事前に入力規則が設定されている可能性はないのでしょうか?
>>https://www.moug.net/tech/exvba/0050121.html
>事前に指定はしておりません。

私が考えているとおりであれば(1)について、2回目以降は"前回設定した"入力規則がありませんか?
したがって、やはり入力規則のリストを"再設定"するときにいったんクリアしないとダメな気がするのですが・・・

(もこな2 ) 2020/07/02(木) 08:12


>もこな2さま
ご回答ありがとうございます。

>この場合、(1)と(3)の動作は一連じゃないですよね?
そうです。
おっしゃるとおりのプログラムを組みたいのです。

今まで、ご指摘頂いた内容を整理いたしますと

Sub Sample_Goto()

'★1

   Range("B2").Add _
      Type:=xList, _
   AlertStyle:=xStop, _
    Formula1:=Join(WorksheetFunction.Transpose(Worksheets("シート3").Range("B3:B2000").Value), ",")

    With Range("D2:D10").Validation
        .Delete
        .Add Type:=xlValidateList, _
             Operator:=xlEqual, _
             Formula1:="=シート3!$B$3:$B$2000" 
    End With

 '★2
   Application.Goto Worksheets("SheetA").Range("B2"), True 'ビルAが記載されているシートAへ飛ぶ
   Application.Goto Worksheets("SheetB").Range("B2"), True 'ビルBが記載されているシートBへ飛ぶ
   Application.Goto Worksheets("SheetC").Range("B2"), True 'ビルCが記載されているシートCへ飛ぶ

 >順次、シート2で作成されていく、ビル〇←名前が更新されていくを情報を読みだすプログラム

    End Sub

 このようなプログラムの書き方でしょうか。

(ピエトロ) 2020/07/03(金) 06:14


>このようなプログラムの書き方でしょうか。
聞くより試してみては?そのほうが違うってわかるとおもいますよ。

とりあえず、気になるところを挙げていくと
【気になる点1】
★1の部分について
提示されたものをそのまま整理しただけで、テストしていなかったので改めてチェックしてみると、いろいろおかしな点がありますね。

 (1) Validation が抜けている
 (2) Type:=xList ←謎の引数を指定している
 (3) AlertStyle:=xStop ←謎の引数を指定している

【気になる点2】
追加した部分について、参考に提示したMougを真似したようなので構文的な誤りはないようです。
ただ、それ必要なんですか?

【気になる点3】
★2の部分について
前回指摘しているように、”無条件で”シートA、シートB、シートCの順にアクティブシートが切り替わるようになっています。

【気になる点4】
全体について、すでに指摘しているように一連の動作(同じプロシージャ)ですることではないとおもいます。

(もこな2 ) 2020/07/03(金) 08:07


 横から失礼します。
 私が以前にコメントしてから、皆さんからご指摘を頂いているのに、余り進んでいませんね。

 既に適切なコメントを頂いているのに、伝わっていない感じです。

 喩えて言えばこういうことです。
 Sub test()
     Call 誕生日用のケーキを買う
     Call (目が覚めたので)顔を洗い、歯磨きする
 End Sub
 というような処理になっていませんか、ということです。
 生活するということなら、ひとつのくくりになるかもしれませんが、
 それは同じタイミングで実施しないといけないことですか?
 年一回のことと毎日のことを、同じ命令に入れてあなたは実行しますか?

 「入力規則の設定」とは、
 つまりは、「複数の選択候補を設定する」ということです。
 選択肢の設定は一度すれば済むことで、
 ジャンプの都度する必要はないでしょう?

 ジャンプ処理と一緒にすべきは、
 ジャンプに先立って、
 「どの選択肢が選択されているかを知ること」ではないですか?

 (なお、その都度、選択肢を最新のもににするという考えもあるかもしれませんが、
   少なくともジャンプする処理の中で選択肢を最新化しても、
   すでにユーザーは、選択をしてしまった後なので意味がありません。)

 筋道を立てて進めてください。
 適当にコード(プログラム)を並べればよいというものでもないですよ。

 プログラムは二つに分けては、どうですか?
 (1)Sheet2にある新規ビルのユーザー入力のあとで、
   「ビル追加ボタン」押し下げで実行するコード。
    処理内容:  
    ・新規ビルをSheet3の一覧表に反映する。
    ・そのビルに対応するシートを作成する。
    ・Sheet1にある、入力規則(リスト)を更新する(追加分を反映する)。
 (2)入力規則のリストから選択したあとで、「ジャンプボタン」押し下げで実行するコード   
    処理内容:
    ・入力規則のあるセルで選択されているビルに対応するシートにジャンプする。

(γ) 2020/07/03(金) 08:19


 Sub Sample()	'ここから

 End Sub        'ここまで

これが、「一連の流れ」です。
きっと「プロシージャ」「モジュール」というような用語を使っても頭が混乱してしまいますよね。
まずこんなところから試してください。

 Sub Sample01()
  Application.Goto Worksheets("SheetA").Range("B2"), True 'シートAのB2セルへ飛ぶ
  Application.Goto Worksheets("SheetB").Range("B2"), True 'シートBのB2セルへ飛ぶ
  Application.Goto Worksheets("SheetC").Range("B2"), True 'シートCのB2セルへ飛ぶ
 End Sub

これは、
「SheetAのB2に飛ぶ」
「SheetBのB2に飛ぶ」
「SheetCのB2に飛ぶ」
を一気に実行します。

結果として、最後に実行した「SheetCのB2に飛ぶ」をしたように見えます。
「SheetAのB2に飛ぶ」と「SheetBのB2に飛ぶ」は実行した意味がなくなっています。

 Sub SampleA()
  Application.Goto Worksheets("SheetA").Range("B2"), True 'シートAのB2セルへ飛ぶ
 End Sub

これは「SheetAのB2に飛ぶ」を実行します。

 Sub SampleB()
  Application.Goto Worksheets("SheetB").Range("B2"), True 'シートBのB2セルへ飛ぶ
 End Sub

これは「SheetBのB2に飛ぶ」を実行します。

 Sub SampleC()
  Application.Goto Worksheets("SheetC").Range("B2"), True 'シートCのB2セルへ飛ぶ
 End Sub

これは「SheetCのB2に飛ぶ」を実行します。

一連の流れにしないことで、個々の命令が有効に働きます。

(参考)
【ゼロからわかるVBA入門】モジュールとプロシージャ
https://tech-paclab.com/module-procedur/
(FunctionだのPropertyだのFormだのClassだの書かれている部分は読み飛ばしてください。)
(子つばめ) 2020/07/03(金) 09:14


γさんからコメントを頂いていますが、私はこういう感じかなとおもってました。

プログラム1

 もしも、シート3のB2〜B2000で値の更新があったら
     シート1のB2セルの入力規則のリストを設定しなおす
 もしもの話はおしまい

プログラム2

 もしも、シート1のB2セルの値が更新されたら
     対応するシートをアクティブにする
 もしもの話はおしまい

命令する用語が分からない場合は、↑のようにやるべき処理の流れをとりあえず日本語で書いてみて、それから、マクロの記録等で命令するには何と書けばよいかを調べてみるというアプローチも有効だとおもいます。

(もこな2 ) 2020/07/03(金) 09:55


>もこな2
>γさま
>子つばめさま

ありがとうございます。
プログラム内容を整理します。

プログラム1

シート 1 でシート 3のB2列以降に記載されているビル名を選択し、
検索ボタンを押して、シート〇【ビル名】へ飛ぶ

プログラム2

シート 2で入力した新ビル名データをシート3に記入していく。
同時に、新しくシート【ビル名】を作成する。
シート1で新たに追加されたビル名を検索できるようにプログラムを書き換える

ということで考えていきます。

(ピエトロ) 2020/07/05(日) 10:40


プログラム1

Private Sub ComboBox1_Click()

s = Worksheets("シート3").Range("B3:B2000")

Application.Goto Worksheets(s).Range("C3"), True

End Sub

プログラム2
Sub 新規入力()

Dim i

For i = 3 To Sheets("シート3").Range("B100000").End(xlUp).Row + 1

    If Sheets("シート3").Range("B" & i).Value = "" Then

        Sheets("シート3").Range("B" & i).Value = Sheets("シート2").Range("C2").Value

        Exit For

    End If    

Next

    Dim Bmax
    Bmax = Worksheets("シート3").Range("B65536").End(xlUp).Row  

    Dim a, b
    Dim data    

    For a = 3 To Bmax

            If data <> Worksheets("シート3").Range("B" & a).Value Then
            data = Worksheets("シート3").Range("B" & a).Value
            Worksheets("シート2").Copy After:=Worksheets("シート3")
            ActiveSheet.Name = data
            b = 2
        End If
    Next
End Sub

(ピエトロ) 2020/07/05(日) 17:21


■8
2020/07/05(日) 17:21 に提示されたコードについて、自己検証してみましたか?
どのモジュールに記述しているか知りませんが「ComboBox1_Click」で正しいのですか?

■9
「■8」とも関連しますが、自己検証したなら↓は2次元配列が格納されるから、

 s = Worksheets("シート3").Range("B3:B2000")

↓で型が一致しないというエラーになりませんでしたか?

 Application.Goto Worksheets(s).Range("C3"), True

■10
インデントがついておらず、見づらかったので整理してみるとこんな感じですかね。

    Sub 新規入力()
        Dim i As Long
        Dim 最終行 As Long

        With Sheets("シート3")
            最終行 = .Range("B65536").End(xlUp).Row

            For i = 3 To 最終行 + 1
                If .Range("B" & i).Value = "" Then
                    Sheets("シート3").Range("B" & i).Value = Sheets("シート2").Range("C2").Value
                    Exit For
                End If
            Next

            For i = 3 To 最終行
                If .Range("B" & i).Value <> "" Then
                    Worksheets("シート2").Copy After:=Worksheets("シート3")
                    ActiveSheet.Name = .Range("B" & i).Value
                End If
            Next
        End With
    End Sub

構文的な問題はないかもしれませんが、そもそも論でループ処理は本当に必要なのかちょっと疑問です。
また、今まで聞いていたことと全く違うことを始めましたけど、入力規則とかはどうでもよくなったのでしょうか?

(もこな2 ) 2020/07/05(日) 18:43


>もこな2さま

ご回答ありがとうございます。

入力規制のやり方をネットで調べておりまして、
再度、プログラムを組み直しました。

プログラム1

Sub validation_ComboBox1_Click()

'今設定されている入力規則を削除しておく
Sheets("シート1").Range("C2").Validation.Delete

'入力規則を設定
Sheets("シート1").Range("C2").Validation.Add Type:=xlValidateList, Formula1:="=シート3!$B$3:$B$2000"

End Sub

プログラム2

順次、新しいデータが入力され、シートが続々と作成されていきますので、
ループ処理が必要かと考えておりました。

ループ処理を行わず、新規入力毎に、シートを追加していく方法はありますでしょうか。
(ピエトロ) 2020/07/07(火) 11:57


■11
相変わらずインデントがついてないので見づらいですが、プログラム1を整理するとこうですね。
    Sub プログラム1を整理()
        With Sheets("シート1").Range("C2").Validation
            .Delete
            .Add Type:=xlValidateList, Formula1:="=シート3!$B$3:$B$2000"
        End With
    End Sub

で、何をやっているかご自身で理解はできているのでしょうか?
構文的な誤りは無いようにおもいますが、提示された内容どおりであれば一度やれば十分でしょうし、わざわざマクロでやる必要性も感じないです。

■12
プログラム2について、繰り返しになりますが、やるべき処理の流れをとりあえず日本語で書いてみて組み立ててから、エクセル君に命令する文章に書きなおすというアプローチも有効だとおもいます。
https://vbae.odyssey-com.co.jp/column/no7_1.html

(もこな2 ) 2020/07/07(火) 13:17


ざっと見て、やろうとしていることはこんなことではありませんか。

'プログラム1-1
'シート 1 でシート 3のB2列以降に記載されているビル名を選択し、
Sub シート1でシート3のB2以降に記載されているビル名を選択できるようにする()

    '今設定されている入力規則を削除しておく
    Sheets("シート1").Range("C2").Validation.Delete
    '入力規則を設定
    Sheets("シート1").Range("C2").Validation.Add Type:=xlValidateList, Formula1:="=シート3!$B$3:$B$2000"
End Sub

'プログラム1-2
'検索ボタンを押して、シート〇【ビル名】へ飛ぶ
Sub 検索ボタンを押す()

    '※sの値が設定されていないのでエラーになります

    'ワークシート「s」のC3セルへ飛ぶ
    Application.Goto Worksheets(s).Range("C3"), True
End Sub

'プログラム2
'シート2で入力した新ビル名データをシート3に記入していく。
'同時に新しくシート【ビル名】を作成する。
'シート1で新たに追加されたビル名を検索できるようにプログラムを書き換える
Sub シート2で入力した新ビル名データをシート3に記入しビル名シートを作成、シート1で新たに追加されたビル名を検索できるようにプログラムを書き換える()

    'シート2で入力した新ビル名データをシート3に記入
    Dim i
    For i = 3 To Sheets("シート3").Range("B100000").End(xlUp).Row + 1
        If Sheets("シート3").Range("B" & i).Value = "" Then
            Sheets("シート3").Range("B" & i).Value = Sheets("シート2").Range("C2").Value
            Exit For
        End If
    Next

    '新たにビル名シートを作成
    Dim Bmax
    Bmax = Worksheets("シート3").Range("B65536").End(xlUp).Row		'変数Bmaxにシート3のB65536セルから直上のデータが入力されているセルの行を代入
    Dim a, b
    Dim data
    For a = 3 To Bmax							'3行目からBmax行まで繰り返す
        If data <> Worksheets("シート3").Range("B" & a).Value Then	'変数dataの値がシート3B列a行の値と異なる場合
            data = Worksheets("シート3").Range("B" & a).Value		'変数dataにシート3B列a行の値を代入
            Worksheets("シート2").Copy After:=Worksheets("シート3")	'シート2をコピーしてシート3の次に挿入
            ActiveSheet.Name = data					'アクティブシートの名前を変数dataの値にする
            b = 2							'変数bに2を代入(これは何のための値ですか?)
        End If
    Next

    '新たに追加されたビル名を検索できるようする
    Call シート1でシート3のB2列以降に記載されているビル名を選択できるようにする

End Sub

※上記は内容の良し悪しについては検討せず列挙しています

>順次、新しいデータが入力され、シートが続々と作成されていきます
きっとシート2に入力1回ごとに作成されるシートも1つだと思いますのでループ処理はいらないと思います。
もし複数のシートを作成する場合でも、まず1つ作ることから始めた方が良いと思います。
最後の行を探すのならEnd(xlUp)が使えているのでそれで十分ではないでしょうか。

また、入力規則の数式も「=シート3!$B$3:$B$2000」で固定なら、プログラム2の最後で毎回入力規則を変更する意味はないと思います。

「新たにビル名シートを作成」については、変数dataの値に着目してステップ実行してみてください。
ループするごとに変数dataにはB列の一つ上の行の値が代入され、一つ下の行の値と比べていることがわかりますか。
そしてそのたびに新しいシートを追加するため、
マクロを一度実行するごとにB列の値の分だけ大量のシートが生まれるコードになってしまっています。

まずこのあたりを直してみてください。
(しょくぱん) 2020/07/07(火) 14:27


>もこな2さま

ご回答ありがとうございます。

■11
>構文的な誤りは無いようにおもいますが、提示された内容どおりであれば一度やれば十分でしょうし、わざわざマクロでやる必要性も感じないです。

新規入力にて、次次に更新されていきますので、
マクロで管理しなければと考えておりました。
マクロでやる必要がないとは、どのように考えられておられますか。

■12

構文については、
>2020/07/05(日) 10:40
に記載して、進めておりました。

>しょくぱんさま

ご回答ありがとうございます。
>ループするごとに変数dataにはB列の一つ上の行の値が代入され、一つ下の行の値と比べていることがわかりますか。

すいません。数値の追い方がわかっておらず、チェク方法がわからずにおります。
教えて頂けないでしょうか。

(ピエトロ) 2020/07/10(金) 14:33


都合がいいとこだけ拾われても困るけど・・・

>新規入力にて、次次に更新されていきますので、
>マクロで管理しなければと考えておりました。
>マクロでやる必要がないとは、どのように考えられておられますか。

 ぷろぐらむ1
 「シート1」シートの「C2」セルの入力規則を
    クリアして
  リストの範囲をシート3!$B$3:$B$2000 に設定する

↑を何度も実行することと、↓を1回やることは同じじゃありません?

 手作業で「シート1」シートの「C2」セルの入力規則の設定画面で
 リストを選んで、範囲をシート3!$B$3:$B$2000 にする

何度言ったか覚えてませんが、コードで悩むより必要な作業を洗い出して整理してから、マクロ化を考えてみてはどうですか?

(もこな2 ) 2020/07/10(金) 16:54


>すいません。数値の追い方がわかっておらず、チェク方法がわからずにおります。
>教えて頂けないでしょうか。

マクロのエディタ(VBE)の画面で、メニューから「表示」→「ローカルウィンドウ」を開いてください。
参考サイト
https://excel-ubara.com/excelvba4/EXCEL266.html
(しょくぱん) 2020/07/15(水) 08:28


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.