アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。

現在、excelでスケジュール帳を作成しています。
1枚のシートで1年分です。

そこで、何かの方法を使って
日付を選択→その日付にカーソル(フォーカス?)を移動させたいと思っています。

ユーザーフォームを他で使用するので、そこに日付の選択も付け加えようとしています。

1.テキストボックスに日付を入力させる。
テキストボックスを日付設定することが、まず難しそうなので断念。
2.カレンダーコンロールを発見。
これなら日付を選ぶだけ。
ただし、どうやってそれをカーソル移動に反映させるかがわからず。。
ネットで調べましたが、自力では解決できませんでした。
アドバイスお願いします。

XP、excel2007使用中。

A 回答 (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

'-------------------------------------------
    • good
    • 0
この回答へのお礼

大変申し訳ありませんでした。
そういう具体的な情報お伝えしていませんでした。
ご提示いただいた式で、ばっちり動きます。

念のため、実際の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 と出ました。

お礼日時:2009/11/20 17:51

こんにちは。



私のほうのVBAの回答では、今のところ、この程度しかありません。表の構造からすると、今の方法では、ほとんど速くならないように思います。検索に必要なデータのみを拾い上げる手間のほうが多いからです。

私自身は、UserFormはあまり好きではないのは、Excelのシートがオブジェクトに他ならないので、そのオブジェクトを増やすことになるからです。私なら、シートのところに、TextBox(コントロールツール)を置いて、そこで検索する方法を取りますが、内容的には、少し複雑になります。

もしかしたら、お読みになっているかもしれませんが、以下で、テキストボックスで、日付を入れる注意点を一覧にしています。
http://oshiete1.goo.ne.jp/qa5388151.html
VBA テキストボックスで日付を変更するとエラー
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/11/24 15:35

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/11/20 17:19

こんにちは。


#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にまだなおせず四苦八苦していますが。
とりあえず、別シートではリンクできるようになったので。
がんばります。

補足日時:2009/11/20 15:29
    • good
    • 0

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
「excel カレンダーコントロールを使っ」の回答画像5

この回答への補足

見本まで作っていただき、ありがとうございます。
が、私のではうまくいきません。工夫が必要みたいです。
>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してこないと。
これを解消しなければいけないようです。
考えてみます。

補足日時:2009/11/20 13:50
    • good
    • 0

こんにちは。



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

この回答への補足

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

補足日時:2009/11/19 17:39
    • good
    • 0

こんばんは。



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

>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 となっています。
これを文字列に変換すればいいのかなと思うのですが、まだまだ思案中です。
とりあえずお礼を。進展あれば報告します。
 

補足日時:2009/11/19 09:48
    • good
    • 0

No.1です!


たびたびごめんなさい。

投稿した後に気づきました。
A列の作業用の列は不要ですし、数式ももう少し簡単にできます。

日付がA列にあるとすると1列ずれますので
D2セルに日付を入力し、D3セルをクリックするとその日付セルに飛ぶようにします。

D3セルの数式を
=IF(D2="","",HYPERLINK("#A"&MATCH(D2,A2:A400,0)+1,"ここをクリックすると↑のセルに飛びます"))

に変更してみてください。
これで前回と同様の動きになると思います。

どうも何度も失礼しました。m(__)m
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/11/19 09:19

こんばんは!


参考になるかどうか判りませんが・・・

当方使用の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 カレンダーコントロールを使っ」の回答画像1
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!