• ベストアンサー

Excel マクロについて

仕事の都合で以下のような仕様のマクロ(VBA)を緊急で作成しなければならなくなったのですが、どのようなコードになるんでしょうか? 仕様 ・今月分のデータを手入力すると先月分のデータと比較して、当月比を自動入力する。 ・当月比とは単純に先月分と今月分とのデータの差。 (例) ファイル1(先月分)     5%(0%) ファイル2(今月分) 手入力→6%(1%) 自分でもマクロについてあまり分かっておりませんので伝わりづらいと思いますが、何卒緊急のため、宜しくお願いいたします。

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

  • ベストアンサー
  • xkuonx
  • ベストアンサー率41% (23/56)
回答No.4

たびたびすいません。 マクロのソースが気に食わないので修正&ついでにファイル3からデータ読み込んでみました。 Sub hikaku()   Dim book As Workbook   Dim sheet As Worksheet   Dim other_book_data As Integer   Dim cnt As Integer   Dim total As Integer     '他ファイルを読み込み先月との比率を出力   Application.ScreenUpdating = False 'Openしたファイルがアクティブになるのを防止   Set book = Workbooks.Open(ThisWorkbook.Path & "\ファイル1.xls") 'カレントディレクトリからファイルを読み込む   Application.ScreenUpdating = True   Set sheet = book.Worksheets("Sheet1") 'シート名を指定する   other_book_data = sheet.Range("A1").Value '指定したセルのデータをother_book_data変数に保存     'ファイルから読み込んだ値を計算して出力   ThisWorkbook.Worksheets("Sheet1").Range("B2").Value = Range("A1").Value - other_book_data   book.Close 'ファイルを閉じる       '他ファイルを読み込みデータの計算   Application.ScreenUpdating = False 'Openしたファイルがアクティブになるのを防止   Set book = Workbooks.Open(ThisWorkbook.Path & "\ファイル3.xls") 'カレントディレクトリからファイルを読み込む   Application.ScreenUpdating = True   Set sheet = book.Worksheets("Sheet1") 'シート名を指定する     cnt = 1   total = 0   Do While True '無限ループ開始     other_book_data = sheet.Range("A" & cnt).Value '指定したセルのデータをother_book_data変数に保存     If (sheet.Range("A" & cnt).Value = "") Then       Exit Do 'データが尽きたら無限ループ終了     End If         'A4セルから下に向かって読み込んだデータを出力     ThisWorkbook.Worksheets("Sheet1").Range("A" & cnt + 3).Value = other_book_data     total = total + other_book_data     cnt = cnt + 1   Loop   ThisWorkbook.Worksheets("Sheet1").Range("A" & cnt + 3).Value = "合計:" & total   ThisWorkbook.Worksheets("Sheet1").Range("A" & cnt + 4).Value = "平均:" & total / (cnt - 1)   book.Close End Sub 参考にどうぞ。 ※コピーする場合全角スペースを半角スペースに変えてください あと補足。セルに「6%」って入力してEnterを押したら「6%(1%)」と表示を変えるのは関数だけじゃできないです。 マクロ使えば出来るかもしれませんが、 私だったら例えばA列をデータ用の列として利用するものとし、 A1に6%(又は0.06)と入力し、 B1=A1 & "(" & TEXT(A1-[ファイル1.xls]Sheet1!$A$1,"0%") & ")" のようにすると思います。A列を印刷したり見せたくなかったら非表示にすれば良いと思います。

その他の回答 (3)

  • xkuonx
  • ベストアンサー率41% (23/56)
回答No.3

>ただ、6%(1%)はひとつのセルに入れなければならないのですが、そういったことは可能でしょうか? A1=0.06 A2="(" & TEXT(A1-[ファイル1.xls]Sheet1!$A$1,"0%") & ")" ↓ A1=0.06 & "(" & TEXT(A1-[ファイル1.xls]Sheet1!$A$1,"0%") & ")" のように&でくっつけられます。 ただし、くっつけた場合A1セルのデータは数値ではなく文字列扱いとなるため、 6%という値を計算に使う事はできなくなります。 計算に使いたいのなら1列だけ作業用の列を決めてその列にデータを保存し、その列は非表示にすれば良いかなと思います。 >また、マクロを使って手入力部分を自動入力にする(ファイル3から数値を取ってくる)ことは可能でしょうか? 手入力部分を自動入力する、というのが抽象的で何がしたいのかあまりわかりませんが、 ファイル3の中から数値を取るのはNo2で回答しているマクロと同様にすれば可能です。 Sub hikaku() Dim book As Workbook Dim sheet As Worksheet Dim other_book_data As Integer Set book = Workbooks.Open(ThisWorkbook.Path & "\ファイル1.xls") ←ファイル1.xlsの部分が読み込むファイル名 Set sheet = book.Worksheets("Sheet1") ←ファイルの中の読み込むシート名 other_book_data = sheet.Range("A1").Value ←シートの中の読み込むセル ThisWorkbook.Worksheets("Sheet1").Range("B2").Value = Range("A1").Value - other_book_data ↑ここで実際にセル内容を書き換えてるので、ループなどを用いてファイル3から入力した値を順次書き出していけば良い End Sub

参考URL:
http://excelvba.pc-users.net/
  • xkuonx
  • ベストアンサー率41% (23/56)
回答No.2

ちなみにマクロを使った場合は簡単ですが下記のような感じになるのかなと思います。 Sub hikaku() Dim book As Workbook Dim sheet As Worksheet Dim other_book_data As Integer Set book = Workbooks.Open(ThisWorkbook.Path & "\ファイル1.xls") Set sheet = book.Worksheets("Sheet1") other_book_data = sheet.Range("A1").Value ThisWorkbook.Worksheets("Sheet1").Range("B2").Value = Range("A1").Value - other_book_data End Sub

参考URL:
http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_070_11.html
  • xkuonx
  • ベストアンサー率41% (23/56)
回答No.1

それはマクロでは無いとダメでしょうか? 普通に関数というか式を入力する事で簡単に出来ると思われます。 ▽ファイル1.xls ・Sheet1 A1=0.05 ※セルの書式設定をパーセンテージにする事により0.05は5%と表示されます ▽ファイル2.xls ・Sheet1 A1=0.06 A2="(" & TEXT(A1-[ファイル1.xls]Sheet1!$A$1,"0%") & ")"

suiken8
質問者

補足

回答ありがとうございます。 たしかにマクロである必要は無いのかもしれません。 ただ、6%(1%)はひとつのセルに入れなければならないのですが、そういったことは可能でしょうか? また、マクロを使って手入力部分を自動入力にする(ファイル3から数値を取ってくる)ことは可能でしょうか? 回答を頂いたうえ、あつかましいお願いであるとは承知しておりますが、宜しければご教授ください。

関連するQ&A