[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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 で)
ぶらっと立ち寄り
エクセル表側に問題あるのかと思いますが、解決できずまた書き込みさせていただきました。
よろしくお願いいたします。
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
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.