• 締切済み

必要な単語だけ取り出すマクロ

”今日の温度は20℃だった。暑い1日だった。”こんな文章があります。 この文章から、”20℃”という言葉だけ取り出して、他の言葉は削除するマクロを教えてください。

みんなの回答

回答No.4

こんにちは。 一般的に、マクロというのは、 実行前の元の状態に戻すことが出来ないもの ですから、元データを消す(上書きする)内容の作成依頼には、 皆、消極的になります。 そうした設計のリスクや、多くの場合設計の見直しになること を経験的に承知している人が回答者には多いからです。 とりあえず、今の時点で解っている (このページに書かれている)要求仕様に応える形で、 簡単に(確認ダイアログ付き)マクロを書きました。 一応、 "消す"マクロというのは、よーく確かめてから使うものですから、 "消えても困らない"ようにバックアップを取っておく等、 十分に対策をしてから試すようにしてください。 試した上で、"消す"マクロが本当に必要なのか、  元のデータを維持したまま、隣のセルに書きだすとか、 設計の見直しでより良い仕様を見つけられないか、 よーく検討なさってください。 その他の点も含めてもし疑問があれば、 こちらに詳しく伝わるように補足欄にでも書いてみて下さい。 直ちにお応えできる内容でしたら、再度回答するつもりでいます。 > →エクセル のシート上(セル範囲)にある > →たくさんの文章から、> 文章から、  摂氏度表記(数値と記号℃)  【##℃】【-##℃】【##.#℃】【-##.#℃】 (全角文字 可) > という言葉だけ(摂氏度データ文字列を各セル一件だけ)取り出して、 > 他の言葉は削除する(摂氏度表記がなければ空白にする> →そうです。)マクロ ■テストした(抽出可能な)サンプル(***は℃記号を含まない和文文字列)  ***20℃***  ***-21℃***  ***26.3℃***  ***-27.5℃***  ***28℃***  ***40℃***  ***31.5℃***  ***-32℃*** ' ' // 処理したいセル範囲を事前に選択してから実行 Sub Re9374800Wc() Dim oRegExp As Object, c As Range, sBuf   If TypeName(Selection) <> "Range" Then MsgBox "セル範囲を選択してやり直し": Exit Sub   If MsgBox("選択中のセル範囲にある文字列から" & _     vbLf & "摂氏度表記データ【##℃】部分のみ抽出し、置き換えます。" & _     vbLf & "該当しない文字列を削除することになりますが、" & _     vbLf & "実行しますか?" _     , vbQuestion Or vbYesNo) <> vbYes Then Exit Sub   Set oRegExp = CreateObject("VBScript.RegExp")   oRegExp.Pattern = "[--\..\d0-9]+℃"   Selection.SpecialCells(xlCellTypeConstants).Select   For Each c In Selection     sBuf = c     If oRegExp.Test(sBuf) Then       c.Value = oRegExp.Execute(sBuf)(0)     Else       c.Value = ""     End If   Next End Sub ' ' //

gennya
質問者

お礼

回答ありがとうございます。 大変助かりました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

補足していただいたのだが、肝心の、テキストのある「アプリは何か」を答えてない。 エクセルか? また結果の「何度」かという数値を、コンピュターで出したとして、素そデータを、あとどういう使い方(加工、平均を指すとか、グラフを描くとか等)をするのか書かないとだめだろう。 (下記解説例では画面表示するだけ。) ーー エクセルVBAはポピュラ―だから略し、WordVBAで考えてみるとする。 Wordの「文書」に、文例として ーー 今日は温度34°C、明日は温度36°Cの予想です。 名古屋は温度31°Cの予想 毎日暑い日が続く。 北海道では温度28°Cです。 ーー とあるとして、VBAのコードは 標準モジュールに Sub findPattern() With Selection.Find .Text = "温度*°C" .MatchFuzzy = False .MatchWildcards = True Do While .Execute MsgBox Mid(Selection.Text, 3, Len(Selection.Text) - 3) Loop End With End Sub とコードを作って、 文書の文章の初めを選択しておいて、実行すると 34° 36° 31° 28° と順次画面に表示される。 このデータをワードの表に整理するのは、近くまで来ているとは言える。 しかしワードの表をVBAで扱う経験がないと、VBAではできないだろう。 ちなみにVBAのコードの中の「温度」のあとの「アスタリスク」がワイルドカードといわれるものの利用での検索です。 ーー WordVBAは、市販の解説書も少なく、WEB記事で関連記事を探すのも時間がかかるしむつかしい。 質問文の書き方から推測して、質問者は多分VBAの初心者だろうから、あきらめた方がよい。 上記程度でも、小生も多少苦労した。これ以上は十分答える力はない。質問者もあきらめた方が時間の無駄をしないと思う。

gennya
質問者

お礼

回答ありがとうございます。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

条件は 「温度は*°C」などを、考えた方がよいのでは。 VBAには、Like演算子というのもあるから勉強すること。 もっと精緻に考えるなら、VBSciptのregExp(正規表現)の勉強に進むべきかと。 それらを使っても、条件が特殊だと、思うように抜き出せない場合もある。 抜き出して後の使い道も書いておくべきだ。 またこの質問での、(質問者が当面している実情を知られたくないなどの理由で)質問者の例えの仕方が悪いと、回答が的外れになる。 本当に温度の数値を問題にしたいのか? Wordにもマクロがあるが、エクセルの問題か?標題に記すること。 質問者の今のレベルでは、質問者が原文より目視で拾って、メモしたほうが早い(正確)のではないか。

gennya
質問者

お礼

回答ありがとうございます。 本当に温度の数値を問題にしたいのか? →そうです Wordにもマクロがあるが、エクセルの問題か?標題に記すること。 →エクセル 質問者の今のレベルでは、質問者が原文より目視で拾って、メモしたほうが早い(正確)のではないか。 →たくさんの文章から、抜き出したいので、マクロが良いです

  • mt2015
  • ベストアンサー率49% (258/524)
回答No.1

条件が良く解りません。 ・「20℃」と言う文字が含まれて無い場合は文字列削除? ・「気温20℃、水温20℃」の様に「20℃」が複数回登場する場合は?それとも複数回登場は無しと考えてよい? ・本当に「20℃」が対象?それとも温度を表す数値+℃だけにしたい?

gennya
質問者

お礼

回答ありがとうございます。 ご指摘に対する返事をさせていただきます。 ・「20℃」と言う文字が含まれて無い場合は文字列削除?   →そうです。 ・「気温20℃、水温20℃」の様に「20℃」が複数回登場する場合は?それとも複数回登場は無しと考えてよい? →複数回登場はありません。 ・本当に「20℃」が対象?それとも温度を表す数値+℃だけにしたい? →温度を表す数値+℃だけにしたい

関連するQ&A