「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

このQ&Aに関連する最新のQ&A

A 回答 (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
    • good
    • 0
この回答へのお礼

いつも回答ありがとうございます。
ARCさんは以前にも答えていただいたことを覚えています。

さっそく試してみると、本当に1行で転記できてしまいました。
驚きました。こんな簡単な式でできることに。
ついでにある起動しているブックから他の起動しているブックへ転記できるかと思って、
Workbooks("転記先ブック").Worksheets("Sheet1").Range("D4").Value="'"&Sheet1.Range("D3").Formula
としてやってみたら、これも成功しました。
できちゃうと「なあんだ」ってことになっちゃいますね。

自分が作ったコードの方ですが、
調査セル=Worksheets("Sheet1").Cells(3,4)
というのは、「オブジェクトを指定している」ということなんですね。
それで、Range(調査セル).Formulaはまちがいだと言うことなんですね。
よくわかりました。

お礼日時:2001/12/08 22:57

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QMicroSoft BasicのDim文とVisualBasicのDim文の違い

私が20年前にMicroSoft Basicを使っていたときは、DIM文はDIMENSIONの略で配列型変数の宣言に使っていました。

最近VisualBasicの勉強を始めたのですが、変数の宣言はすべてDim文になっており、昔のMS BasicのDim文と意味合いが変わっているのに驚いています。

ここで質問させてください。
・なぜ配列を意味するDimension文が変数の宣言なのか?
・どのバージョンのBasicからDim文の意味が変わったのか?

私が使用していたのはNEC N-Basic,N-88Basic,N-98Basicです。

Aベストアンサー

VISUAL BASIC のDimは ディメンジョンの略です。
私の経験ではVB2.0時代からありました。

配列0を考えた場合変数とおなじであるからだとおもいます

QWorksheet_Changeイベントでのセル設定

マクロ初心者です。Excel2003です。
Sheet1に下記のイベントを記述しましたが、(3)だけ動作してくれません。
シート上では、N27とO27の2つのセルが結合されており、入力規則でリスト選択(3択)する設定になっています。(1)や(2)のように認識してくれるようにするにはどうしたらいいでしょうか?
どなたか教えてください。よろしくお願いします!!

Private Sub Worksheet_Change(ByVal Target As Range)
 Select case Target.Address
  (1)Case "$E$5"
    ・・・
  (2)Case "$E$6", "$E$24", "$N$6"
    ・・・
  (3)Case "$N$27"
    ・・・
 End Select
End Sub

Aベストアンサー

下記でエラーになりませんでしたが。
追試のつもりで
(1)
Sheet1のChangeイベントに
Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Target.Address
Case "$E$5"
MsgBox "$E$5"
Case "$E$6", "$E$24", "$N$6"
MsgBox "$E$6 Or $E$24 Or $N$6"
Case "$N$27"
MsgBox "$N$27"
End Select
End Sub
(2)N27セルとO27セルを結合
N27セル(他にE5,E6,E24,N6)にデータを入力してみると、止まることなく動きましたが。
私のテストがおかしいですか。
N27セルとO27セルを結合した場合N27に入力するのは当たり前だし。
Sub test01()
Range("O27").Select
End Sub
も実行OKでした。
ーー
>入力規則でリスト選択(3択)する
これは関係ないと踏んで、テストに取り入れてませんが、影響しますかね。

下記でエラーになりませんでしたが。
追試のつもりで
(1)
Sheet1のChangeイベントに
Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Target.Address
Case "$E$5"
MsgBox "$E$5"
Case "$E$6", "$E$24", "$N$6"
MsgBox "$E$6 Or $E$24 Or $N$6"
Case "$N$27"
MsgBox "$N$27"
End Select
End Sub
(2)N27セルとO27セルを結合
N27セル(他にE5,E6,E24,N6)にデータを入力してみると、止まることなく動き...続きを読む

QRange("A" & x) + Range("A" & x+1) +

Range("A" & x) + Range("A" & x+1) + Range("A" & x+2) + ・・・ + Range("A" & x+n)

x:変数(基準点)
n:定数(A列のセルをいくつ足し併せるか、を指定。)


上記プログラムをループ的に行うには、どういう書き方をすれば良いでしょうか?
Do ~ Loop 文 などを使うのでしょうか。

お詳しい方、教えて下さい。
必ずお返事致します。

Aベストアンサー

>上記プログラムをループ的に行うには、どういう書き方をすれば良いでしょうか?
>Do ~ Loop 文 などを使うのでしょうか。
との質問には、#1のuruzさんが言われているように、For Nextが適していると思います。

ただ回す考え自体を除外してもよいのであれば、Sum関数を利用した方が、エリアが広い時は高速に処理を行う事が出来ます。


Option Explicit

Private Const x As Long = 1
Private Const N定数 As Long = 65535

Sub Test()
  Dim dbl1 As Double
  Dim dbl2 As Double
  Dim cur結果

  '----------------
  ' 検証1(回す)
  '----------------
  dbl1 = Now
  cur結果 = サンプル1(N定数)
  dbl2 = Now
  MsgBox "サンプル1(回す):" & cur結果 & vbTab & "計測時間" & dbl2 - dbl1

  '----------------
  ' 検証2(Sum)
  '----------------
  dbl1 = Now
  cur結果 = サンプル2(N定数)
  dbl2 = Now
  MsgBox "サンプル2(Sum):" & cur結果 & vbTab & "計測時間" & dbl2 - dbl1
End Sub

Function サンプル1(n As Long) As Currency
  Dim i As Long
  For i = 0 To n
    サンプル1 = サンプル1 + Range("A" & x + i)
  Next i
End Function

Function サンプル2(n As Long) As Currency
  Dim rng始点 As Range
  Dim rng終点 As Range
  Dim rng範囲 As Range
  
  Set rng始点 = Range("A" & x)
  Set rng終点 = rng始点.Offset(n)
  
  Set rng範囲 = Range(rng始点, rng終点)
  サンプル2 = WorksheetFunction.Sum(rng範囲)
End Function

>上記プログラムをループ的に行うには、どういう書き方をすれば良いでしょうか?
>Do ~ Loop 文 などを使うのでしょうか。
との質問には、#1のuruzさんが言われているように、For Nextが適していると思います。

ただ回す考え自体を除外してもよいのであれば、Sum関数を利用した方が、エリアが広い時は高速に処理を行う事が出来ます。


Option Explicit

Private Const x As Long = 1
Private Const N定数 As Long = 65535

Sub Test()
  Dim dbl1 As Double
  Dim dbl2 As Double
  Dim cur結果

  '...続きを読む

Qあるセルの文字列(または数値)を、他のセルのデータの一部として流用した

あるセルの文字列(または数値)を、他のセルのデータの一部として流用したい場合について。

例えば、

セルA1に 0001
セルA2に K-0001
セルA3に T-0001
セルA4に W-0001

また、
セルB1に 0035
セルB2に K-0035
セルB3に T-0035
セルB4に W-0035

…C、D、E、、、と100項目ほど続く、という場合。

このようにデータを入力していきたい場合、

例えば、A列で、
A1の0001という数字を、A2~A4の中で、「データの一部として代入」したい時、
どういう風に自動化できますでしょうか?

(例)K-0001 の中において、0001という数字は、データの一部として使われている。

ちょっとまとめてみますと、

1行目:●●●●
2行目:K-●●●●
3行目:T-●●●●
4行目:W-●●●●

●●●● は、同列の1行目の数値を、そのまま割り当てる

というような記述ができたらなと思っているわけです。

つまり、1行目に●●●●を打ち込むだけで、その列の2行目以降について、適宜、自動的に必要な数値なり文字列が入力されるようにしたいわけです。

このようなことは、できませんでしょうか?
マクロでも何でも結構です。

どなたか、お詳しい方、教えて下さい。
必ずお返事致します。

あるセルの文字列(または数値)を、他のセルのデータの一部として流用したい場合について。

例えば、

セルA1に 0001
セルA2に K-0001
セルA3に T-0001
セルA4に W-0001

また、
セルB1に 0035
セルB2に K-0035
セルB3に T-0035
セルB4に W-0035

…C、D、E、、、と100項目ほど続く、という場合。

このようにデータを入力していきたい場合、

例えば、A列で、
A1の0001という数字を、A2~A4の中で、「データの一部として代入」したい時、
どういう風に自動化できますでしょうか?

(例)K-0001 の中に...続きを読む

Aベストアンサー

VBAで無く、式で設定します。
「値」として必要なら、それなりの処理をすれば大丈夫。

セルA2に 式[="K-" & A1]
セルA3に 式[="T-" & A1]
セルA4に 式[="W-" & A1]
セルB2に 式[="K-" & B1]
セルB3に 式[="T-" & B1]
セルB4に 式[="W-" & B1]

列方向に同じ式が続くなら、
1)セルA2:A4の式設定を行う。
2)セルA2:A4を選択し、選択範囲右下にある小さな■を右方向にドラッグする。
が簡単。

ネタとなる値を各列の1行目に入力すれば、各列2行目~4行目に表示されます。(この段階では「数式」)
「値」にするには、
1)セルA2~必要な列の4行目までをコピー。
2)そのまま右クリック、「形式を選択して貼り付け」を選び「値」を選択してOK。
です。

Qイベントプロシージャ『 Worksheet_Change 』の対象セル

イベントプロシージャ『 Worksheet_Change 』の対象セルを『 コピー貼付 』の際
どんな方法で貼り付けてもマクロがフリーズすることがなくなる方法をご存知の方が
いらっしゃいましたら、是非その方法を教えて下さい。

『 Worksheet_Change 』対象セルの『 コピー貼付 』の際、ツールの『 編集 』から
『 貼り付け 』の手順で『 Worksheet_Change 』対象セル宛に情報を貼り付けてみた
場合は特に問題なく情報が貼り付いてくれます。

『 Ctrl+V 』で貼り付けた場合も問題なく情報が貼り付いてくれます。

しかし、コピー後に貼り付け先のセルを右クリックして『 形式を選択して貼り付け 』の手順での
貼り付けをしようとすると、必ず決まってマクロがフリーズしてしまいます。

そのため、その度にウィンドウ右上の閉じるボタン『 X 』をクリックして『 保存しますか? 』を
『 キャンセル 』してマクロのフリーズを解除している状況です。

コピー元のセルと貼り付け先のセルは共にセル結合されている状態ですが、この『 セル結合 』は
マクロのフリーズとは無関係のことと思われます。

何か良い解決策をご存知の方、どうか宜しくお願いします。

イベントプロシージャ『 Worksheet_Change 』の対象セルを『 コピー貼付 』の際
どんな方法で貼り付けてもマクロがフリーズすることがなくなる方法をご存知の方が
いらっしゃいましたら、是非その方法を教えて下さい。

『 Worksheet_Change 』対象セルの『 コピー貼付 』の際、ツールの『 編集 』から
『 貼り付け 』の手順で『 Worksheet_Change 』対象セル宛に情報を貼り付けてみた
場合は特に問題なく情報が貼り付いてくれます。

『 Ctrl+V 』で貼り付けた場合も問題なく情報が貼り付いてくれます。

しかし...続きを読む

Aベストアンサー

> ちなみに、ツールの『 編集 』から『 形式を選択して貼り付け 』の手順で貼り付けた場合も
> 問題なく情報が貼り付いてくれます。(マクロがフリーズ状態にはなりません)

> 何故、右クリックして貼り付けを試みた場合にだけマクロがフリーズするのかが分かりません。

単純にWorksheet_Changeの中にコードをシンプルで行ったら、何も問題はありませんでした。
やはりexcuse-meさんが作成したコードが影響あるのだと思います。
私も、EXCELでは色々わからない問題で苦労させられました。
でもどういう時に問題が起こるかは、調査した方が良いかと思います。

できれば今のコードで、問題が出そうな所(例えばセルにセットする等々)をコメントアウトしていき、障害に影響するコードを探してください。
それを知っていることも技術や知識?になると思います。

※役に立たず申し訳ありませんでした。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報