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

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

ただいまの
回答率

90.52%

  • VBA

    1786questions

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

【VBA】任意の文字選択

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,380

joucomi

score 29

ボールドテキストいつもお世話になってます。
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月・・・といつになっても検索できるようにしたいです。


以上です。よろしくお願いします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

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 '見つかったセルを選択する
に変えています。

Sub serch()

Dim fKey As Date '検索する文字
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
Sheets(StrConv(Month(s1.Range("F30").Value), vbWide) & "月").Select

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


    
End Sub

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/04 23:09

    >無理にならない程度に頑張ってください、先輩笑
    先輩頑張ります!!

    ご返事ありがとうございました。。
    stringをdateに変えたら日付の取得ができました!!
    ありがとうございます。

    しかし、これに変えると【Sheets(StrConv(Month(s1.Range("G30").Value), vbWide) & "月").Select】
    途端に2014/4/4は表示されません。
    とメッセージボックスで表示されます。

    ちなみにエクセル2010で

    キャンセル

  • 2015/04/04 23:10

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

    キャンセル

  • 2015/04/06 13:13

    ご返事ありがとうございました。

    上記頂いたコードを試して見たのですが、
    エクセル2010では

    「2015/04/06はありませんでした。」と表示されます。
    4月のシートには行くのでそこは大丈夫なのですが、
    日付を選択するに至りません。

    どうしてでしょう・・・。

    キャンセル

  • 2015/04/06 14: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月」シートの日付が入っている部分のセルの書式(表示形式)を教えてください。

    キャンセル

  • 2015/04/06 15:17

    F30 の表示形式は 日付のタグ一番上【*2001/3/14】

    日付の部分は ユーザー定義なかほど【m”月”d”日”】
    です。

    ちなみに双方日付の【3月14日】でやっても同じ結果になりました。

    以上となります。よろしくお願いいたします。

    キャンセル

  • 2015/04/06 15: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月」シートの書式に合わせれば見つけられると思いますよ。

    キャンセル

  • 2015/04/06 15:40

    ありがとうございます!!!!
    出来ました!!!(^^ゞ☆彡

    お世話になりました!!

    キャンセル

  • 2015/04/06 15:41

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

    キャンセル

0

日付を検索する

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

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

私なら以下のようにします.
1. TODAY()のセルからValue2プロパティでシリアル値を取得し,関数MONTH()で月に変換
これを使うために,ワークシート関数をVBAで使用する
2. 1.の月からシート名を設定し,Sheets(シート名)で検索対象のシートを決定
必要に応じて月の数字を全角に変換(StrConv)
3. 2.のシートの特定の列に対して検索を実行

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/03 14:55

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

    キャンセル

  • 2015/04/03 15:02

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

    キャンセル

  • 2015/04/03 16:28

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

    キャンセル

  • 2015/04/04 23:15

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

    キャンセル

  • 2015/04/05 00:34

    繰り返しすみません
    >うんともすんとも動かず、カーソルもピクリともしないという感じです。
    これは実行した結果,何も起きないということではないでしょうか?

    上のコードをよく見てください
    あなたのコードで使っているセルと違う場所を指定していますよ
    あなたのシートでC1が空なら「空の文字列」を検索することになるのでヒットせず,
    結果「何も起きない」ということになっていると推測します.

    もし「うんともすんとも」の意味が,操作を全く受け付けない状態になるというのであれば私にもわかりません(コードを見る限りそんなことは起こりえないと思うのですが)

    繰り返しますが,1行ずつ実行して見てください.どこでおかしいのかが少しは見えてきますから.

    キャンセル

0

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    【ファイル名の読み込み】

    23歳OLです。 会社でマクロを組むことになりましたが、 初心者過ぎて全然よくわかりません。 お忙しいところ大変恐縮ですが、教えていただけないでしょうか。 ※やりたいことがわか

  • 解決済

    【マクロ】選択した項目の列をすべて抽出して別シートへ

    100行3000列ほどのエクセルデータから キーワード=項目 が一致する列を抽出したいです。 上記のようなデータ一覧から    A    B   C 1 年賀状  氏名  誕生日

  • 受付中

    VBAの効率化

    VBAの効率化(というより基本的な書き方?)についての質問です。 以前作成したコードを再度流用することとなり、知識0の状態で作っていた酷い有様のコードを ちょっとはマシな形にしよう

  • 解決済

    【内容追記】あるExcelの複数のシートから、特定の値を持つ「行」のみ別のExcelへ抽出したい

    Excelでのマンションの売上管理を行うこととなりました。 今までは1シート1マンションという形で管理しており、全体の数字や予定等を見る際に手間がかかっていました。 これを期に

  • 解決済

    VBAでアンケート結果を振り分けたい

    前提・実現したいこと excelにてアンケート集計表を作成しています。 入力シートの各行の回答群を違うシートにコピーするVBAを書いていますがうまくいきません。 全シート

  • 解決済

    エクセルマクロでグラフが表示されないです。

    グラフを各シートから値をひっぱてきて重ねて表示したいのですが、 グラフを重ねるどころか真っ白になってしまいます。 いろいろ調べてみたのですが解決できませんでしたのでご教授願

  • 解決済

    【マクロ】グラフのX系列の値を指定したいのにできません。

    グラフのX系列の値をRange("T1014:T3014")を指定したいのですが、何故かX系列の値がRange("N1014:N3014")になってしまいます。 cht.Seri

  • 解決済

    VBAの配列の質問

    VBAの配列で教えてほしい事があります。 同一ブック内に2つのsheetがあります。 ”集計結果”と”一時保管”です。 ”一時保管”はA~D列にデータが入っています。

同じタグがついた質問を見る

  • VBA

    1786questions

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