- ベストアンサー
エクセルマクロでの計算について(2007)
- エクセルマクロ初心者のため、セルB1に計算式を入れています。その結果に応じてセルC1に計算結果を入れたいが上手く計算できません。
- 約65個のセルに同様の処理を行いたいが、どのようにすればよいかわかりません。
- エクセルマクロでの計算についての質問です。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
もう、これで終わりなのかもしれませんが、まず、まったくアットランダム(デタラメ)なら、マクロなど組めません。もう少し、丁寧に、その状態を説明してくれれば出来たはずです。 少なくとも、人間の目でワークシート上で認識出来るものに対して、不可能なマクロは少ないはずです。一定の数式があって、その隣に、数式なり値を入れるというなら、それ自体、規則だと思います。#1さんが規則性がありませんか?と聞いているのに、本当に何もないのなら、そもそも、マクロなどは無理です。人間が勝手に入れたものなどは、マクロの分野ではありません。 このような数式を探しているのではありませんか? =((480+(A1)*10)/480*I1) その隣に、数式などを入れるという話ではないのでしょうか? >計算式の係数もバラバラなのに気づきました。 "=(75 - (B1)) * 0.48" 係数がバラバラといっても、その係数には決まりがあるはずでは? あなたの頭の中にあって形にしていないものは、マクロにするのは無理です。 もう少し、質問を出すのでしたら、説明はきちんとしてください。 質問途中で、なるへく、条件を変えたり、増やしてはいけません。その場合は、一端締めて、新たに質問を立てたほうが、回答は進みやすいのです。 例えば、こんな風になります。でも、以下のコードを、係数を自動的に変換させるとか、難しいかもしれません。 でも、どんなものごとでも、言葉で説明できないものを、オンラインで、人に分かってもらうというのは、無理です。(占いカテでは違うようですが……) Sub Test1() Dim rng As Range Dim c As Range Const K1 = 75 '係数1 'ここは、配列変数にすることによって条件によって可変 Const K2 = 0.48 '係数2 'ひとつのワークシートから、数式を探す Set rng = ActiveSheet.UsedRange.SpecialCells(xlCellTypeFormulas, xlNumbers) Application.ScreenUpdating = False For Each c In rng.Cells '複雑な数式を検索する場合は、コードが違う If c.Formula Like "=((#*" And c.Offset(, 1).Value = "" Then If c.Value <= 70 Then '数式は、規則性があれば、係数の変更も可能です。 c.Offset(, 1).Formula = "=(" & K1 & "-(RC[-1])) * " & K2 Else c.Offset(, 1).Value = "'-" End If End If Next c Application.ScreenUpdating = True End Sub
その他の回答 (8)
- k415
- ベストアンサー率25% (2/8)
マクロにするとシンプルです。 Sub Macro1() ' Dim i As Integer For i = 1 To 65 Cells(3, i).FormulaR1C1 = "=IF(R[-1]C>70,((75-R[-1]C)*0.48),""-"")" Next End Sub これで1列目から65列目までの3行目に式を代入します。 式は、相対参照になっているので、式が挿入された上のセルの値を読み込んで計算します。 Cells(ROWS, COLUMS)ですので、そこさえわかればあとは、修正できるのではないでしょうか。 健闘を祈りますw
お礼
お礼が遅くなり申し分けありません。 お忙しい中何回も回答ありがとうございました。 もう少しVBAの基本を勉強してから出直したいと思います。
補足
たびたび申し訳ありません。 本日会社で試してみたのですが、 該当するセルが列・行ともに不規則で、また 計算式の係数もバラバラなのに気づきました。 セルに直接関数を入力する選択肢もあるとは思いますが、 こちらの環境では他のマクロ・関数との兼ね合いや使用する人の 兼ね合いもありましてマクロ上で計算することにいたしました。 そこで65個のコードを入力するしかなくなったのですが、 いろいろ試行錯誤してみたのですが、思うような結果になりません。 どうすればよいか教えてもらえないでしょうか? Private Sub 計算_Click() Worksheets("sheet1").Select If Range("B1").Value <= 70 Then Range("C1").Value = "=(75 - (B1)) * 0.48" Else: Range("C1").Value = "-" End If End Sub 今の状態ですと、[ If Range("B1").Value <= 70 Then] この判定も上手くいっていないような気がしています。 (Elesの時に”-”が入らないので)
- k415
- ベストアンサー率25% (2/8)
= IF(B1>70,((75-B1)*0.48),"-") でした。カッコが1つ足りてないですね。 これでエラーがでるのであれば、R1C1形式を使っていたりしませんか? その場合、 =IF(R[-1]C>70,((75-R[-1]C)*0.48),"-") となります。マクロもいいですが、 マクロを使わないで良いなら使わないのが最適だと思います。 人にあげるときに、制限だったり色々面倒なので。 うまくいくといいですね。
補足
丁寧な回答ありがとうございます。 試した結果望んだとおりの物となりました。 とても勉強になりました。 しかし、贅沢を言うようで申し訳ありませんが、 ほかのマクロとの兼ね合いもありまして、 できればマクロ上で計算できればベターです。 今後の参考にもしたいのでマクロ上でこの計算を するにはどう記述したらよいかお教え願えないでしょうか。
- k415
- ベストアンサー率25% (2/8)
単純にif文じゃだめなんですか? C1 = if(B1>70,(75-B1)*.48),"-") これで、参照する行が同じなら、横にコピーしていけば、参照セルも自動で移動すると思いますが。。
補足
最初に直接IF文をセルに設定する方式でやってみたのですが 計算してくれませんでした。 ご教示頂いた計算式も試してみたのですが 私の環境ではエラーになりました。
- pp300a
- ベストアンサー率12% (11/87)
Valueプロパティを使う方法もあります これを使えば ” ” をつけてもOKです Range("C1").Value = "=(75 - (B1)) * 0.48"
補足
それも試してみたのですが計算されなく また、"C1"が75より大きい場合も"-"が入力されませんでした。 それぞれのセルが複数のセルを結合していると無理なのでしょうか??
- Makimakichoko
- ベストアンサー率0% (0/1)
Sub 楕円3_Click() Dim i As Integer 'カウンター i = 0 Dim a As Integer '行 a = 1 Dim b As Integer '列(C列前は使用中と判断しD列からスタート) b = 4 Do Until i = 65 '65個終わるまでループ Do Until a = 32767 'こんなにセルを使用するか分りませんが・・・ If b = 256 Then ’最右列までいったら強制終了 End Else If Cells(a, b) = "" Then ’なにも入力されていなければスルー Else If Cells(a, b) <= 70 Then ’70以下であれば ’C列の入力されている数字の行に↓を入れる Range("c" & a).Formula = "=(75-(b" & a & "))*0.48" i = i + 1 Else ’70以上であれば ’C列の入力されている数字の行に↓を入れる Range("c" & a).Value = "-" i = i + 1 End If End If End If a = a + 1 Loop a = 1 ’行リセット b = b + 1 ’列移動 Loop End Sub 全体像が未だに見えてきません・・・
補足
丁寧な回答ありがとうございます。 参考にさせていただき試させていただきます。
- Makimakichoko
- ベストアンサー率0% (0/1)
始めまして。 ご質問なのですが、 (セルの列はバラバラです) というのはA列は任意の数字、B列は数式、C列は結果 と言う事でしょうか? もしくは、D列E列F列…とバラバラの所に入力されているのですか?
補足
はじめまして。 バラバラというのは65個の処理をしたいセルが 列も行もバラバラなところに入力しているということです。 なのでそれぞれにコードを記述するつもりでいます。
- kmetu
- ベストアンサー率41% (562/1346)
Range("B1")はボタンのあるSheetのセルを参照するのですが それでよろしいのでしょうか?
補足
B1セルの計算結果の数値を参照したいのですが どのようにしたらよろしいでしょうか?
- pp300a
- ベストアンサー率12% (11/87)
” ” で括ると それは文字列として扱われます 文字列では計算はできません 65個のセルに対して処理を行うには 1、 65個のセルに対する処理のコードを65個分書く 2、 規則性を見つけてループ処理をする 規則性は無いのですか?
補足
規則性はないので65個分のコードを入力しようと 思っています。 ご指摘通りに" "を削除してみたのですがエラーがでました。 どのように修正すればよいか教えていただけませんか? Private Sub 計算_Click() Worksheets("sheet2").Select If Range("B1").Value <= 70 Then Range("C1").Formula = "=(75 - (B1)) * 0.48" Else: Range("C1").Value = "-" End If End Sub
お礼
回答ありがとうございます。 おっしゃる通りこちらの情報をまとめきれないまま質問をしてしまい 回答をいただいた皆様を混乱させてしまいまして申し訳ありませんでした。 皆様の回答を参考にさせていただき、家のPCと会社のPC (会社では個人のPCが無くなかなかPCを触れる環境にないので)を往復しながら 試行錯誤していますが、まだ上手くいっておりません。 >係数がバラバラといっても、その係数には決まりがあるはずでは? >あなたの頭の中にあって形にしていないものは、マクロにするのは無理です。 係数にはほんとに規則性はなく、該当セルも不規則に並んでおり、 セルの位置などもほかのセルの状況から変更はできない状況です。 直接セルに計算式を入れる方法も考えたのですが、自動計算した後に 現場の状況に応じて計算結果を書き換えることもたまにあるので、 直接計算式を入れてしまうと書き換えができなくなる(計算式を消してしまう) ことからマクロで一つ一つのセルに65通りのコードを記述しようと考えていました。 ご指摘の通り質問の途中で条件を後付けしたり変えたりすると回答もしにくいですよね。 これから質問をするときにはもう少し回答者の方にこたえてもらいやすいように 気をつけます。 とても勉強になりました。 分かりにくい質問にも関わらず丁寧なコードをありがとうございます。 参考にさせていただきます。