• ベストアンサー

excel カレンダーコントロールを使ってカーソル移動

お世話になります。 現在、excelでスケジュール帳を作成しています。 1枚のシートで1年分です。 そこで、何かの方法を使って 日付を選択→その日付にカーソル(フォーカス?)を移動させたいと思っています。 ユーザーフォームを他で使用するので、そこに日付の選択も付け加えようとしています。 1.テキストボックスに日付を入力させる。 テキストボックスを日付設定することが、まず難しそうなので断念。 2.カレンダーコンロールを発見。 これなら日付を選ぶだけ。 ただし、どうやってそれをカーソル移動に反映させるかがわからず。。 ネットで調べましたが、自力では解決できませんでした。 アドバイスお願いします。 XP、excel2007使用中。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

こんにちは。 いくら、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 '-------------------------------------------

hiro1190
質問者

お礼

大変申し訳ありませんでした。 そういう具体的な情報お伝えしていませんでした。 ご提示いただいた式で、ばっちり動きます。 念のため、実際の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 と出ました。

その他の回答 (8)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.9

こんにちは。 私のほうのVBAの回答では、今のところ、この程度しかありません。表の構造からすると、今の方法では、ほとんど速くならないように思います。検索に必要なデータのみを拾い上げる手間のほうが多いからです。 私自身は、UserFormはあまり好きではないのは、Excelのシートがオブジェクトに他ならないので、そのオブジェクトを増やすことになるからです。私なら、シートのところに、TextBox(コントロールツール)を置いて、そこで検索する方法を取りますが、内容的には、少し複雑になります。 もしかしたら、お読みになっているかもしれませんが、以下で、テキストボックスで、日付を入れる注意点を一覧にしています。 http://oshiete1.goo.ne.jp/qa5388151.html VBA テキストボックスで日付を変更するとエラー

hiro1190
質問者

お礼

いろいろアドバイスありがとうございます。 参考URLの内容は初めて知りました。 奥が深くて難しいです。。 速い、遅いのスピードに関しては、特に問題にならないようなので、 教えていただいたコードを使用させていただきます。 本当にありがとうございました。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.7

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

hiro1190
質問者

お礼

たびたびありがとうございます。 私も作業列を作って作動できるようになりました。 これをできれば下の方の補足で書きましたがVBAにて処理できるように思案中です。 ほんと、何度もありがとうございます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。 #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 型自体が、同じ書式ですから、問題はないです。

hiro1190
質問者

補足

何度もありがとうございます。 正直おてあげです。なぜだめなのかわかりません。 そこで大変申し訳ありませんが、tom04 さまの案を利用しようと思います。 カレンダーで選択した日付を 同じユーザーフォームに作ったテキストボックスに入力させ、それからリンクさせられたら、と。 まあ、VBAにまだなおせず四苦八苦していますが。 とりあえず、別シートではリンクできるようになったので。 がんばります。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

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

hiro1190
質問者

補足

見本まで作っていただき、ありがとうございます。 が、私のではうまくいきません。工夫が必要みたいです。 >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)
回答No.4

こんにちは。 すみません、ここらあたりは、バージョンの違いで、分からなくなっていました。書式が、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

hiro1190
質問者

補足

検索できません。探してくれません。。 いろいろ方法を探り中です。 アドバイスいただいたのに申し訳ないです。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 >テキストボックスを日付設定することが、まず難しそうなので断念。 確かに、おっしゃるとおりかもしれません。ここで、私の書いたものを読まれたような気がします。 >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

hiro1190
質問者

補足

回答ありがとうございます。 ご提示いただいた式をあてはめてみましたが、動きません(^_^;) sFmt = rng.Cells(2, 2).NumberFormatLocal  の cells(2,2)は、ひとつめの日付のところをさすのかなと考えましたが、違いますか? findは文字列の検索ということなので、たぶん動かないんですね。 いま、日付は ユーザー定義 d となっています。 これを文字列に変換すればいいのかなと思うのですが、まだまだ思案中です。 とりあえずお礼を。進展あれば報告します。  

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.2

No.1です! たびたびごめんなさい。 投稿した後に気づきました。 A列の作業用の列は不要ですし、数式ももう少し簡単にできます。 日付がA列にあるとすると1列ずれますので D2セルに日付を入力し、D3セルをクリックするとその日付セルに飛ぶようにします。 D3セルの数式を =IF(D2="","",HYPERLINK("#A"&MATCH(D2,A2:A400,0)+1,"ここをクリックすると↑のセルに飛びます")) に変更してみてください。 これで前回と同様の動きになると思います。 どうも何度も失礼しました。m(__)m

hiro1190
質問者

お礼

回答ありがとうございます。 ご提示いただいた式で動きます(^.^) ただ、日付はA列だけではありません。 具体的には、 A列=10月、D列=11月、G列=12月…  と、1ケ月単位で区切っています。 これをどう表現するか、応用ですね。 頑張って考えます。 ありがとうございました。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! 参考になるかどうか判りませんが・・・ 当方使用の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

関連するQ&A

  • EXCEL VBA カーソル移動方法?

    エクセル2000でユーザーフォームを作成し テキストボックス1~6まで作成し テキストボックス1~3を1段目、4~6を二段目で配置した場合 エンターキーでケキストボックス1⇒2・・・6のカーソル移動は わかるのですが、テキストボックス2から下に配置してある テキストボックス5に矢印キー↓でカーソルを動かすようにはどのように すればよろしいのでしょうか? 又、おなじようなことなのですがテキストボックス2から 矢印←でテキストボックス1にカーソルを移動させるのも 同じでしょうか? 宜しくお願いいたします。

  • VBAのフォーム カーソル移動

    VBAのフォームでテキストボックス(1)~テキストボックス(5) まで作ったとします。 カーソルの移動はtabindexの値を順番につければいいのですが、例えばENTERキーとTABキーを両方押したときは カーソルが一つ飛ぶ制御をしたいのですがどうすればいいでしょうか? つまり カーソルがテキストボックス(1)にいる状態でENTERキーとTABキーを同時に押せばカーソルがテキストボックス(3)に移動するようにしたいのですが、お願いします

  • 【エクセルVBA】 タブでのカーソル移動の質問です

    ユーザーフォームを設置して、テキストボックスを複数設置し、入力援助するVBAを組んでいます。 タブインデックスのとおりに、タブもしくはエンターキーで、通常はカーソルがテキストボックス間を移動しますが、ほんのたまにですが、エンターキーで移動ができず、またタブキーではテキストボックス内にタブができてしまい、次のテキストボックスに移動しない現象が現れます。 そうした場合はマウスで次のボックスにカーソルを移動しますが非常に面倒です。またこの現象はファイルを再起動したら直ったり直らなかったり、ウインドウズを再起動しても直らなかったりで困っています。 どうしてこのようなカーソル移動の不具合が起こるのか、またはどうしたら無くなるのでしょう?

  • エクセルvbaでフレーム上のカレンダーコントロール

    エクセルvbaでユーザーフォームの中のフレーム上にカレンダーコントロール をデフォルト非表示で配置しています。ボタンをクリックするとカレンダを表示状態にして、 日付をクリックしたらその値をテキストボックスに表示してカレンダの 表示を消すというコードを作りました。以下がそのコードです。 Private Sub 表示ボタン_Click() cldCalendar.Visible = True cldCalendar.SetFocus End Sub Private Sub cldCalendar_Click() With cldCalendar テキストボックス1 = .Value テキストボックス1.SetFocus .Visible = False End With End Sub このコードだとカレンダーの日付をクリックしない限り、 ずっとカレンダは表示されたままになってしまいます。 カレンダからフォーカスが移った時非表示にしたいのですが、どうすればよいのでしょうか? また非表示にしたいのは、フォーム上の特定のオブジェクトをクリックしたときだけではなく、 フォーム上の何もない場所など、とにかくカレンダ以外のすべてにおいてクリックしたり、 フォーカスが移動したらカレンダを非表示にしたいのです。 注文が細かくて恐縮なのですが、どなたか詳しい方教えてください。

  • Accessのカレンダーコントロールについて

    いつもお世話になっております。 Accessのフォーム上に貼り付けるコントロールで クリックするとカレンダーが表示され、日付を選択 することで、テキストボックスに選択した日付が 表示されるという画面を見たことがあります。 どのようにすれば、このコントロールを使えるように できるのでしょう? どうか、よろしくお願いいたします。

  • ACCESS カレンダーコントロールで移動

    入力終了したデータをフォームに表示させているのですが、カレンダーコントロール9.0とテキストボックスをコントロールソースにして、日付が数字とカレンダーの日付が押された状態で表示されるようにしています。 レコードセレクタからいちいち任意の日付を探すのは面倒なので、出来ればカレンダーコントロールの日付をクリックまたはダブルクリックすることによりその日にレコードが移動してデータが表示させたいのですが、どのような方法があるでしょうか? 使用しているのはACCESS2000です。何卒、良い知恵がありましたら(そのような感じのことが書いてあるwebページでも構いません)宜しくお願いいたします。

  • カレンダーコントロールの使い方

    フォーム1のイベントで、カレンダーコントロールの挿入されたフォーム2を開く。 日付をクリックした時に、フォーム1のテキストボックスに日付を挿入。 挿入されたと同時に、フォーム2は閉じて、フォーム1がアクティブになる。 という一連の作り方を教えて頂けないでしょうか。 よろしくお願いいたします。

  • テキストボックスでのカーソルについて

    VB6で作ったフォームでテキストボックスにフォーカスが移ったときに既に入っている文字列の先頭にカーソルがいるのですが、これを文字列をすべて選択した様に(反転表示)にならないか、または文字列の最後尾にカーソルを置けないか、悩んでいます。よろしくお願いいたします。

  • [Enter]エンターキーでカーソル移動する方法

    プログラム(VB.NET)初心者です。 どうぞよろしくお願いします。 フォームに複数のテキストボックスを配置しているのですが、 タブで次のテキストにフォーカスが移動するように [Enter]キー押下時もフォーカスを次のテキストに移動させたいのです。 色々試してみたものの、なかなかうまくいきません(><) どなたか、わかる方教えていただけたら幸いです。 サンプルソースがあると嬉しいです。 申し訳ありませんが、宜しくお願いします。

  • EXCELフォームでIME制御

    EXCEL2002を使用しています。 フォームを作成し、テキストボックスにIMEの制御で 半角カタカナを設定しています。 (IMEModeで6の設定) フォームを開いて1回目にカーソルが移動するときは、 うまくいくのですが、その後そのテキストボックスに カーソルを移動させると、IMEがオフの状態になります。 キーボード等で切り替えようとしても効きません。 ちなみに同じフォームをEXCEL2000で作業するとうまくいきます。 よろしくお願いします。

専門家に質問してみよう