• ベストアンサー

CnvFormula 絶対参照にsheet名を付けたい

winxp he sp3, excel2003 CnvFormula 範囲指定して相対→絶対参照に変換します。 sheet1→sheet2にcopyした時、sheet名が必要です。 下記マクロにsheet名を追加したいのです。 Sub CnvFormula() With Selection.SpecialCells(xlCellTypeFormulas) .Formula = Application.ConvertFormula(.Formula, xlA1, xlA1, xlAbsolute) End With End Sub よろしくお願いします。

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

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.7

#3 です。 > debug 結果です。シート名が付いていませんでした。 当方でのテストデータはうまくいってましたが、   r.DirectPrecedents.Areas では、期待するセルブロックに分割してくれなかったのが原因のよう ですね。この対策として   r.DirectPrecedents.Cells に変更し、さらに Sum(A1:C10) のようなパターンにも対応できるよう、 バグフィックスしました。あまりスマートではありませんが。 Sub CnvFormula2()   If Not TypeOf Selection Is Range Then Exit Sub   Dim rHasFormula As Range   Set rHasFormula = Selection.SpecialCells(xlCellTypeFormulas)   If rHasFormula Is Nothing Then     MsgBox "数式セルは無い", vbInformation     Exit Sub   End If     Dim r    As Range   Dim rr    As Range   Dim iPos   As Long      Application.ScreenUpdating = False   Application.Calculation = xlCalculationManual     On Error GoTo Err_   For Each r In rHasFormula.Cells     ' // 絶対参照式へ置換     r.Formula = Application.ConvertFormula( _           r.Formula, xlA1, xlA1, xlAbsolute)     ' // 外部参照式へ置換     For Each rr In r.DirectPrecedents.Cells       iPos = InStr(r.Formula, rr.Address)       If iPos > 0 Then         If Mid$(r.Formula, iPos - 1, 1) <> ":" Then           r.Formula = Replace$(r.Formula, _                      rr.Address, _                      rr.Address(External:=True))         End If       End If     Next   Next Bye_:   Application.Calculation = xlCalculationAutomatic   Exit Sub Err_:   MsgBox Err.Description, vbInformation   Resume Bye_ End Sub

esd827
質問者

お礼

私の希望通りできました。ありがとう御座いました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.6

ANo.4で提示したコードで、曲がりなりにもシート名が付けられると思います。 あとは、このコードを esd827 さんの環境に合わせて書き直しすれば良いのではないでしょうか。 それが出来ないのなら、架空の数式、架空のシート名ではなく、実際の数式、実際のシート名と、現状のマクロを現状のまま提示してみてください。

esd827
質問者

お礼

ANo.7さんの回答で、私の希望通りできました。ありがとう御座いました。

全文を見る
すると、全ての回答が全文表示されます。
  • xls88
  • ベストアンサー率56% (669/1189)
回答No.5

>・シート名に汎用性がありません。下記はsheet1 sheet2 に変更しています。 >・N→Q列になっています。 >シート名:データ sheet1 >f22~f25   実際にはF列です >=N22-(N22-O22)*0.618 >=N23-(N23-O23)*0.618 >=N24-(N24-O24)*0.618 >=N25-(N25-O25)*0.618 > >シート名:重点 sheet2 >c6~c9 実際にはC列です >=Sheet1!Q22-(Sheet1!Q22-Sheet1!R22)*0.618 >=Sheet1!Q23-(Sheet1!Q23-Sheet1!R23)*0.618 >=Sheet1!Q24-(Sheet1!Q24-Sheet1!R24)*0.618 >=Sheet1!Q25-(Sheet1!Q25-Sheet1!R25)*0.618 何がいけないのか理解できません。 ”・シート名に汎用性がありません。”とはどういう意味合いなのでしょうか。 シート名:重点 sheet2 の数式にはシート名が付加されていますが、これでは駄目なのですか。 提案したマクロは、あくまでサンプルです。esd827さんの環境に合わせて、シート名を書き直すとかしなければなりません。 ひとつ気になるのは、シート名:重点 sheet2 の数式に$マークが付いていないのですが、何故ですか? $マークなしでコピーするとセル番地が相対的に変化します。

esd827
質問者

補足

すみません 下記のように訂正させて頂きます。 ・絶対番地はokです。 ・使い勝手を良くする為、シート名を自動的に付けたいのです。難しいでしょうか。 sheet1: =$N$22-($N$22-$O$22)*0.618 =$N$23-($N$23-$O$23)*0.618 =$N$24-($N$24-$O$24)*0.618 =$N$25-($N$25-$O$25)*0.618 sheet2: =Sheet1!$N$22-(Sheet1!$N$22-Sheet1!$O$22)*0.618 =Sheet1!$N$23-(Sheet1!$N$23-Sheet1!$O$23)*0.618 =Sheet1!$N$24-(Sheet1!$N$24-Sheet1!$O$24)*0.618 =Sheet1!$N$25-(Sheet1!$N$25-Sheet1!$O$25)*0.618

全文を見る
すると、全ての回答が全文表示されます。
  • xls88
  • ベストアンサー率56% (669/1189)
回答No.4

関数を使わなくても、数式セルの移動で一気に変換出来ました。 一旦、Sheet1の何もないセル位置でコピぺし、Sheet2へカット&コピーします。 そうすれば、Excelが数式にシート名を勝手に付けてくれます。 ただし下記マクロでは、数式セル範囲が不連続の場合にはエラーになります。 数式セル範囲に、複数の離れた範囲が含まれる場合の対応を工夫してみてください。 Sub testCnvFormula()   Dim rng As Range   Set rng = Selection.SpecialCells(xlCellTypeFormulas)   With rng     .Formula = Application.ConvertFormula(.Formula, xlA1, xlA1, xlAbsolute)   End With   rng.Copy Worksheets("Sheet1").Range("AA1")   Worksheets("Sheet1").Range("AA1").Resize(rng.Rows.Count, rng.Columns.Count).Cut   rng.Select   ActiveSheet.Paste End Sub

esd827
質問者

補足

ありがとう御座います。deback結果です。実際の列でdebackしました。 ・シート名に汎用性がありません。下記はsheet1 sheet2 に変更しています。 ・N→Q列になっています。 シート名:データ sheet1 f22~f25   実際にはF列です =N22-(N22-O22)*0.618 =N23-(N23-O23)*0.618 =N24-(N24-O24)*0.618 =N25-(N25-O25)*0.618 シート名:重点 sheet2 c6~c9 実際にはC列です =Sheet1!Q22-(Sheet1!Q22-Sheet1!R22)*0.618 =Sheet1!Q23-(Sheet1!Q23-Sheet1!R23)*0.618 =Sheet1!Q24-(Sheet1!Q24-Sheet1!R24)*0.618 =Sheet1!Q25-(Sheet1!Q25-Sheet1!R25)*0.618

全文を見る
すると、全ての回答が全文表示されます。
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

こんにちは。 > このマクロを実行しますと、1発で絶対参照になります。 ならないですよ。テストでは上手くいくのでしょうが、実用では定数 セルと数式セルがシート内で混在する場合がほとんどです。従って   SpecialCells(xlCellTypeFormulas) で得られる Range は必ずしも連続範囲とはならないため、ご質問の ソースで一括処理すると期待しない結果になりますよ。一括で代入する なら Areas でセルブロック単位に切り分けて処理しないと。   Dim r As Range   For Each r In Selection.SpecialCells(xlCellTypeFormulas).Areas     r.Formula = Application.ConvertFormula(r.Formula, _           xlA1, xlA1, xlAbsolute)   Next でも、これでも少し乱暴ですよね。数式セルをひとつひとつ順次処理 した方が良いですよ。   # 下記サンプルソースでは書いてませんが、数式には通常の数式と   # 配列数式とありますので、これも切り分けて処理する必要が   # あるからです。 で、ご質問に対する回答ですが、キーワードは、   DirectPrecedents、   Address(External:=True) ですね。あまり動作検証してませんが、こんな感じ。 Sub CnvFormula()   Dim rHasFormula As Range      If Not TypeOf Selection Is Range Then Exit Sub      ' // SpecialCells(xlCellTypeFormulas) は単一セル選択時に実行すると   ' // シート全体が検索対象となるのに注意   Set rHasFormula = Selection.SpecialCells(xlCellTypeFormulas)   If rHasFormula Is Nothing Then     MsgBox "数式セルは無い", vbInformation     Exit Sub   End If       Dim r  As Range   Dim rr As Range      Application.ScreenUpdating = False   Application.Calculation = xlCalculationManual      On Error GoTo Err_      For Each r In rHasFormula.Cells     ' // 絶対参照へ置換     r.Formula = Application.ConvertFormula( _           r.Formula, xlA1, xlA1, xlAbsolute)     ' // 外部参照式へ置換     For Each rr In r.DirectPrecedents.Areas       r.Formula = Replace$(r.Formula, _                  rr.Address, _                  rr.Address(External:=True))     Next   Next Bye_:   Application.Calculation = xlCalculationAutomatic   Exit Sub Err_:   MsgBox Err.Description, vbInformation   Resume Bye_ End Sub

esd827
質問者

補足

ありがとう御座います。deback結果です。シート名が付いていませんでした。そのため、シート名の汎用性は確認できませんでした。

全文を見る
すると、全ての回答が全文表示されます。
  • xls88
  • ベストアンサー率56% (669/1189)
回答No.2

>ありがとう御座います。分かりやすく説明します。 >a1-a30範囲指定します。 >このマクロを実行しますと、1発で絶対参照になります。 >この時、数式にsheet1名称を入れたいのです。 >簡単・複雑な数式とは関係なく、sheet名を入れたいのです。 質問の意図は理解できております。 検証するために実際の数式を用いたく、数式の掲載をお願いしたような訳です。 大雑把ですが Split関数で、数式内のセル番地の部分を取り出し Replace関数で、シート名+セル番地に置換すれば良いかなと考えています。 選択範囲内で、各セル毎に処理をすることになると思います。

esd827
質問者

補足

ありがとう御座います。簡単にするため、下記数式です。 A列 30個 =J1-(J1-K1)*10 =J2-(J2-K2)*10 =J3-(J3-K3)*10 =J4-(J4-K4)*10 =J5-(J5-K5)*10 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • xls88
  • ベストアンサー率56% (669/1189)
回答No.1

例えば、 =SUM($A$1:$B$1) といった数式なら ActiveCell.Formula = Replace(ActiveCell.Formula, "(", "(Sheet1!") で =SUM(Sheet1!$A$1:$B$1) とすることができます。 こんな簡単な数式なら良いのですが、もっと複雑な数式が対象だと思います。 実際の数式を掲載できないでしょうか。検討してみます。

esd827
質問者

補足

ありがとう御座います。分かりやすく説明します。 a1-a30範囲指定します。このマクロを実行しますと、1発で絶対参照になります。この時、数式にsheet1名称を入れたいのです。簡単・複雑な数式とは関係なく、sheet名を入れたいのです。難しいでしょうか。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルでマクロを使って絶対参照を相対参照に戻す方法

    エクセルにおいて絶対参照に変更する方法はわかったのですが、それを相対参照に戻す方法がわかりません。 Sub tes1() Dim c As Range For Each c In Selection With c If .HasFormula Then .Formula = Application.ConvertFormula(.Formula, xlA1, , xlAbsolute) End If End With Next ですべての範囲を絶対参照にすることができました。 しかし、逆にその絶対参照を全てはずす方法がわかりません。 わかりましたら教えて頂けたらと思います。よろしくお願いします End Sub

  • 【VBA】複数シートのうち、任意シートのみで動作

    【Excel2010】において… Sheet1~10のうち、Sheet10以外(=Sheet1~9)に以下の動作をさせたい場合はどのようにしたらよいですか。 (↓ Sheet1~9の各シート内で、J列に『A列×C列』で任意の検索keyを設定する、というマクロを組んだつもりです) ------------------------------------------------------------------------------------------- Sub 検索keyを追加() With Range("A1", Cells(Rows.Count, 1).End(xlUp)).Offset(, 9) .Formula = "=CONCATENATE(A1,C1)" .Copy .PasteSpecial Paste:=xlPasteValues End With End Sub ------------------------------------------------------------------------------------------- 現在、VBA習得中(初心者)です。 基本的な質問で大変恐縮ですが、是非ご教示いただきたくお願いいたします。

  • vlookupで参照するシート名と範囲を変えたい

    お世話になります。 vlookup関数について質問です。 新規作成する表の列B2からF2(1行目は項目行)に別のブック 「商品マスタ」からvlookupで必要なデータを検索して入力 B2からFのデータのある最終行までコピーするというマクロを作りました。 Range("B2").Select ActiveCell.FormulaR1C1 = _ "=VLOOKUP(RC1,[商品マスタ.xlsx]商品マスタ2017.10.5!R2C1:R430C6,COLUMN(RC),0)" Range("B2").Select Selection.AutoFill Destination:=Range("B2:F2"), Type:=xlFillDefault Range("B2:F2").Select Range("B2").Select Selection.AutoFill Destination:=Range("B2:F2"), Type:=xlFillDefault Range("B2:F2").Select Selection.AutoFill Destination:=Range("B2:F" & Cells(Rows.Count, "A").End(xlUp).Row) On Error Resume Next With Range("B:F").SpecialCells(xlCellTypeFormulas) .Value = .Value End With ★商品マスタの内容を更新時に新規シートを追加しているので 《商品マスタ2017.10.5!R2C1:R430C6》この部分のシート名と参照範囲を 毎回手動で書き直していますが、シート名と参照範囲を自動で切り替える 方法がありましたら教えてください。 シートは最新版のデータが入ったものを常に使用します。 よろしくお願いします。

  • 選択範囲だけを相対値セルに変換

    選択範囲だけを相対値セルに変換 Sub test()   Dim c For Each c In Selection If c.HasFormula Then c.Formula = Application.ConvertFormula(Formula:=c.Formula, _ FromReferenceStyle:=xlA1, ToAbsolute:=xlRelative) End If Next End Sub セル行が変化してうまく動作しません どこを直せばよいのかわかりませんどなたかお教えください。

  • エクセルでシート名をセル参照するマクロ

    いつもお世話になっております。 ワークシートをコピーする際、 B1セルの値を複製したシート名にするマクロを と思ってやってみましたが、 Sub Macro1() ' ' Macro1 Macro Sheets("0000").Select Application.CutCopyMode = False Sheets("0000").Copy Before:=Sheets(3) Range("B1").Select Selection.Copy Sheets("0000 (2)").Select Sheets("0000 (2)").Name = "0524" Range("B1").Select End Sub 5行目でB1セルをコピーしましたが、 シート名として命名されたのは、 "0524"という固定の値でした。 (そのときのB1セルの値です) このB1セルは日付データなのですが、 マクロを実行する日によって、 翌日だったり、3日後だったりします。 (営業日ベースなので) どのようにしたら、B1セルの値を シート名に使用できるでしょうか よろしくお願いいたします。

  • マクロでシート2~6のデータをシート1に転記したい

    マクロでシート2~6のデータをシート1に転記したいです。 シート2~6のデータを シート1に順番に転記したくてマクロの記録を利用して作成しました。 シート2~6は列は同じですが行数は異なります。 また行数は作業の都度異なります。 同じ記述が繰り返されているので もう少し記述が短くできるのではと思うのですが どうすればいいでしょうか? Sub データ更新() 'シート1の前回データをクリア Sheets("シート1").Select Range("A2:Q2").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlDown)).Select Selection.ClearContents Range("A2").Select Sheets("シート1").Select Range("A1").Select Sheets("シート2").Select Range("A1").Select 'ヘッダーも合わせて取得 Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select Sheets("シート3").Select Range("A2").Select 'データのみ取得 Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select Sheets("シート4").Select Range("A2").Select Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select Sheets("シート5").Select Range("A2").Select Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select Sheets("シート6").Select Range("A2").Select Range(Selection, Selection.End(xlToRight)).Select Range(Selection, Selection.End(xlDown)).Select Selection.Copy Sheets("シート1").Select ActiveSheet.Paste Application.CutCopyMode = False Selection.End(xlDown).Select Selection.Offset(1, 0).Select End Sub

  • セルをコピーしてシート名を取得 【VBA】

    こんばんわ。 エクセルのVBAについて、どうしてもわからなくなったので質問させて下さい。 マクロの内容は 1.一番前のシート(名前はSheet1ではありません。)のボタン35をクリック 2.シートをコピーして3番目に置く。 3.値にする。 4.シート名をセルの"DE16"に入っている値にする。 5.ボタンを消す。 以下の内容になりましたが、名前のところでデバックがおこります。 Sub ボタン35_Click() Worksheets(1).Select Worksheets(1).Copy After:=Sheets(3) Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues Worksheets(3).Select Worksheets(3).Name = Range("DE16").Value ActiveSheet.Shapes("Button 11").Select Selection.Delete Application.CutCopyMode = False End Sub どなたかお知恵を貸して下さい。

  • エクセルマクロ 抽出したデータを別のシートへコピーしたい

    マクロ初心者のため、やり方が全くわかりません。 どなたか教えてください。 やりたいことは、 【1】シート名「データ」をA列でオートフィルタ抽出して、別シートにコピーする。 【2】別シートにコピーしたデータに外枠罫線をつける。 【3】シート名「データ」には塗りつぶしがあるので、別シートにコピーされた塗りつぶしは「なし」する。 【4】シート名「Sheet1」の1~2行目をコピーし、別シートの1~2行目に挿入し、シート名「データ」に戻る。 コピーするシートはあらかじめ作成しています。 簡素化の方法がわからないので、 とりあえず自分で作ってみたものが下にあるものです。 繰り返す方法がわからないので、今はコピーして「あ行」の部分を書き換えています。(かなり面倒です) 最終的には、抽出されたそれぞれのシートを別々のブックにしたいとも思っています。 長々とすみませんが、どなたか教えてください。 よろしくお願いします。 以下、作成したマクロです。 Sheets("データ").Select Range("A1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.AutoFilter Selection.AutoFilter Field:=1, Criteria1:="あ行", Operator:=xlAnd Range("A1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.Copy Sheets("あ行").Select Range("A1").Select ActiveSheet.Paste Range("A1").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .Weight = xlMedium .ColorIndex = xlAutomatic End With Cells.Select Selection.Interior.ColorIndex = xlNone Sheets("Sheet1").Select Rows("1:2").Select Selection.Copy Sheets("あ行").Activate Rows("1:1").Select Selection.Insert Shift:=xlDown Range("A1").Select Sheets("データ").Select Range("A1").Select

  • エクセルVBA 追加したシート名をハイフン(-)を入れて連番にする方法

    エクセル2003です。 シートをコピーし追加、 一つ前のシートの一部セルをセル参照するコードを作成しました。 今の段階ではコピーしたシート名が請求書1、請求書2、請求書3・・・となるのですが シート名を請求書1-1、請求書1-2、請求書1-3・・・とすることは可能でしょうか? "請求書"を"請求書1-"にするとコピーしたシートのセル参照をした部分が うまく参照されずエラーになってしまいます。 シート名にハイフンを入れてもエラーが出ない方法をご存じの方いらっしゃいましたら 是非ご教授をお願い致します。 Sub test1() Dim i As Integer Worksheets(2).Select For i = 2 To 5 Worksheets(2).Copy after:=ActiveSheet ActiveSheet.Name = "請求書" & i With Worksheets("請求書" & i) .Range("H15").Formula = "=請求書" & i - 1 & "!F10" End With Next i End Sub

  • Excelマクロで他シートへの抽出:エラー

    こちらの質問 http://okwave.jp/qa/q4760155.html を参考に、エクセルマクロを作りました。 Sheet1の10列目(J)に@が入っている行をすべて、 Sheet2に抽出表示します。コードは次になります。 Private Sub Worksheet_Activate() With Sheets("Sheet1") .AutoFilterMode = False .Range("A1:N1").AutoFilter .Range("A1:N1").AutoFilter Field:=10, Criteria1:="@" .Range(.Range("A1"), .Range("A1").SpecialCells(xlLastCell)).SpecialCells(xlCellTypeVisible).Copy Range("A1") .AutoFilterMode = False End With End Sub このマクロを実行すると、確かにSheet2では抽出が行われるのですが、 同時にSheet1の内容も抽出された内容に変わってしまいます。 どこに問題があるのでしょうか。 よろしくお願いします。

専門家に質問してみよう