質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

4回答

2953閲覧

【VBA】任意の文字選択

joucomi

総合スコア30

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2015/04/03 03:01

編集2015/04/03 04:03

ボールドテキストいつもお世話になってます。
23歳OLです。ついに社会人2年目になりました!

本日の悩みなのですが、

▼やりたいこと
・TODAY関数で表示した、今日の日付のところに飛んで選択したい。

というのができません。
1シート目で「今日の日付に飛ぶ」というボタンが有り、
2~13シートにはそれぞれ4月、5月、とカレンダーが入っております。
しかし、飛んでいってくれません。
なぜなのでしょうか?
お忙しいところ大変恐縮ではございますが、ご指導よろしくお願いします.

▼現在書いているコード

Sub serch()

Dim fKey As String '検索する文字
Dim fRange As Range '検索されたセル

Dim s1 As Worksheet
Dim s4 As Worksheet
Dim s5 As Worksheet
Dim s6 As Worksheet
Dim s7 As Worksheet
Dim s8 As Worksheet
Dim s9 As Worksheet
Dim s10 As Worksheet
Dim s11 As Worksheet
Dim s12 As Worksheet

Set s1 = Sheets("ルール")
Set s4 = Sheets("4月")
Set s5 = Sheets("5月")
Set s6 = Sheets("6月")
Set s7 = Sheets("7月")
Set s8 = Sheets("8月")
Set s9 = Sheets("9月")
Set s10 = Sheets("10月")
Set s11 = Sheets("11月")
Set s12 = Sheets("12月")

Range("G30").ClearContents

Range("G30").Value = Range("F30").Value 'F30にはTODAY関数が入っており、そのvalueだけ抜く

s4.Select

fKey = s1.Range("G30")
Set fRange = ActiveSheet.Cells.Find(What:=fKey, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)
If (fRange Is Nothing) Then
MsgBox (s1.Range("g30").Value & "はありませんでした")
Else
Cells(fRange.Row, fRange.Column).Select '見つかったセルを選択する
End If

End Sub

現状書いているコードでは4月分しか検索できないのですが、
5月、6月・・・といつになっても検索できるようにしたいです。

以上です。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

すみません、間違えて回答をつけてしまったので、この回答は無視してください。
消せたら消します。。。

投稿2015/04/04 15:33

編集2015/04/04 15:36
HachiyaKouya

総合スコア85

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

まずは、社会人2年目突入おめでとうございます。
後輩ができたのでしょうか?
これからますますやりがいが出てきますね。
無理にならない程度に頑張ってください、先輩笑

さて、本題。
セルの書式設定が全て「標準」であるという前提で回答します。

Dim fKey As String '検索する文字

fKeyの型はDate型が良いです。

fKey = s1.Range("G30")

と右側にRangeオブジェクトを指定していますので自動的に.Valueの値が取得されるわけですが、日付型のValueを文字列型の変数に代入すると、数値が文字列に変換された物が代入されます。

ややこしい話になるのですが。
書式が日付や時刻の場合、保存されている値は実は数値です。
1900年1月1日0時0分0秒とかその辺を0とした経過時間のミリ秒数とかそんな数値が実際の値です。
Excelは(Excelだけではないのですが)、その値から日付や時刻を計算して表示しています。
実際に、セルの書式設定を「日付」にして何らかの日付を入力した後にそのセルの書式設定を「文字列」に変更すると数値が表示されます。

提示頂いたプログラムで上手く動かないのは、日付時刻型(実体は数値)を変換した文字列で日付時刻型(実体は数値)のデータを検索したからではないかと思います。

それと、月ごとに分かれたシート全てを検索対象にするのであれば、

StrConv(Month(Range("G30").Value), vbWide) & "月"

で「4月」とかが取得できるので(これはExcel2010の場合です)、

s4.Select

Sheets(StrConv(Month(s1.Range("G30").Value), vbWide) & "月").Select

とかにしてあげると、当月のシート(数値は全角文字列で表現されている想定)が自動的に選択されるのではないかと。

fKeyの型については一応手元の環境でそれっぽく書いてみて動作確認しましたが、シートの自動選択は確認していません笑

他の方のコメントにもありますが、エラーが出るとかどうしても条件に該当してくれないとか、あとはExcelってセルの書式設定によって実体が違うので文字列と数値以外のデータならセルの書式設定とか通過型でもちょっと違うかもしれない。
あと、使っているExcelのバージョンも書いてもらえると助かります(Officeはたまに大改修で使い方が変わったりしますが、質問者の会社の都合で古いバージョンを使い続けていることもあったりするので)。

※追記
シートの自動選択がうまく動かない原因がよくわからないので、試しにまるっと作ってみました。
以下のコードはG30のセルを使っていませんが、問題ありませんでした。

Cells(fRange.Row, fRange.Column).Select '見つかったセルを選択する

ここも

fRange.Select '見つかったセルを選択する

に変えています。

lang

1Sub serch() 2 3Dim fKey As Date '検索する文字 4Dim fRange As Range '検索されたセル 5 6Dim s1 As Worksheet 7Dim s4 As Worksheet 8Dim s5 As Worksheet 9Dim s6 As Worksheet 10Dim s7 As Worksheet 11Dim s8 As Worksheet 12Dim s9 As Worksheet 13Dim s10 As Worksheet 14Dim s11 As Worksheet 15Dim s12 As Worksheet 16 17Set s1 = Sheets("ルール") 18Set s4 = Sheets("4月") 19Set s5 = Sheets("5月") 20Set s6 = Sheets("6月") 21Set s7 = Sheets("7月") 22Set s8 = Sheets("8月") 23Set s9 = Sheets("9月") 24Set s10 = Sheets("10月") 25Set s11 = Sheets("11月") 26Set s12 = Sheets("12月") 27 28 29'Range("G30").ClearContents 30 31'Range("G30").Value = Range("F30").Value 'F30にはTODAY関数が入っており、そのvalueだけ抜く 32 33 34 35' s4.Select 36Sheets(StrConv(Month(s1.Range("F30").Value), vbWide) & "月").Select 37 38fKey = s1.Range("F30") 39 Set fRange = ActiveSheet.Cells.Find(What:=fKey, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) 40 If (fRange Is Nothing) Then 41 MsgBox (s1.Range("F30").Value & "はありませんでした") 42 Else 43 fRange.Select '見つかったセルを選択する 44 End If 45 46 47 48End Sub 49

投稿2015/04/03 14:16

編集2015/04/04 15:42
HachiyaKouya

総合スコア85

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

joucomi

2015/04/04 14:09

>無理にならない程度に頑張ってください、先輩笑 先輩頑張ります!! ご返事ありがとうございました。。 stringをdateに変えたら日付の取得ができました!! ありがとうございます。 しかし、これに変えると【Sheets(StrConv(Month(s1.Range("G30").Value), vbWide) & "月").Select】 途端に2014/4/4は表示されません。 とメッセージボックスで表示されます。 ちなみにエクセル2010で
joucomi

2015/04/04 14:10

使用しております。。。(途中で送信してしまいました)
joucomi

2015/04/06 04:13

ご返事ありがとうございました。 上記頂いたコードを試して見たのですが、 エクセル2010では 「2015/04/06はありませんでした。」と表示されます。 4月のシートには行くのでそこは大丈夫なのですが、 日付を選択するに至りません。 どうしてでしょう・・・。
HachiyaKouya

2015/04/06 05:30

そうですねぇ。。。 現象を再現させてみました。 「4月」「5月」などのカレンダーのシート、日付が入力されているセルの書式を「文字列」、日付を「yyyy/m/d」(「2015/04/06」が0埋めなしで「2015/4/6」になっている状態)にしたら同じ状態になりました。 もし同じ状態でしたら、次のように変えてみてください。 > Set fRange = ActiveSheet.Cells.Find(What:=fKey, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) を > Set fRange = ActiveSheet.Cells.Find(What:=Format(fKey, "yyyy/m/d"), LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) F30セルの日付型を文字列に変換しています(あ、だからG30セルを文字列型にして使っていたのかしら。。。)。 これでダメなら、「ルール」シートのF30セルと「4月」シートの日付が入っている部分のセルの書式(表示形式)を教えてください。
joucomi

2015/04/06 06:17

F30 の表示形式は 日付のタグ一番上【*2001/3/14】 日付の部分は ユーザー定義なかほど【m”月”d”日”】 です。 ちなみに双方日付の【3月14日】でやっても同じ結果になりました。 以上となります。よろしくお願いいたします。
HachiyaKouya

2015/04/06 06:32

上のコメントにある「Format(fKey, "yyyy/m/d")」でF30の「2015/04/06」を「2014/4/6」に変換していますからね。「4月6日」とは一致しません。 「Format(fKey, "yyyy/m/d")」を「Format(fKey, "m月d日")」に変えてみてください。 「4月」シートの書式に合わせれば見つけられると思いますよ。
joucomi

2015/04/06 06:40

ありがとうございます!!!! 出来ました!!!(^^ゞ☆彡 お世話になりました!!
joucomi

2015/04/06 06:41

丁寧なご教示ベストアンサー程度の感謝では言い表せません!
guest

0

4月は検索できたということなので、あとはシート毎に繰り返すだけですね。
各シートを順に検索する処理にしてはいかがでしょう?
次のコードは最初のシートだけ除外して、他のシートから値を検索して選択します。
ヒットすればそのシートとセルを選択し、
ヒットしなければ最初のシートに戻ります。

lang

1 Dim fKey As String '検索する文字 2 Dim fRange As Range '検索されたセル 3 4 Dim ws As Worksheet 5 Range("A1").Value = Range("C1").Value 6 fKey = Range("A1").Value 7 For Each ws In Worksheets 8 If ws.Name <> "Sheet1" Then 9 Set fRange = ws.Cells.Find(What:=fKey, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) 10 If Not (fRange Is Nothing) Then 11 ws.Select 12 fRange.Select '見つかったセルを選択する 13 Exit Sub 14 End If 15 End If 16 Next ws 17 Worksheets(1).Select

投稿2015/04/03 05:11

tyoku

総合スコア67

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

joucomi

2015/04/03 05:55

ご返事有り難うございます。 4月もまだ検索できておりません。。。 多分、TODAY関数を読み込めていないのかなと思います・・・。 頂いたコードは早速使って見ようと思います!
joucomi

2015/04/03 06:02

>頂いたコード試してみました しかし、全く動きません。。。 TODAY関数とは違う普通の文字列すら検索しても選択してもらえませんでした。。。。;;
swordone

2015/04/03 07:28

「動かない」というにも色々あります. そもそも実行できないのか,実行中にエラーが出るのか, はたまた見た目実行は正常だが求める動作じゃないのか, その原因がわからないと対処のしようがないですよ. 「実行できない」以外なら,1行ずつステップインしてチェックすることをおすすめします.
joucomi

2015/04/04 14:15

失礼しました。 エラーの内容としてはいただいたコードを試してみたのですが、 うんともすんとも動かず、カーソルもピクリともしないという感じです。 やり方をまちがえていたら、せっかく書いていただいたのに申し訳ないです。。。
swordone

2015/04/04 15:34

繰り返しすみません >うんともすんとも動かず、カーソルもピクリともしないという感じです。 これは実行した結果,何も起きないということではないでしょうか? 上のコードをよく見てください あなたのコードで使っているセルと違う場所を指定していますよ あなたのシートでC1が空なら「空の文字列」を検索することになるのでヒットせず, 結果「何も起きない」ということになっていると推測します. もし「うんともすんとも」の意味が,操作を全く受け付けない状態になるというのであれば私にもわかりません(コードを見る限りそんなことは起こりえないと思うのですが) 繰り返しますが,1行ずつ実行して見てください.どこでおかしいのかが少しは見えてきますから.
guest

0

日付を検索する

上記リンクに日付を扱う注意点がいくつかありました.
TODAY()を入れたセルのValueを取ると,表示形式が何であれyyyy/mm/ddの形で取得されます.
つまり,日付検索の際に,検索対象のセルにこの形式で書かれていなければ見つからないことになります.
セルの表示形式を利用したいならTextプロパティを使うといいようです.

せっかく月ごとにシートを分けているのですから,日付から月を取得して探すシートを決定すればいいのではないでしょうか?
それに目的から推測するに,日付が書かれているセルは左端の列など,決まった範囲に入っていると思われるので,お示しのコードのようにセル全体を探すのは無駄が多いように思います.

私なら以下のようにします.

  1. TODAY()のセルからValue2プロパティでシリアル値を取得し,関数MONTH()で月に変換

これを使うために,ワークシート関数をVBAで使用する
2. 1.の月からシート名を設定し,Sheets(シート名)で検索対象のシートを決定
必要に応じて月の数字を全角に変換(StrConv)
3. 2.のシートの特定の列に対して検索を実行

あるいは,シート特定が面倒なら,For~Eachステートメントで全部のシートに対して3.を実行するといいのではないでしょうか?ただ,あとの月を検索する際に余計な検索が入るので若干時間がかかると思います.

投稿2015/04/03 04:54

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問