[Excel97]VBA:セルに入っている数式を別のシートのセルに文字列としてセットする

このQ&Aのポイント
  • ExcelVBAマクロ500連発という技術評論社の本には、式を文字列として表示するサンプルマクロがあります。
  • 質問者は、ワークシートのセルに入っている数式を別のシートのセルに文字列としてセットするコードを作成していますが、エラーが発生しています。
  • 正しいコードの記述方法を教えてください。
回答を見る
  • ベストアンサー

[Excel97]VBA:セルに入っている数式を別のシートのセルに文字列としてセットする

「ExcelVBAマクロ500連発」という技術評論社の本(青のカバー)のNo.277に 「式を文字列として表示する」というサンプルマクロがあります。 「ワークシートのセルに入っている数式を、(同じシート内の)別のセルに文字列としてセットする」 ここのコードを参考にして、 「数式を、(同じブック内の別のシートの)セルに文字列としてセットする」コードを考えています。 以下のコードを作りましたが、実行すると最後から2行目の「.Formula」のところで 実行時エラー1004:'Range'メソッドは失敗しました。'_Global'オブジェクト というエラーが出てきます。なぜでしょうか? 正しいコードの記述を教えて下さい。 (Sheet1のD3セルの計算式をSheet2のD10セルに文字列としてセット) Option Explicit Dim 調査セル As Variant Dim 報告セル As Variant Sub 式の抽出() Worksheets("Sheet2").Select 調査セル = Worksheets("Sheet1").Cells(3, 4) 報告セル = "D10" Range(報告セル).Value = "" Range(報告セル).Value = "'" + Range(調査セル).Formula End Sub

  • momoo
  • お礼率62% (51/81)

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

  • ベストアンサー
  • ARC
  • ベストアンサー率46% (643/1383)
回答No.1

こんなややこしいことをせずとも、たった1行 Sub 式の抽出()   Sheet2.Range("D10").Value = "'" & Sheet1.Range("D3").Formula End Sub って書けばいいですよ。 お書きになったVBAでの間違いは、文字列とオブジェクトを混同しているところにありますね。 これを正しく書き直すとすると、以下のようになります。 Option Explicit '変数の宣言 Dim 調査セル As Range 'Rangeオブジェクト(セルの内容等にアクセスする為のオブジェクト) Dim 報告セル As String '文字列 Sub 式の抽出()  'Sheet2をアクティブにする  Worksheets("Sheet2").Select    '調査セルにはSheet1のD3のセルを割り当てる。  '「調査セル」を通じて、このセルの文字列、式、色情報etcを取得できる。  Set 調査セル = Worksheets("Sheet1").Cells(3, 4)    '「報告セル」という文字列方変数に「D10」という文字列を代入する。  報告セル = "D10"    'アクティブなワークシート(Sheet2)の「D10」というセルの値に空文字列を代入する。  Range(報告セル).Value = ""    '調査セルのFormula(式の内容)属性を取得して、その値を代入する。  Range(報告セル).Value = "'" + 調査セル.Formula End Sub

momoo
質問者

お礼

いつも回答ありがとうございます。 ARCさんは以前にも答えていただいたことを覚えています。 さっそく試してみると、本当に1行で転記できてしまいました。 驚きました。こんな簡単な式でできることに。 ついでにある起動しているブックから他の起動しているブックへ転記できるかと思って、 Workbooks("転記先ブック").Worksheets("Sheet1").Range("D4").Value="'"&Sheet1.Range("D3").Formula としてやってみたら、これも成功しました。 できちゃうと「なあんだ」ってことになっちゃいますね。 自分が作ったコードの方ですが、 調査セル=Worksheets("Sheet1").Cells(3,4) というのは、「オブジェクトを指定している」ということなんですね。 それで、Range(調査セル).Formulaはまちがいだと言うことなんですね。 よくわかりました。

関連するQ&A

  • VBA 別のシートから文字列参照して全て表示

    ExcelのVBAでSheet1のA3に5文字の文字列(大文字、小文字を区別しない)を入力してSheet2のC列にあるA3の文字列から始まるデータ(10文字以上)をすべてを参照してSheet2のD列を含めSheet1のA5,B5から下にすべて表示させる。 宜しくお願い致します。 Sub macro1() Dim V2 As Variant V1 = Sheets("sheet1").Cell("A3").Value '文字列を取得 V2 = Application.InStr(Sheets("sheet2").Range("C:C"), V1) '検索するテーブルでC列の文字列を探す 'みつけたら、その行、無かったら、エラーのコードが変数に入る If IsError(V2) Then 'テーブルに無かったらなにもしない Else str0 = Worksheets("Sheet2").Cells(V2, 7).Value str1 = Worksheets("Sheet2").Cells(V2, 8).Value str2 = Worksheets("Sheet2").Cells(V2, 9).Value Worksheets("sheet1").Cells(i, 2).Value = str0 Worksheets("sheet1").Cells(i, 3).Value = str1 Worksheets("sheet1").Cells(i, 4).Value = str2 End If End Sub

  • VBA 別シートのセルから、文字列を参照するには?

    Excel VBAに於いて 同BOOKのSheet1から、Sheet2の文字列を変数に入れよとするとエラーになります。 何故でしょうか。 また、その対処法を、御教示ください。 Dim objWBK As Workbook Dim objSH As Worksheet Set objWBK = ThisWorkbook Set objSH = objWBK.Sheet2 Dim cnsFILENAME As String cnsFILENAME = objSH.Range("a4")     ← ここで、「オブジェクトは、このプロジェクトでサポートされていません。」と、エラーメッセージが出る。 Sheet2.Range(”A4”)には、文字列を入れてある。 以上、よろしくお願いします。

  • vba:セル内変更文字列の色付け

    vbaにて別ブックの一覧を参照し、 指定範囲に検索文字列が含まれる場合 文字列の置換&対象セルの色付け& 件数の表示を行うコードから、 文字列の置換&セル内の変更した文字列のみ 色付け&件数の表示を行うコードに変更したいです。 変更した文字列のみ文字色を変更したい場合、 どのようなコードに書き換えればよろしいでしょうか。 なお、現在のコードは以下の通りです。 ============================ Sub 複数条件で一括置換する() Dim 範囲 As Object Dim 対象 As Object Dim 一覧 As Variant Set 範囲 = Selection 一覧 = Workbook("確認.xlsm").Sheets("複数条件").Range("A1:B7") Dim tmp As Variant Dim mCnt As Long 中略 mCnt = 0 For Each 対象 In 範囲 For i = LBound(一覧, 1) To UBound(一覧, 1) tmp = 対象.Value 対象.Value = Replace(対象.Value, 一覧(i, 1), 一覧(i, 2)) If tmp <> 対象.Value Then 対象.Interior.Color = vbRed mCnt = mCnt + 1 End If Next Next MsgBox mCnt & "件置換しました" Set 範囲 = Nothing Set 対象 = Nothing End Sub

  • Excelマクロにて文字列連結

    現在Excelのマクロにて文字列の連結を行っているのですが、 繋いだ文字列を改行を付けて連結を行いたいです。 セルとセルの中の文字列を改行を付けて連結するにはどうしたらいいのでしょうか? 例 A1セル「あああ」 B1セル「いいい」 C1セル「あああ       いいい」 Worksheets(sheet1).Range("C1").Value = Worksheets(sheet1).Range("A1").Value + Worksheets(sheet1).Range("B1").Value をすると 「あああいいい」と1行で表示されてしまいます。     ↑ ここに改行を入れるにはどうしたらいいのでしょうか? 以上、宜しくお願いします。

  • エクセルVBA 別シートの複数のセルの値をコピーする方法

    いつもお世話になります。 Dim sh1, sh2 As Worksheet Set sh1 = Worksheets("sheet1") Set sh2 = Worksheets("sheet2") sh1.Range("C6").Value = sh2.Range("F5").Value として、1つのセルの値ならコピーできるのですが、 sh1.Range("C6:C10").Value = sh2.Range("F5;F9").Value としても、セルの値を持ってくることができません。 どのように書けば良いのでしょうか? ちなみに今は、 sh2.Range("F5:F9").Copy sh1.Range("C5:C9").PasteSpecial Paste:=xlValues としているのですが、上記だとセルを範囲指定してしまって作業が見えるのでカッコ悪いのです。

  • セルの値をシート名にするエクセルVBA

    件名のVBAを以下のように書きました B列の4からずっと下までのセルの値を次々とシート「ひな型」をコピーし増やしていくものです。 Sub テスト() ' ' Macro ' ' Dim target As Range Dim h As Range '見えてるセルを取得する。「全部隠れていた」場合も考える。 On Error Resume Next Set target = Worksheets("Sheet1").Range("B4:B" & Worksheets("Sheet1").Range("B65536").End(xlUp).Row).SpecialCells(xlCellTypeVisible) If target Is Nothing Then Exit Sub 'シートを増やしていく For Each h In target On Error GoTo errhandle Worksheets(CStr(h.Value)).Select On Error GoTo 0 Next Sheets("Sheet1").Select Exit Sub errhandle: Worksheets("ひな型").Copy after:=Worksheets(Worksheets.Count) ActiveSheet.Name = h.Value Resume End Sub これだと、一応思った通りにはなるのですが B列のセルに複数同じ名前があった時に、既に作ったシートの名前がある場合 それは無視するという風に実行したいです お知恵をお貸しくださいませ

  • VBA:日付を配列に入れ別セルに転記するとデータ型が変わる

    データを別シートに転記するVBAコードを書いていて気付きました。 日付データをバリアント型の配列に入れて、再度書き出すと 21/2/2005 のように表示され、さらに日付ではなく、文字列になってしまいました。 具体的には下記のような内容です。Sheet1 の A1:A10 に 2005/2/21 のような日付が入力されています。 1. セル範囲のデータをバリアント型の配列に格納 2. 1.を別のセルへ一括転記を行う Sub TestMacro()   Dim Buf As Variant   With Sheets("Sheet1").Range("A1:A10")     Buf = .Value     '・・・(1)     .Offset(0, 3) = Buf  '・・・(2)   End With End Sub ウォッチ式で変数を確認すると(1)および(2)の時点では #05/02/21# Variant/Date型 と正しく日付として扱われているようです。しかし、転記されたセルを見てみると、「文字列で 21/2/2005 」となっているのです。 2005/2/21 が返されるものと思うのですが、なぜ、このような現象が起こるのでしょうか?何かとんでもない勘違いをしているのでしょうか? テスト環境は Win98SE + EXCEL2002 です。よろしくお願いします。

  • 【VBA】別シートを検索して該当があれば『●』表示

    VBA初心者(独学中…)です。 別シートからVLOOKUPの要領でデータの抜き出しをしたいです。 関数を試しましたが、データ量が多く、かなり時間が掛かってしまうため、 できればマクロで完了させたいと思っています。 ご教示のほど、何卒よろしくお願いいたします。 ------------------------  帳票の仕様 ------------------------ ■Excel2010 にて  ・Sheet1~9のJ列に『検索コード』があります。  ・Sheet10は【コードマスタ】シートです。  ・行はシートにより増減あり。  ・列はSheet1~9で共通、項目・並び等 変更なし。     Sheet10も項目・並びは変更しません。 ------------------------  やりたいこと ------------------------ Sheet10からSheet1~9へ、VLOOKUPのように該当データを抽出・転記したい。 ------------------------  具体的には… ------------------------ Sheet1~9の『検索コード(J列 ※データは[セル:J2]以下~)』を元に、  (1)Sheet10のA列を検索 ⇒ 該当があればSheet1~9のK列へ  (2)Sheet10のB列を検索 ⇒ 該当があればSheet1~9のL列へ 『●』が表示されるようにしたい。 ------------------------------------------------------------------------ 試しに(1)の動作テスト用に、以下を書いてみましたがうまく動作しませんでした。 (★の部分がエラーになります) 正しく動作させるには、どのようにしたらよろしいでしょうか。 (実際のコードを教えていただけますと、大変有難いです…) ================================================================ Sub コードマスタからK列値をVLookup() Dim tbl As Range Set tbl = Worksheets(10).Range("A:B") Dim key As Long key = Range("J2").Value        ★ On Error Resume Next Dim ret As String ret = WorksheetFunction.VLookup(key, tbl, 1, False) On Error GoTo 0 Range("K:K").Value = ret End Sub ================================================================

  • EXCEL・VBAに関する質問です。

    EXCELで或るセルに数式を代入したい場合、普通は Worksheets("xx").Range("F1").Formula = "=CONCATENATE($A$1,$C$1)" と書けば好いと思いますが、 =CONCATENATE("請求_",$D$1,".xlsm") と代入したい場合、どう書いたら好いのでしょうか。よろしくお願いします。 ちなみに私は dim seikyuu , exten as string seikyuu = "請求_" exten = ".xlsm" Worksheets("xx").Range("F2").Formula = "=CONCATENATE(" & seikyuu & ",$D$1," & exten & ")" としたら好いかと思うのですが、考え方は合っているでしょうか。

  • セル内の数式中の文字列を検索

    セル内に数式が入っている場合、その数式中の文字列を検索する関数がありますか。 例えばB1セルに=Sheet1!K2*Sheet2!K2*Sheet5!K2 B2セルに=Sheet4!K2*Sheet3!K2*Sheet6!K2 D1セルにB1の数式内のSheet2という文字があれば1を表示させ    無ければ0を表示させるというような関数はあるでしょうか。