[[20060612145434]] 『文字列を数字にして計算したい』(のんきつ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『文字列を数字にして計算したい』(のんきつ)
EXCEL2002、WINXP

 こんにちわ。またまたお世話になります。
データ入力シートに
   A         B
50個/10.5g    =50/10.5*1000
267個/100.2g   =267/100.2*1000
  :        :
  :        :
と言った感じで、入力しているのですが、
左は文字列で、自動的に右を計算できません。
=LEFT(A1,FIND("個",A1)-1)
でA1の50を取り出すことには成功したのですが、文字列になるため計算できないようです。
共有ファイルのため、列を増やしたりすることが出来ないので、
何とか数式やセルの書式設定で
A列を入力すればB列が自動で入力される。
もしくはB列を入力すればA列が自動入力される方向に持って生きたいのですが、
何かいい知恵をお貸し願えませんでしょうか・・・。
よろしくお願いいたします。


 =LEFT(A1,FIND("個",A1)-1)*1
 で数値になります。


 レスありがとうございます。
これで計算できそうです(^^)
ただ、まだ解決できない問題がありまして・・・。
続いて申し訳ないのですが、
=RIGHT(A1,LEN(A1)-FIND("/",A1))
で、10.5gは取り出せたのですが、gを取り除く方法をご存知ではないでしょうか?

 *LEFT(A1-FIND("g",A1))
をくっつけても、取れてくれないのです(ノ_<。)
(のんきつ)

 =--SUBSTITUTE("10.5g","g","")
とすれば、10.5を数値として取り出せます。
(ROUGE)

 =LEFT("10.5g",LEN("10.5g")-1)*1
       ~~~~~~~     ~~~~~~~
 とすると、最後の一文字より前が取り出せるので
 10.5g=RIGHT(A1,LEN(A1)-FIND("/",A1))まで行っているのなら

 =LEFT(RIGHT(A1,LEN(A1)-FIND("/",A1)),LEN(RIGHT(A1,LEN(A1)-FIND("/",A1)))-1)*1
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 なんてのも。

 (HANA)


 分母の小数点以下1ケタ限定で、
 =("0 "&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"個",""),".",""),"g",""))*10000
(純丸)(o^-')b

 (ROUGE) 様、(HANA)様、(純丸)様、ありがとうございます。
皆様の数式を組み合わせて、何とかやりたいことが出来ました。
ただ、(純丸)様の数式を当てはめると、数値が微妙にずれちゃうんですよね。
分母の小数点以下は必ず1桁です。
=("0 "&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"個",""),".",""),"g",""))*10000
 ^^^^^                              ^^^^^^^
このあたりがあやしいな〜と思っているのですが、意味がよくわからないのです。
なぜ0?なぜ0の後に空白?なぜ&?なぜ*10000?1000じゃなくて???
日が経ってしまったのですが、もう一度ご教授願えませんでしょうか。
よろしくお願いいたしますぅ <(_ _)>
(のんきつ)

 SUBSTITUTE関数で、「個」と「.」と「g」を取っちゃってますから、
 =("0 "&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"個",""),".",""),"g","")) では
 0 50/105 となります。(この時点では文字列)
 エクセルでこの形は分数となります。試しにセルに 0 1/2 と入力してみて下さい。
 数式バーには、0.5 となるはずです。1 1/2 なら 1.5 です。
 小数点を取って分母が10倍されてますので、*10000 とすると 50/105*10000 となり
 50/10.5*1000 と同じ答えが返るはずです。
 一番最初に提示された数式が端数処理無しだったので私もしてませんが、
 ここらあたりの誤差ということはないですか?
(純丸)(o^-')b

 すごい数式が次々登場してきて、いろんなテクニックが勉強できますが、
 そもそも、 データ入力シートに
   A
 50個/10.5g

 のようにしているのが話をややこしくしているような気がします。

    A      B      C
 1 個数   重量   kgあたり個数
 2   50   10.5  =A2/B2*1000

 のように入力するのが本筋ではないでしょうか。必要なら表示形式で #個 とかすれば
 50個 と表示されますし、計算するときに 「個」が邪魔になることもありません。
                                                                     (ホグペン)

 まったくもって(ホグペン)様のおっしゃるとおりだと思うのですが、
先々代より語り継がれた(笑)古のファイルで、おじ(い)様方は、
この入力方法が一番見やすいと思っておられる以上、
ぺーぺーは小手先勝負で頑張るしかないんです(涙)
ここで勉強して力をつけて、いつか見やすくて入力しやすいファイルに変換してやります!e(^。^)9  

 (純丸)様のすごくわかりやすい説明で、おばかな私も理解することが出来ました。
あれから、検証しても間違いがわからなかったので、多分私の入力ミスかセルの選択ミスでしょう。
お騒がせいたしました。
0を入れて、文字列で分数を表すなんてすごいですね。
皆様ありがとうございました。
(のんきつ)

 あ、ちょと遅かったか〜
 いや、おじ(い)様方バージョンのユーザー関数を作ってみたんですけどなぁ・・・

        30個/20g
        40袋×5
        20打*12本
        50個÷10.2g×100
 こんな塩梅に全角半角乱れウチでもOKですわ。
 標準モジュールに下のコードをコピペして
 =txtcalc(a1)といった塩梅に入力してください。
        (弥太郎)
 '-----------------------
 Option Base 1
 Option Explicit
 Function txtcalc(adrs As Range)
    Dim i As Integer, n As Integer, j As Integer
    Dim sp_data(), data, ev_data, ary

    data = StrConv(adrs.Value, vbNarrow)
    data = Replace(data, "÷", "/")
    data = Replace(data, "×", "*")
    ary = Array("*", "/", "+", "-")
    j = 1
    For i = 1 To Len(data)
        If Mid(data, i, 1) Like "*[*/+-]*" Then
            For n = 1 To 4
                If Mid(data, i, 1) = ary(n) Then
                    ev_data = ev_data & Val(Mid(data, j, i - j)) & Mid(data, i, 1)
                    j = i + 1
                    Exit For
                End If
            Next n
        End If
    Next i
    ev_data = ev_data & Val(Mid(data, j, i - j))
    txtcalc = Evaluate(ev_data)

 End Function

 えとですねェ、違う方法で(aryをLikeで取得する方法)の名残がそのまま残っており
 ましたんで、書き換えときます。勿論前回のコードでもOKですけど、回り道しとる
 みたいなんでこれにしときまひょう。
      まだ昨夜の敗戦を引きずってる(弥太郎)


 (弥太郎)様、ありがとうございます。
標準モジュールにコピペして、adrs As Rangeをセル番地にしてみたのですが、
うまく動いてくれません。
VBA初心者過ぎてよくわかっていないので、パワーアップツールとしていただきますね。
これが本当に使えるようになったら、おじ(い)様方はとても喜ばれると思いますし、私の知識の蓄えにもなるので一石二鳥ですね。
でも、ファイルを開くたびにマクロの有無を聞かれるので、おじい様方はびっくりしちゃうかも(笑)
                      昨日の楽天戦を引きずってる(のんきつ)

 例えば
    	A                              B
 1  30個/20g               =txtcalc(a1)
 2  40袋×5                         ↓
 3  20打*12本        コピー
 4  50個÷10.2g×100
 5  30*4個
 6  40個*2+5
     ↑
 こんな塩梅にデータが並んでるとして   ↑ こう入力します。
 それに100倍したかったら =txtcalc(a1)*100っちゅう風に入力すればOKデス。
 お分かりになりまっかぁ?
 日本最弱のチームに捻られるなんて・・・(涙
       (弥太郎)  

 (弥太郎)様、
今世紀史上最弱のチームに逆逆逆逆転サヨナラ負けした気持ちは
とってもよくわかるのですが、
弥太郎様のこーどをつかいこなせないのです(涙)
本当はA列ではなくE列(しかも4行目から)をF列に変換したいのですが・・・。
というよりも、標準モジュールにコピペしてから、動かせない?
|>ボタンを押しても実行にならないし・・・。
マクロの名前を書きなさいとかって出てくるんです・・・。
(のんきつ)今日こそは・・・。


 弥太郎さんに代わりましてお答えを。

 > 標準モジュールにコピペしてから、動かせない?

 標準モジュールにこぴぺしておけば、後は普通の関数と同じように使えます。

 A1 に 50個/10.5g というデータがあれば、たとえば B1 に  =txtcalc(A1) とすると、
 B1 に 50÷10.5 の結果が表示されます。

 実家が西宮市上甲子園、聖地甲子園球場から徒歩10分の (ホグペン)でした。


おぉ〜すばらしい!!!
 意味がやっとわかりました。
しかも関数が簡単だ!
 (ホグペン)様、解説ありがとうございます。
今日は余裕を持って試合観戦に臨めます♪
     かつては甲子園を見ながら通勤 (のんきつ)

 ボクベンさんフォローおおきに〜
 助かりましたワ。これからもよろしゅう(笑

 いいええな、今日も例によって昼から例の所へハイキングに行っとりましたんですワ。
 のんきっつぁんのスレに後ろ髪を引かれる思いがしましたけど、ま、大丈夫やろと
 勝手に決め込んだんが日本代表同様 甘・か・っ・た(笑
 
 お礼ついでに土産話を・・・といきたいところなんですが、ほら、これも例によって
 でけ上がってますから・・・次の機会に譲りますワ。あ、いや、どうしよう・・・(笑

 ええい、ここは心を鬼にして、本来のレスに戻ります。
 えと、これで関数の一覧のTグループにtxtcalcが登録されとると思いまんねんけど
 一時のTみたいに他の関数に比べて見劣りするようやったら関数名をTxtCalcなり  
 TEXTCALCなり見栄えのええのんに変えてもろたらよろしいかと・・・。

 それと、これはスペシャルサービスになるか(笑
 下のコードを同じく標準モジュールに登録しとくと、その関数の解説が表示されます。
 一旦保存して開いたらの話ですけど。
 Sub auto_open()
    Application.MacroOptions macro:="txtcalc", _
    Description:="文字列が含まれとっても計算しまっせ"
 End Sub

 只今トリプルプレーを完成! でも負けとる・・・ショボン
      (弥太郎)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.