こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

EXCELでの特殊な検索方法

eccelに入力しているテーブルがあります。
入力値は”10.0/-10.0”といったフォーマットで入力されています。
入力されたデータの中に10./-10.0 or 10.0/-10.というようにピリオド以下の”0”がぬけている個所がいくつか見つかりました。データとしてはあまりよくないので修正
したいと思っています。上記の様にピリオド以下に何もない箇所だけを検索したいのですが、いい方法はないでしょうか?またデータのパターンとしては10.5/-10.5などとピリオド以下に0以外の数値がある場合もあります。

投稿日時 - 2019-02-06 15:08:20

QNo.9585208

すぐに回答ほしいです

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

検索ではありませんが関数で形を整えて上書きしてやれば良いのでは?
添付の図ではA1:A4に値が入っています。
B1に=TRIM(SUBSTITUTE(SUBSTITUTE(A1&" ",". ",".0"),"./",".0/"))
と入れてB4までコピーすると形を整えた文字列になりますのでこれをコピーしてA1:A4に値貼り付けします。

投稿日時 - 2019-02-06 16:07:27

お礼

なるほど、確かにこの方法で成形しなおせば目的がはたせそうです。
貴重な回答ありがとうございました。

投稿日時 - 2019-02-08 14:45:31

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

【補足の補足】Left(データ_1,3) & '0' & Mid(データ_1, 4)

 3と4は、もちろん所定の関数を用いて求めて指定します。ここでは、安直に「そうすれば・・・」を示しているに過ぎません。なお、SQL文は、Access のそれではなくて SQL Server などの書き方でないと通用しません。ワイルドカードが’*’ではなくて'%'であるのは、そういうことです。ちょいと、補足の補足をしておきます。

投稿日時 - 2019-02-08 14:15:06

ANo.5

【補足】SQLを使うって手もあります。

 回答4を読んで、「ウン、そうだ!」と思い、SQLのパターンマッチを利用する手を考えました。その為には、データを参照する関数とSQL文を実行する関数を用意する必要があります。それらを、突貫工事で作成してテストしました。以下は、【イミディエイトウインドウ】でそれらを使った修正の試みです。

・パターンを個別に指定すれば修正可能!

 これが、テストの結果が示すところです。

【イミディエイトウインドウ】
? DBSelect("SELECT データ_1 FROM [Sheet1$B1:B4]",,chr(13))
10.0/20.0
10./20.0
10.0/20.
? DBSelect("SELECT データ_1 FROM [Sheet1$B1:B4] WHERE データ_1 LIKE '%./%' ",,chr(13))
10./20.0
? DBSelect("SELECT データ_1 FROM [Sheet1$B1:B4] WHERE データ_1 LIKE '%.' ",,chr(13))
10.0/20.
? DBSelect("SELECT Left(データ_1,3) & '0' & Mid(データ_1, 4) FROM [Sheet1$B1:B4] WHERE データ_1 LIKE '%./%' ",,chr(13))
10.0/20.0
? DBSelect("SELECT データ_1 & '0' FROM [Sheet1$B1:B4] WHERE データ_1 LIKE '%.' ",,chr(13))
10.0/20.0
? CnnExecute("UPDATE [Sheet1$B1:B4] SET データ_1=データ_1 & '0' WHERE データ_1 LIKE '%.' ")
True
? DBSelect("SELECT データ_1 FROM [Sheet1$B1:B4]",,chr(13))
10.0/20.0
10./20.0
10.0/20.0

 冒頭のDBSelect関数は、修正前のデータを取得して表示しています。次に、それぞれのパタ―ンに合致するデータを抽出しています。次に、そのデータを修正する方法を確認しています。そして、CnnExecute関数でUpdate文を実行。最後に、もう一度、全てのデータを取得して表示しています。一応は、例示されている不具合は、イミディエイトウインドウでSQL文を実行することで修正されています。10./20.0の類も、一回だけSQL文を実行すれば修正されます。

 まあ、こういうやり方もあるかと思います。が、こんな関数を作成し色んなテストをするよりも目視修正が手っ取り早いかと思います。ということで、今回書いた関数のご紹介は現時点では控えておきます。もちろん、興味と関心があれば、その旨を補足されて下さい。

投稿日時 - 2019-02-08 13:59:13

ANo.4

文章で、見つけたい状態を表現するなら、どうなる?。この思考・表現の訓練と過程は役立つと思うよ。箇条書きに条件を分けて表現する訓練も役立つと思う。
 少し厳密に質問を書いたらどうなる?。しっかり考えて質問すべきだと思う。
ーー
 ただし、こういうのは、正規表現という仕組みで、ひっかかるのが限度で、それ以上は、普通人にはむつかしいと思う。
正規表現などを、勉強している暇があったら、1つずつ目視でつぶすほうが早いと思う。
ーー
私の独断と偏見では、
 ・/の前のピリオド
 ・文字末尾の前のピリオド
に続けて後に、数字が最少1字以上あること。
となるのかな?
(/は必ず1つあるのかな?)
ーー
上記の条件をプログラムに載せるのは、VBAなら何とかなりそうだが、小生では、正規表現ではお手上げ。

投稿日時 - 2019-02-06 17:51:50

ANo.3

【これは、回答ではありません。ただの一アイデアの提示です】

 Excel は操作したことのないズブのど素人。しかも、70歳のヨレヨレ爺。ですから、回答を書くのは無理。でも、ちょっと思ったことがあるので以下に述べてみます。それは、問題個所を探して訂正するよりも、全てを書き換える方が簡単なのではと言う事です。かかる感想だけでは、回答する資格がないので、全てを書き換える私なりのアイデアを示しておきます。

 添付図は、全てを書き換える要領を示しています。なお、以下は、同じ要領で、問題のセルをダブルクリックすると訂正するコードです。訂正件数がすくないのであれば、まあ、それでもいいかなと思って書いてみました。いずれも "/" の前と後を取り出してフォーマットして、それを合成しています。

Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
  If InStr(1, Target.Value, "/") Then
    Target.Value = Format(CutStr(Target.Value, "/", 1), "0.0") & _
           "/" & Format(CutStr(Target.Value, "/", 2), "0.0")
  End If
End Sub

《標準モジュール》

Option Explicit

Public Function CutStr(ByVal Text As String, _
           ByVal Separator As String, _
           ByVal N As Integer) As String
  Dim strDatas() As String

  strDatas = Split("" & Separator & Text, Separator, , 0)
  CutStr = strDatas(N * Abs(N <= UBound(strDatas)))
End Function

 やっぱり、入力データを検索して訂正する。これは、Worksheet_BeforeDoubleClick()のコードを全データに適用するだけだと思います。が、なんせ Excel の知識はゼロの私。それを示すことは不可能。でも、質問者なら出来ると思います。

投稿日時 - 2019-02-06 16:30:46

ANo.1

》 ”10.0/-10.0”といったフォーマットで入力されています
と仰っているのに、

》 入力されたデータの中に10./-10.0 or 10.0/-10.と
》 いうようにピリオド以下の”0”がぬけている個所が
のように半角文字の「/」があったり、全角文字の「0」があったりするのは矛盾していませんか?

投稿日時 - 2019-02-06 15:43:04

あなたにオススメの質問