• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マクロで数式を書き換えたい。)

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

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

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

  • ベストアンサー
  • 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/17069)
回答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

専門家に質問してみよう