[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロ[tfcalc]について』(あみちん)
あるセルに文字(例えば 5×3÷2)で入力しても、計算結果を示してくれる「tfcalc」というマクロの作り方をご教示下さい。
下記に例を示します。
A1セルに 5×3÷2(半角でも全角でも、*+-/ ×+−÷ のどれでも対応)
B1セルに =tfcalc(A1)
この場合、B1には、7.5 と表示。
※A1セルの入力値を変更するとB1セルの値は自動で計算されるというもの。
これのことですか?入手するのではなく、同じ機能のものを作りたいということですか?(YS) http://www.showacd.co.jp/info/info_0112.htm
=tfcalc(A1)といった表現は無理ですが、提示されている内容と同様の機能であれば 以下のようにすれば良いと思います。(INA)
<シートモジュール>
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = Range("A1").Address Then
Call tfcalc
End If
End Sub
<標準モジュール>
Sub tfcalc()
With Range("A1")
.Replace What:="×", Replacement:="*", LookAt:=xlPart
.Replace What:="÷", Replacement:="/", LookAt:=xlPart
.Replace What:="+", Replacement:="+", LookAt:=xlPart
.Replace What:="−", Replacement:="-", LookAt:=xlPart
End With
Range("B1").Formula = "=" & Range("A1").Value
End Sub
この解答はあみちんさんの問いの半分しか消化でけてえしまへんけど、このままスレが 沈んでいくんは忍びないんで私の分かる範囲でお答えしときますわ。
ModuleのGeneral Declarations(真新しいモジュールの1番上の行)に
Function tfcalc(data)
data = StrConv(data, vbNarrow)’この欄半角に直す作業
tfcalc = data * 5 ’A1の数値に5をかける作業
End Function
コレで一応ユーザー関数の出来上がりで、B1に=tfcalc(A1)と入力すればOKですわ
それはよろしおまんねんけど、さあ、文字列で入力された式を数式に変換して評価する っちゅう関数が、悔しい事に私にゃ分かりまへんねん。 まあ、こうやってスレ上げとったら上級者の目ぇに止まって教えてくれるやもしれまへ んさかい、もうちょっと待ってみまひょか。 (おいぼれ弥太郎)
実は、全角文字の括弧から小数点から数字から全てに対応しています。
誰が作ったかわかりませんが、そのファイルは手元にあります。
ただ、モジュールの見方がわかりません。
(ツール→マクロでは、それらしいものは存在しません)
どなたかご教示ください。
こんな初心的質問で申し訳ありません。
(あみちん)
はい、はい。 Alt+F11でモジュールが開きます。左の列にModule1〜順番に並んでると思いますさかい 片っ端から開いてみておくんなはれ。 もしModuleが見えなかったら標準モジュールっちゅうて書いてある所をクリックしてみ ておくんなはれ。左の列にそんなんがなかったら Ctrl+Rを押してみて下さい。 キッとええお宝が眠ってまっせぇ。 そこでお願いでんねんけど、そのお宝私にも拝ませて頂けまへんやろか。大いに勉強に なりますさかいな、お待ちしてますわ。 (おいぼれ弥太郎)
私にはよくわかりませんが、
'
Option Explicit
Private Token As String
Private TokenType As Integer '1:DELIMITER 2:NUMBER 3:FUNCTION
Private S As String
Private SLen As Integer
Private GP As Integer
Private KAKKO As Integer
Const DELIMITA As String = "+-*/()^"
Const NUMBER As String = "0123456789"
Const RAD As Double = 57.2957795130823
' 関数のエントリポイント
Function TFcalc(T2 As String) As Double
T2 = StrConv(T2, vbNarrow)
T2 = StrConv(T2, vbLowerCase)
T2 = Application.Substitute(T2, " ", "")
T2 = Application.Substitute(T2, "×", "*")
T2 = Application.Substitute(T2, "ラ", "*")
T2 = Application.Substitute(T2, "÷", "/")
T2 = Application.Substitute(T2, "=", "")
T2 = Application.Substitute(T2, "√", "sqrt")
T2 = Application.Substitute(T2, ",", "")
T2 = Application.Substitute(T2, "{", "(")
T2 = Application.Substitute(T2, "}", ")")
T2 = Application.Substitute(T2, "[", "(")
T2 = Application.Substitute(T2, "]", ")")
T2 = Application.Substitute(T2, "π", "3.14159265358979")
T2 = Application.Substitute(T2, "pi", "3.14159265358979")
T2 = Application.Substitute(T2, "rad", "57.2957795130823")
KAKKO = 0
GP = 1
S = T2
SLen = Len(S)
GetToken
TFcalc = sub1(0#)
If (KAKKO <> 0) Then
MsgBox "カッコの指定に誤りがあります。" _
, vbOKOnly + vbExclamation, "TFcalc"
TFcalc = 1 / 0
End If
End Function
' 加算・減算の処理
Function sub1(Value As Double) As Double
Dim Value2 As Double
Dim Token2 As String
Value = sub2(Value)
While Token = "+" Or Token = "-"
Token2 = Token
GetToken
Value2 = sub2(Value2)
Select Case Token2
Case "+"
Value = Value + Value2
Case "-"
Value = Value - Value2
End Select
Wend
sub1 = Value
End Function
' 乗算、除算の処理
Function sub2(Value As Double) As Double
Dim Value2 As Double
Dim Token2 As String
Value = sub3(Value)
While Token = "*" Or Token = "/"
Token2 = Token
GetToken
Value2 = sub3(Value2)
Select Case Token2
Case "*"
Value = Value * Value2
Case "/"
Value = Value / Value2
End Select
Wend
sub2 = Value
End Function
' べき乗の処理
Function sub3(Value As Double) As Double
Dim Value2 As Double
Dim Token2 As String
Value = sub4(Value)
While Token = "^"
Token2 = Token
GetToken
Value2 = sub4(Value2)
Select Case Token2
Case "^"
Value = Value ^ Value2
End Select
Wend
sub3 = Value
End Function
' 単項演算子の処理
Function sub4(Value As Double) As Double
Dim Token2 As String
If Token = "+" Or Token = "-" Then
Token2 = Token
GetToken
End If
Value = sub5(Value)
If Token2 = "-" Then
Value = -Value
End If
sub4 = Value
End Function
' カッコの処理
Function sub5(Value As Double) As Double
If Token = "(" Then
GetToken
Value = sub1(Value)
GetToken
Else
Value = Atom()
End If
sub5 = Value
End Function
' 数値の処理
Function Atom() As Double
Dim temp As String
Dim i As Integer
Dim Value2 As Double
If TokenType = 3 Then
Atom = Func(Token)
ElseIf TokenType = 2 Then
Atom = Val(Token)
GetToken
End If
End Function
'算術関数の処理
Function Func(str As String) As Double
Dim Value2 As Double
Dim str2 As Double
Select Case str
Case "sin"
GetToken
Value2 = sub4(Value2)
Func = Sin(Value2 / RAD)
Case "cos"
GetToken
Value2 = sub4(Value2)
Func = Cos(Value2 / RAD)
Case "tan"
GetToken
Value2 = sub4(Value2)
Func = Tan(Value2 / RAD)
Case "asin"
GetToken
Value2 = sub4(Value2)
Func = WorksheetFunction.Asin(Value2) * RAD
Case "acos"
GetToken
Value2 = sub4(Value2)
Func = WorksheetFunction.Acos(Value2) * RAD
Case "atan"
GetToken
Value2 = sub4(Value2)
Func = Atn(Value2) * RAD
Case "abs"
GetToken
Value2 = sub4(Value2)
Func = Abs(Value2)
Case "int"
GetToken
Value2 = sub4(Value2)
Func = Int(Value2)
Case "exp"
GetToken
Value2 = sub4(Value2)
Func = Exp(Value2)
Case "log"
GetToken
Value2 = sub4(Value2)
Func = Log(Value2)
Case "sqrt"
GetToken
Value2 = sub4(Value2)
Func = Sqr(Value2)
Case Else
MsgBox "関数 " + str + " は定義されていません." _
, vbOKOnly + vbExclamation, "TFcalc"
Func = 1 / 0
End Select
End Function
' トークンの切出し
Function GetToken()
Dim i As Integer
If GP > SLen Then
Token = ""
Exit Function
End If
If InStr(DELIMITA, Mid(S, GP, 1)) <> 0 Then
Token = Mid(S, GP, 1)
TokenType = 1
GP = GP + 1
If Token = "(" Then '括弧のチェック
KAKKO = KAKKO + 1
ElseIf Token = ")" Then
KAKKO = KAKKO - 1
End If
ElseIf InStr(NUMBER, Mid(S, GP, 1)) <> 0 Then
For i = GP To SLen
If InStr(DELIMITA, Mid(S, i, 1)) <> 0 Then
Exit For
End If
Next
Token = Mid(S, GP, i - GP)
TokenType = 2
GP = i
Else
For i = GP To SLen
If InStr(DELIMITA, Mid(S, i, 1)) <> 0 Then
Exit For
End If
Next
Token = Mid(S, GP, i - GP)
TokenType = 3
GP = i
End If
End Function
(あみちん)
ヒェ〜ッ!すごいっ!!! あみちんさん、ええ宝モン見つけてくれはりましたなぁ。イヤ〜、嬉しい嬉しい! 感謝感激、雨....ですわ、えぇえぇ。 なんや今年1番の大儲けした気分でっせ、ホンマに。 あみちんさんのご質問に似たようなのがなんぼかおましたけど、ココまで作業するの んははじめてみたいですわ、えぇ。
まだようまわしてまへんけど、=tfcalc(A1)で簡単に答え出すには裏方であれだけのコ ードが働いてまんねんなぁ。この方、相当の使い手と見受けられますわ、うんうん。
何とかお力添えに(なれへんなれへん)と思うてカキコしましたんやけど、とてつもな いお礼を頂きまして甚だ恐縮しておりますわ、えぇ。INAさんも小躍りして喜んでまっ しゃろさかい、彼の分も一緒にお礼言うときます。おおきに、おおきに。 (おいぼれ弥太郎)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.