- ベストアンサー
excel カレンダーコントロールを使ってカーソル移動
お世話になります。 現在、excelでスケジュール帳を作成しています。 1枚のシートで1年分です。 そこで、何かの方法を使って 日付を選択→その日付にカーソル(フォーカス?)を移動させたいと思っています。 ユーザーフォームを他で使用するので、そこに日付の選択も付け加えようとしています。 1.テキストボックスに日付を入力させる。 テキストボックスを日付設定することが、まず難しそうなので断念。 2.カレンダーコンロールを発見。 これなら日付を選ぶだけ。 ただし、どうやってそれをカーソル移動に反映させるかがわからず。。 ネットで調べましたが、自力では解決できませんでした。 アドバイスお願いします。 XP、excel2007使用中。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 いくら、VBAでも、以下の情報を言っていただかないと、いくらやっても、Find検索はできません。 >Sheet2!A:A は、私の方では、単なる数字1,2ではなく、 >A4=DATE($A$1,$B$1,1) = 2008/10/1 表示は d つまり 1 というようにしています。 >なので、検索にかけると、シリアル値になっています。 ただし、私は、 数式をこのようにしました。 =DATE($A$1,B$1,ROW(A1)) ....1~ セルの位置など、詳しく言っていただいたら、もう少し、速い検索は可能だと思います。 '------------------------------------------- Private Sub Calendar1_Click() Dim rng As Range Dim c As Variant Dim mDate As Variant Set rng = ActiveSheet.UsedRange mDate = CLng(Calendar1.Value) For Each c In rng If c.Value2 = mDate Then c.Select Exit For End If Next c Set rng = Nothing End Sub '-------------------------------------------
その他の回答 (8)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 私のほうのVBAの回答では、今のところ、この程度しかありません。表の構造からすると、今の方法では、ほとんど速くならないように思います。検索に必要なデータのみを拾い上げる手間のほうが多いからです。 私自身は、UserFormはあまり好きではないのは、Excelのシートがオブジェクトに他ならないので、そのオブジェクトを増やすことになるからです。私なら、シートのところに、TextBox(コントロールツール)を置いて、そこで検索する方法を取りますが、内容的には、少し複雑になります。 もしかしたら、お読みになっているかもしれませんが、以下で、テキストボックスで、日付を入れる注意点を一覧にしています。 http://oshiete1.goo.ne.jp/qa5388151.html VBA テキストボックスで日付を変更するとエラー
お礼
いろいろアドバイスありがとうございます。 参考URLの内容は初めて知りました。 奥が深くて難しいです。。 速い、遅いのスピードに関しては、特に問題にならないようなので、 教えていただいたコードを使用させていただきます。 本当にありがとうございました。
- tom04
- ベストアンサー率49% (2537/5117)
No.1・2・5です! ほんとうに何度もごめんなさいね。 補足にある >MATCH(DAY(B1),Sheet2!A:A,0) という部分です。 ここで、日を取得したいわけですよね。しかしエラーになります。 の件ですが・・・ 結局この部分の数式は○行目という行番号を取得したいだけですので、 シリアル値で列を判断し、その列の中でMATCH関数を使うと かなりややこしい数式になってしまいます。 簡単な方法としては、 仮にSheet1のF列に作業用の列を設けて F2セル、すなわち2行目(Sheet2の1日目の行)から1・2・3・・・というように31まで数値を入れておきます。 それを参照してもかまわないと思いますよ。 前回の表では、2009/11/5 は6行目になりますので 6という数値を導き出せば良い訳です。 最終的に前回の表そのままの配置で B2セルの数式を =IF(B1="","",HYPERLINK("#sheet2!"&VLOOKUP(MONTH(B1),D2:E13,2,0)&MATCH(DAY(B1),F:F,0),"ここをクリック!")) これで何とか希望に近い形にならないでしょうか? どうも何度も長々と失礼しました。m(__)m
お礼
たびたびありがとうございます。 私も作業列を作って作動できるようになりました。 これをできれば下の方の補足で書きましたがVBAにて処理できるように思案中です。 ほんと、何度もありがとうございます。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #4の回答者です。 Excel 2007 で試してみましたが、問題なく検索しています。 懸念していた、Excel97 や 2000のような現象は現れませんでした。 たぶん、コードの理屈は分かっていただけていると思います。 >A列=10月、D列=11月、G列=12月… と、1ケ月単位で区切っています。 となっている以上は、Find メソッドが楽だとは思います。 >日付は ユーザー定義 d となっています。 しかし、ユーザー定義 d となっても、中身のシリアル値であるのかは、掲示板には書かれていません。こちら側が想定している範囲なら、このコードの理屈で検索できるはずです。こちら側が知らされていない部分があるようです。 実際、私がカレンダーを作るときに、すべてのシートにリテラルなシリアル値を入れません。数式で入れていきます。そうすると、今のままでは検索では出来ないはずです。 Find メソッドを使う限りは、同じ文字を探しているわけで、Value として表面的なものを検索するか、Formula として、中身を検索するかどちらかしかないのです。表面的なものは、数字は、複数ありますから、間違った場所に行ってしまいます。 リテラルなシリアル値(ただの数字)を検索するものは、ここにはありません。そういう方法がないわけではありませんが、いままでの、まったく出来ないと確認できてからにしてほしいです。 なお、Excel 2007 では、「2009/11/1(yyyy/m/d)」ではなく、「2009/11/01(yyyy/mm/dd)」 となっていましたが、Date 型自体が、同じ書式ですから、問題はないです。
補足
何度もありがとうございます。 正直おてあげです。なぜだめなのかわかりません。 そこで大変申し訳ありませんが、tom04 さまの案を利用しようと思います。 カレンダーで選択した日付を 同じユーザーフォームに作ったテキストボックスに入力させ、それからリンクさせられたら、と。 まあ、VBAにまだなおせず四苦八苦していますが。 とりあえず、別シートではリンクできるようになったので。 がんばります。
- tom04
- ベストアンサー率49% (2537/5117)
No.1・2です! たびたびごめんなさい! 前回のお礼の欄をよませてもらい もう一度方法を考えてみました。 日付の列の右となりのセルをアクティブにすればすぐに入力できると思いますので、 Sheet1のB1セルに日付(シリアル値)を入力し、B2セルをクリックすると Sheet2のその日付の右となりのセルに飛ぶようにしています。 (Sheet2の日付はシリアル値ではありません。単純に数値のみを入力しています) ↓の画像で左側がSheet1で右側がSheet2になります。 Sheet2の表はこんな感じで2列おきに各月の日付けが入っているものとします。 Sheet1に表を作っておき、入力した日付に対する列を選択するようにしています。 Sheet1のB2セルに =IF(B1="","",HYPERLINK("#sheet2!"&VLOOKUP(MONTH(B1),D2:E13,2,0)&MATCH(DAY(B1),Sheet2!A:A,0),"ここをクリック!")) という数式を入れています。 これでB1セルにシリアル値を入力後、B2セルをクリックしてみてください。 何とか希望に近い形にならないでしょうか? 以上、お役に立てば幸いですが、 的外れなら読み流してくださいね。m(__)m
補足
見本まで作っていただき、ありがとうございます。 が、私のではうまくいきません。工夫が必要みたいです。 >MATCH(DAY(B1),Sheet2!A:A,0) という部分です。 ここで、日を取得したいわけですよね。しかしエラーになります。 Sheet2!A:A は、私の方では、単なる数字1,2ではなく、 A4=DATE($A$1,$B$1,1) = 2008/10/1 表示は d つまり 1 というようにしています。 なので、検索にかけると、シリアル値になっています。 DAY(B1) は日付の数字だけなので、macthしてこないと。 これを解消しなければいけないようです。 考えてみます。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 すみません、ここらあたりは、バージョンの違いで、分からなくなっていました。書式が、d なら、前回のコードでは出来ませんね。Excel 2007 では試していませんが、中身を、このようにしてみたら出来るのではないかと思います。シリアル値が、2009/11/1(yyyy/m/d) のようになっていることが条件です。 Set rng = ActiveSheet.UsedRange mDate = Calendar1.Value Set r = rng.Find(mDate, , xlFormulas, xlWhole) On Error Resume Next r.Select On Error GoTo 0 Set rng = Nothing Set r = Nothing
補足
検索できません。探してくれません。。 いろいろ方法を探り中です。 アドバイスいただいたのに申し訳ないです。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >テキストボックスを日付設定することが、まず難しそうなので断念。 確かに、おっしゃるとおりかもしれません。ここで、私の書いたものを読まれたような気がします。 >2.カレンダーコンロールを発見。 カレンダーコントロールをお持ちなのですね。なくても、VB6 Runtime のDTPicker があります。 シートに本年1年分があるとして、カレンダーコントロールから選択しようとするわけですね。 UserForm にカレンダーコントロールを設けます。 条件的として、シート上では、シリアル値で書かれてあることです。 そして、同じ書式で書かれてあることが条件です。テキストで検索するからです。 '------------------------------------------- Private Sub Calendar1_Click() Dim rng As Range Dim r As Range Dim sFmt As String Dim mDate As Variant Set rng = ActiveSheet.UsedRange sFmt = rng.Cells(2, 2).NumberFormatLocal '書式を取得 mDate = Format(Calendar1.Value, sFmt) Set r = rng.Find(mDate, , xlValues, xlWhole) On Error Resume Next r.Select On Error GoTo 0 Set rng = Nothing Set r = Nothing End Sub
補足
回答ありがとうございます。 ご提示いただいた式をあてはめてみましたが、動きません(^_^;) sFmt = rng.Cells(2, 2).NumberFormatLocal の cells(2,2)は、ひとつめの日付のところをさすのかなと考えましたが、違いますか? findは文字列の検索ということなので、たぶん動かないんですね。 いま、日付は ユーザー定義 d となっています。 これを文字列に変換すればいいのかなと思うのですが、まだまだ思案中です。 とりあえずお礼を。進展あれば報告します。
- tom04
- ベストアンサー率49% (2537/5117)
No.1です! たびたびごめんなさい。 投稿した後に気づきました。 A列の作業用の列は不要ですし、数式ももう少し簡単にできます。 日付がA列にあるとすると1列ずれますので D2セルに日付を入力し、D3セルをクリックするとその日付セルに飛ぶようにします。 D3セルの数式を =IF(D2="","",HYPERLINK("#A"&MATCH(D2,A2:A400,0)+1,"ここをクリックすると↑のセルに飛びます")) に変更してみてください。 これで前回と同様の動きになると思います。 どうも何度も失礼しました。m(__)m
お礼
回答ありがとうございます。 ご提示いただいた式で動きます(^.^) ただ、日付はA列だけではありません。 具体的には、 A列=10月、D列=11月、G列=12月… と、1ケ月単位で区切っています。 これをどう表現するか、応用ですね。 頑張って考えます。 ありがとうございました。
- tom04
- ベストアンサー率49% (2537/5117)
こんばんは! 参考になるかどうか判りませんが・・・ 当方使用のExcel2003の場合です。 ↓の画像で説明させていただくと まず作業用の列としてA列を挿入し、連番を付けておきます。 そして、E2セルに日付(シリアル値とします)を入力し、E3セルをクリックすると その日付のセルがアクティブになるようにしてみました。 E3セルに =IF(E2="","",HYPERLINK("#B"&INDEX($A$2:$A$400,MATCH(E2,$B$2:$B$400,0)+1),"ここをクリックすると↑のセルに飛びます。")) という数式を入れています。 これでE2セルに日付を入力し、E3セルをクリックすればB列のその日付のセルに飛びます。 尚、1年分のカレンダーという事なので 数式は400行まで対応できるようにしています。 以上、参考になれば幸いですが、 的外れなら読み流してくださいね。m(__)m
お礼
大変申し訳ありませんでした。 そういう具体的な情報お伝えしていませんでした。 ご提示いただいた式で、ばっちり動きます。 念のため、実際のEXCELでは、 A3=2009、J3=2010。 B4=10、E4=11 … 3つおきに 月の数字。 B5=あ さん C5=い さん、E5=あ さん、F5=い さん …続く A6=DATE($A$3,$B$4,1)、A9=A6+1、~A96=IF(OR(A93="",A93=EOMONTH(A12,0)),"",A93+1) ーー10月分 D6=DATE(A3,E4,1) ~ --11月分 という感じで1年分の表になっています。 ActiveSheet.UsedRange は、調べたら $A$1:$AJ$101 と出ました。