[[20110618163013]] 『InputBoxにて一度指定した日付を別シートでも選択』(yottsun) ページの最後に飛ぶ

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

 

『InputBoxにて一度指定した日付を別シートでも選択する』(yottsun)

excel2007のVBAについて教えてください。

複数のワークシートにそれぞれ縦列にて日付のカレンダーが並んでいます。
複数のワークシートのカレンダーは、すべて同じものです。
」(6月であれば、すべてのワークシートは6月のもの)

経理に使用するものを作成中なのですが、
便宜上各項目ごとにワークシートを分けています。
入力を始める際にInputBoxにて日付を指定していますが、
今現在は、ワークシートを切り変える度に日付を指定しなければなりません。

始めに指定した日付をワークシートを変更した際も常に同じ日付を指定したいのですが、
どうしたらよいでしょうか。

わかりにくいかも質問しれませんが、宜しくお願い致します。


 コードはシートモジュールに書いてあるのかな?
 ということを前提に、いちばんラクチンな方法は、標準モジュールの宣言部分(モジュールの先頭)に
 Public myDate as Date (変数名は任意、データ型は適切なものにしてね)を記述。
 1つのシートモジュールで myDate = xxxxxxxxx としておけば 別のシートで myDate を参照できる。
 Public変数は、マクロの「強度」という面で問題はあるけど、まぁ、これで。

 ★ただし、もし、あるシートで操作して日付をセットする前に、別のシートを選んで処理すると
   変数myDateには何も入っていないので、そこは注意してね。

 ぶらっと立ち寄り

レスありがとうございます。
試してみたのですが、あまり知識がないもので、うまくいきませんでした。
下記は、フォームに記述しているものです。
イメージとしましては、「入荷」作業を行った際に、実績を入力したいのですが、
そのためのフォームを作成しまして、その日の日付に入力を行いたいと考えております。
課金対象は、入荷作業のみではなく、それに伴い検品等ありますので、別シートに同じく日付と
実績を入力する表を設けております。
シートを選ぶ度に日付を指定するのが面倒なので、始めに選択した日付を常に選ぶようなものを作成したく思っております。
宜しくお願い致します。

Private Sub 入荷_Click()

Dim mydate As String
Dim Foundcell As Range

Sheets("入荷").Activate

Set Foundcell = Range("A:A").Find(what:=mydate, LookIn:=xlValues, lookat:=xlWhole)

If Foundcell Is Nothing Then
MsgBox "見つかりません。入力した日付又は、表の日付を確認して下さい。"
Exit Sub

ElseIf mydate = "" Then
MsgBox "キャンセルします。"
Exit Sub

Else
Foundcell.Select

End If

入荷メニュー.Show

End Sub


 あぁ、ユーザーフォーム。本題とははなれるけど、ユーザーフォームを、特定のシートに
 属していると理解している人が結構多い。だから、「別のシート」という表現をする。
 説明し出すとややこしくなるので、ここでは、これ以上ふれないけど。

 で、本題。

 標準モジュールに Dim myDate As ○○○ と記述したんだよね。
 で、どこかで、このmyDateに値を入れているとして、

 1.この入荷_Click では myDateの宣言は不要。
     ここで宣言しちゃうと、標準モジュールで宣言したmyDateとは別の、ここだけの、同名の別の変数になっちゃう。
     で、その「別のmyDate」には、何も格納されていないので、Findの引数として使うとぐあいがわるい。
 2.気になる点。
      myDateのデータ型(とりもなおさず、ここでA列を検索している、そこに入っている日付の型)は何かな?
      Date型でいいの?であれば、LookIn:=xlValuesは具合が悪い。Formulasを使うべき。

 20:14 スペル訂正

 ぶらっと立ち寄り

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

以前作成したものの流用で作成をしています。そのため、これまでの不都合な部分の修正をしたいのですが、型、宣言等の知識不足、理解不足が多々あります。ご容赦願います。

何度も申し訳ありませんが、うまくいきません。

現状をできるだけ詳しくお伝えするために、下記に記述させていただきますので、
ご教授願います。

実績を入力開始する際、シート上のボタンをクリックすることで、
標準モジュールが動くようにしています。
実績を入力するエクセルの表は、B列に日付(1日のみ日付入力 2日以降は「=○○+1」表示形式は 例:「3/21」)
以前作成したものでは、うまく検索できなかったため、A列に「=B1」のようにしてあり、表示形式は
例:「2011/6/18」を白文字で見えないように入れています。

【標準モジュール】
Sub 実績登録()

Dim mydate As Date
Dim Foundcell As Date

mydate = InputBox("日付を指定して下さい。")

メインメニュー.Show

End Sub

(メインメニューから入荷を選択)

【ユーザーフォーム】
Private Sub 入荷_Click()

Dim Foundcell As Date

Sheets("入荷").Activate

Set Foundcell = Range("A:A").Find(what:=mydate, LookIn:=Formulas, lookat:=xlWhole)

If Foundcell Is Nothing Then
MsgBox "見つかりません。入力した日付又は、表の日付を確認して下さい。"
Exit Sub

ElseIf mydate = "" Then
MsgBox "キャンセルします。"
Exit Sub

Else
Foundcell.Select

End If

入荷メニュー.Show

End Sub

よろしくお願いいたします。

21:31 一部訂正 yottsun


 まず、「うまくいきません」
 どううまくいかないのか、エラーが発生したのか、実行結果が思ったとおりではないのか。
 実行結果の問題であれば、こうなるべきなのにこうなってしまう、
 エラーならコンパイルエラーなのか、実行時のエラーなのか、エラーメッセージは何か、
 そしてなによりも、どのコードでエラーになったのか。

 そんなことを書かないと回答側は困ってしまう・・・とまぁ、おそらくはコンパイルレベルの問題かな?
 もし、モジュールの先頭に、ちゃんとOption Explicitを記述していたら変数が規定されていないというコンパイルエラー。
 Option Explicitの記述がなければ、VBAが自動的にVariant型のmyDateを生成して、かつ、中身は空白なのでFindで見つからない。

 1.標準モジュールでの共通変数の宣言は最初のレスで書いたように「Public」で。
 2.それら変数はSub 入荷_Clickでは宣言しちゃいけない。
     (ましてや、FoundCellはRange型変数であるべきなのにDate型にしている)

 ★気になる点

  mydate = InputBox("日付を指定して下さい。") 

 一見良さそうに見えるけど、日付の形式以外の文字列が入力されるとエラーになる。
 また、キャンセルをおされてもエラーになる。

 アップされた部分のコードだけ添削すると以下。
 (自分が書くなら、日付入力はユーザーフォームにテキストボックスを配置して、そこでやるけどね)

 (標準モジュール)

 Option Explicit

 Public myDate As Date
 Public FoundCell As Range

 Sub 実績登録()
    Dim ans As String

    Do
        ans = InputBox("日付を指定して下さい。")
        If ans = "" Or IsDate(ans) Then Exit Do 'キャンセル
        MsgBox "正しい日付をyyyy/m/dの形で入力してください"
    Loop

    If ans <> "" Then
        myDate = ans
        メインメニュー.Show
    End If

 End Sub

 (ユーザーフォームモジュール)

 Option Explicit

 Private Sub 入荷_Click()

    Sheets("入荷").Activate

    Set FoundCell = Range("A:A").Find(what:=myDate, LookIn:=xlFormulas, lookat:=xlWhole)

    If FoundCell Is Nothing Then
        MsgBox "見つかりません。入力した日付又は、表の日付を確認して下さい。"
        Exit Sub
    Else
        FoundCell.Select
    End If

    入荷メニュー.Show

 End Sub

 追)1.FoundCellは、このあと他でも使うかもしれないので標準モジュールでPublic宣言してあるけど
         もし、入荷_Clickだけで使うなら、入荷_Click内で宣言すべき。(普通の Dim で)

 ぶらっと立ち寄り

ご丁寧にありがとうございます。
教えていただいたもので、試行錯誤しておりますが、
「見つかりません。入力した日付又は、表の日付を確認して下さい。」となってしまいます。
入力は「yyyy/m/d」で入力しています。
プログラム(?)は教えていただいたものをそのまま使用しております。

エクセル表側に問題あるのかと思いますが、解決できずまた書き込みさせていただきました。
よろしくお願いいたします。

yottsun


 何度か確認しているけど入荷シートのA列の日付は、yyyy/m/d の日付型で入っていますか?
 それとも 20110615 のように入っていますか?
 アップしたコードは、入荷シートのA列が 2011/6/10 といった、日付型で入っているというコードです。
 こちらでは、インプットボックスで入力した日付が入荷シート上で選択されるけど。

 ぶらっと立ち寄り

≪入力されている数式≫

        A       B                               
1      =B1   2011/6/1 
2      =B2    =B1+1
3      =B3    =B2+1

≪表示形式≫

        A       B
1    2011/6/1  6/1
2    2011/6/2  6/2
3    2011/6/3  6/3

このようになっています。
yottsun


LookIn:=xlValuesにて解決しました。
お騒がせしました。
ありがとうございました。yottsun

コメント返信:

[ 一覧(最新更新順) ]


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