マクロで数式の書き換えについて困っています

このQ&Aのポイント
  • 担当者一覧ファイルには各担当者の目標と売上のデータが入っています。
  • 担当者別にファイルを作成し、目標列は各担当者ファイルの対応する列を参照する数式に変更したいです。
  • 現在のマクロでは一括で置換されてしまい、正しく変更できない状況です。どのようにすると実現できるでしょうか?
回答を見る
  • ベストアンサー

マクロで数式を書き換えたい。

【処理概要】 担当者一覧ファイルがあり、そのファイルには各担当者の目標と売上がデータが入っています。 各担当者に目標を入力してもらうため、担当者別にファイルを作成し、かつ目標列は各担当者ファイルの対応する列を参照する数式に変更します。  例)担当者一覧.xlsxの「C2」はA.xlsxの「C2」を参照する。(数式:=[佐藤.xlsx]Sheet1!C2) 【悩み】 担当者別にファイルを作成するマクロは出来たのですが、目標列に元から入っている数式をうまく変更することが出来ません。 例えば、添付画像の場合、担当者一覧ファイルの目標列の数式は上から (1) =[佐藤.xlsx]Sheet1!C2 =[佐藤.xlsx]Sheet1!C3 =[佐藤.xlsx]Sheet1!C4 =[鈴木.xlsx]Sheet1!C2 =[鈴木.xlsx]Sheet1!C3 =[山田.xlsx]Sheet1!C2 =[山田.xlsx]Sheet1!C3 となることが正しいのですが、forメソッドを使用して実行したところ、以下のようになりました。 (2) =[佐藤.xlsx]Sheet1!C2 =[佐藤.xlsx]Sheet1!C3 =[佐藤.xlsx]Sheet1!C4 =[鈴木.xlsx]Sheet1!C5 =[鈴木.xlsx]Sheet1!C6 =[山田.xlsx]Sheet1!C7 =[山田.xlsx]Sheet1!C8 数式の書き換えは、Replaceメソッドを使用していますが、一括で置換されてしまうため、 以下のような記述をしています。 Dim a, b, Row, RowEnd As Long Dim Emp As String Row = 2 For Row To RowEnd  Emp = Range("A" & Row ).Value  a = "=SUM(E:" & Row & "G:" & Row & ")" ←例です。  b = "=[" & Emp & ".xlsx]Sheet1!C" & Row  Range("C" & Row ).Select  Selection.Replace what:= a, Replacement:= b Next Row この記述では(2)になるように作ってしまっているのですが、ここから(1)のようにするにはどうすればよいかわかりません。。。 不躾で、大変申し訳ございませんが、どなたかヒントをくださいますでしょうか。 ご不明な点がございましたら回答致しますので、よろしくお願いします。

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

  • ベストアンサー
  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.3

要は、A列の氏名が変わったら、リンク先の行を2からカウントし直したいと言う事ですよね? そうであれば、前回の氏名を覚えておく変数と、リンク先の行数用の変数を用意して↓の様にします。 Dim b, Row, RowEnd As Long Dim Emp As String Dim Emp2 As String '前回氏名 Dim Row2 As Long 'リンク先Row RowEnd = 8 Emp2 = "" '前回氏名の初期値 For Row = 2 To RowEnd   Emp = Range("A" & Row).Value   If Emp <> Emp2 Then Row2 = 2 '今回の氏名と、前回氏名が異なったらリンク先Rowは2にリセット   b = "=[" & Emp & ".xlsx]Sheet1!C" & Row2   Range("C" & Row).Formula = b 'Replaceは使いません   Emp2 = Emp '今回の氏名を、前回氏名変数に代入   Row2 = Row2 + 1 'リンク先Rowをカウントアップ Next Row また「Row」の様にプロパティ等で良く使用される単語を変数名にすると混乱の元ですのでお勧めしません。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

マクロでやる場合は、普通は質問者のやっているようなこと(ロジックでは)でやらない。 質問者がマクロやプログラムの経験が少なく、質問のように思いついたのだろうが、珍奇であると思う。 またエクセルの数式に思い入れがありすぎて(あるいは他を知らないから)そういうやり方をやろうとしたのだろうが ーー 変える気は無いと思うが参考までに。 今後もマクロを使おうと思うなら、もっと勉強・経験しないとだめとおもいます。 ーー データを寄せ集めればよいと思うので 集約シートをSheet1 各営業マンのデータSheet2、Sheet3、Sheet4の例でテスト Sub test01() k = 2 '集約シートは第2行から Set sh1 = Worksheets("Sheet1") '集約シート For Each sh In Worksheets '各シートについて If sh.Name <> "Sheet1" Then '集約シート以外は d = sh.Range("A65536").End(xlUp).Row '最下行取得 For i = 2 To d '各列データを集約シートに sh1.Cells(k, "A") = sh.Cells(i, "A") sh1.Cells(k, "B") = sh.Cells(i, "B") sh1.Cells(k, "C") = sh.Cells(i, "C") sh1.Cells(k, "D") = sh.Cells(i, "D") k = k + 1 '集約シートの1行下を選択するため Next i End If Next End Sub ただし  集約シートにはデータしか移ってない。関数式は別途手動で。 ーー 結果 佐藤 食品 10 8 佐藤 雑貨 20 26 佐藤 衣類 30 20 佐藤 サービス 40 38 山田 食品 15 8 山田 雑貨 24 24 山田 衣類 32 25 山田 サービス 16 7 田中 食品 15 9 田中 雑貨 21 20 田中 衣類 34 26 田中 サービス 35 34 田中 飲料 15 12 元データは省略するが、どんなものかわかりますね。

qwert_goo
質問者

補足

数式を入力するよりも、マクロで各ファイルからデータをとってくるイメージで捕らえてもよろしいでしょうか? ご指摘の通り、マクロやプログラムの経験はなく、初めてのコーディングです。

回答No.1

Sub マクロ自信ないけど() Dim A As String Dim n As Long Dim i As Long   A = "" '初期値入力   'for~next構文   For n = 2 To Range("A2").End(xlDown).Row     '数式の行番号を判定する     If A = Range("A" & n) Then       i = i + 1     Else       i = 2     End If   '下記は数式を書き換えてください   Range("B" & n).Formula = "=Sheet1!C" & i   '判定の値を代入   A = Range("A" & n).Value   Next End Sub

関連するQ&A

  • エクセル・マクロで書式変更したい!

    エクセルのシートに以下のようなデータがあります。 VBAで、B列が「男」ならば、A列セルの山田・佐藤・加藤を C列が「書」ならば、A列セルの佐藤・吉田を 各々網掛け表示にする方法を教えてください。   A   B   C  D  E  F 1 山田 男 音 ・ ・ ・ 2 鈴木 女 美 ・ ・ ・ 3 佐藤 男 書 ・ ・ ・ 4 吉田 女 書 ・ ・ ・ 5 加藤 男 美 ・ ・ ・ 宜しくお願い申し上げます。≦(._.)≧

  • 別シートの条件に合うセルを抽出したい

    例えば、sheet1に A列 B列   C列 1/1 東京  佐藤 1/1 横浜  鈴木 1/2 北海道 山田 1/3 大阪  加藤 と入力したとします。 このとき、sheet2のA1に1/1と入力すると、Sheeet2のA2、A3に1/1、B2、B3に東京、横浜、C2、C3に佐藤、鈴木と自動的に表示されるようにしたいのですがどうしたらよいのでしょうか?

  • エクセル 配列数式 #DIV/0!があると反映されない

    話がややこしいかと思うのですが、宜しくお願いします。 以前に、「楽天みんなで解決」のビジネス&キャリアで質問させていただいたことに大して再び質問させていただきたいのです・・。 どうかお力を・・・!! 以前はこんな質問を致しました。 ーーーーーーーーーーーー エクセルについての質問です。   A B  C 1 ○ 佐藤 ■ 2 × 鈴木 3 ○ 後藤 4 △ 近藤 5 △ 小林 6 × 大山 7 △ 大林 8 × 小山 9 ○ 松田 のようなデータがあります。 この中で、■(つまり、C1セル)に、「○」の行にある、B列の文字を返したいのですが、■(つまり、C1セル)に =VLOOKUP("○",$A$1:$B$9,2) と入力し、C10セルまでコピーしても、うまく反映されません。 私がほしい結果としては、 ○  △  × 佐藤 近藤 鈴木 後藤 小林 大山 松田 大林 小山 という具合に抽出したいのです。 ーーーーーーーーーーー この質問にたいする回答といたしまして、 ========== 一例です。 データをSheet1、Sheet2の1行目に記号があるとします。 Sheet2のA2に次の数式を入力して、縦横にコピーして下さい。 尚、配列数式の為、入力完了時にshift+ctrl+enterキーを同時押下して下さい。 =IF(COUNTIF(Sheet1!$A:$A,A$1)>ROW(A1)-1,INDEX(Sheet1!$B:$B,SMALL(IF(Sheet1!$A$1:$A$100=A$1,ROW(Sheet1!$A$1:$A$100),99999),ROW(A1))),"") ========== という回答を頂きました。 一度はこれで解決したのですが、今回また問題が発生してしまったのです。 「○」や「△」の記号や「定価」といった文字ではうまくいくのですが、【#DIV/0!】というエラー値が一個でも入ると、とたんにうまく反映されなくなるのです。 例:前述のデータ表に沿うとします。以下のようにA5セルにエラーが入ると、とたんに全部#DIV/0!となってしまいます。   A   B    1 ○   佐藤  2 ×   鈴木 3 ○   後藤 4 △   近藤 5 #DIV/0! 小林 6 ×   大山 7 △   大林 8 ×   小山 9 ○   松田 <抽出後> ○    △    × #DIV/0! #DIV/0! #DIV/0! #DIV/0! #DIV/0! #DIV/0! #DIV/0! #DIV/0! #DIV/0! 大変困っております・・・。 自分で解決しようものにも、数式の意味が解読できませんでした。。配列数式とはなんぞや、括弧がたくさんあって意味がよくわからず・・。 解決方法をどなたかご教授を!! ついでに、なぜこのような現象がおきてしまうのか、できたら教えていただきたいです・・。

  • excel関数でユニークな数値だけ抜き出したい場合

    以下のようなシート(仮にsheet1)のA列からユニークな番号だけ抜き出したい場合sheet2のA列にどのような関数を使用すれば良いですか? A  B 101 山田 101 山田 101 山田 114 佐藤 114 佐藤 123 鈴木

  • エクセルで出席簿を作る

    エクセルの初歩的質問です。 簡単な出席簿を作ろうと思いますがどんな数式を入れたらいいのか調べてもさっぱり解りません。 例えば A列 B列 C列 D列 123 山田 Aクラス 男 456 鈴木 Bクラス 女 789 佐藤 Aクラス 女 と入れた時それぞれクラス別のシートに飛ぶように したいのです。出来ればAクラスでも同じシートに男女別に飛ばすことは出来ますか。 よろしくお願いします。

  • 複数のシートから一覧表を作成する方法

    次のことを実現させる方法を教えてください。 シート 「あ」「い」「う」があります。 ※例としてはシートを3つあげましたが、 このシートはどんどん数が増えていきます。 シート「あ」   A   B 1 鈴木 1976/1/1 シート「い」   A   B 1 佐藤 1977/1/1 シート「う」   A   B 1 山田 1978/1/1 そこから一覧表を作成したいのです。 その一覧表のシート名を「一覧表」とします。 シート「一覧表」(実現したいシート内容)   A    B   C 1 シート名 名前 生年月日 2 A     鈴木 1976/1/1 3 B     佐藤 1977/1/1 4 C     山田 1978/1/1 参照元のシートが固定されているなら   A    B   C 1 シート名 名前 生年月日 2 あ    あ!A1 あ!B1 3 い    い!A1 い!B1 4 う    う!A1 う!B1 と直接参照先を書けばいいのですが、 この方法では、シートが増えるたびに B列、C列にえ!A1 え!B1というように参照先を その都度書いていかなければいけません。 だから、一覧表で、シート名(A列)を入力ただけで、 自動的にそのシートに記載されている 名前と生年月日が反映されるようにしたいのです。 例えば今A3には「い」と記載されていますが、 これを「あ」と変更すると 以下のようにしたいのです。 B3のセルの中身は い!A1 → あ!A1 C3のセルの中身は い!B1 → あ!B1 一覧表のセルB列、C列にどのように記入すれば自動化できるでしょうか?

  • googleドキュメントで配列数式を使う場合に

    http://support.google.com/docs/bin/answer.py?hl=ja&answer=71291 こちらのページで説明がされているのですが、CTRL+SHIFT+ENTERで行う配列数式はgoogleドキュメントではARRAYFORMULAを使い、計算するようなのですが IF(COUNTIF(Sheet2!$A$2:$A$444,$E$59)<ROW(Sheet2!B1),"",INDEX(Sheet2!B$2:B$444,SMALL(IF(Sheet2!$A$2:$A$444=$E$59,ROW(Sheet2!$A$1:$A$443)),ROW(Sheet2!B1)))) というちょっと長い数式になると、どこに入れたらいいか分からなくなりました Sheet1に↑の数式が入れてあり、検索したい値はE59セルに Sheet2には取り出したいデータ A列にデータ(検索用)、B列にデータ1、C列にデータ2とあり、 この数式はA列にあてはまるB列のデータ1全てを取り出すものとなっています。

  • Excel VBAで比較させたい。

    sheet1のA1に山田さん、B1に佐藤さんと打ちます。 で、sheet2のA列に山田さんB列に佐藤さんの情報があります。 それを比較する方法を知りたいんですけど。 ちなみに、sheet1のA1に鈴木さん、B1に山崎さんなど色んなパターンが存在します。 A1に山田さんだったらsheet2のA列、B1に佐藤さんだったらsheet2のB列を見に行って それを比較して、一致しない所だけsheet3に表示させる方法などありますか? 当方まったくの初心者で…(^^;

  • 同じ文字列を抽出して新規シート作成

    A列~E列までデータが入力されています。 E列は所々、空白セルがあります。 1行目は見出しです。 元データのA列の中で同じ文字列を探して 見出しと該当するA~E列の行を新規シートとして作成。 その際、シート名はA列の文字列。 A列の文字列が2つ以上見つからなくても A列の文字列を新規シートにする。 最終行は常に変動します。 元データ (B列~E列は割愛) A-1 名前 A-2 鈴木 A-3 佐藤 A-4 鈴木 A-5 山田 A-6 佐藤 新規シート名 「鈴木」 A-1 名前 A-2 鈴木 A-3鈴木 新規シート名 「佐藤」 A-1 名前 A-2 佐藤 A-3 佐藤 新規シート名 「山田」 A-1 名前 A-2 山田 上記の事をマクロで実行させたいです。 ご指南の程、宜しくお願い致します。 エクセル2013

  • 【エクセル】リストの照合について教えてください!!

    sheet1に、下記の様に600件の氏名が書いてあります。 A      B 1     山田太郎  2     鈴木花子 ・・・ 600   佐藤次郎 sheet2に、地域と氏名がずらっと書いてあります。 A      B      C     D    E 東京都   神奈川県   埼玉県   千葉県  茨城県 山田太郎 鈴木太郎 山田花子 佐藤次郎 ・・・ このsheet2の地域を、sheet1のC列に下記の様に入れたいのですが、 どの様に行ったら良いでしょうか? みなさんのお知恵をください!!宜しくお願い致します。 A      B      C 1     山田太郎   東京都 2     鈴木花子   神奈川県 ・・・ 600   佐藤次郎   埼玉県

専門家に質問してみよう