「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と関連する良く見られている質問

QCGIが、aタグで呼ばれたか、imgタグでか区別するには?

php内で、標記を切り分けて、
imgタグなら?指定に従った画像を、aタグなら?指定に従ってHtmlを出したいのです。
(imgタグの方が主機能です。Htmlにはリンクを入れる必要があるので、
 imgに統一できません)
常に  header('Content-Type: image/gif');
でよいように思えますが、?以降を間違えられた時、
クリックすると、メチャメチャな画面が出てしまいます。

$_SERVERを、Googleって見ましたが、わかりません。
ご教授お願いします。

尚、切り分けた後は、($callで判定できるとすると)
if ($call == "img"){
 header('Content-Type: image/gif');
   :
  (Img作成の処理)
   :
}else if ($call == "a" || GETやPOST){
 header("Content-Type: text/html; charset=SJIS");
   :
  (Html作成の処理)
   :
とするつもりです。

そもそも、何をしたいかというと、
?以降にLaTeXの数式を書けば、(mimeTexを呼んで)イメージを返したい
のです。
だいたいは、出来ています。
http://blogs.yahoo.co.jp/kafukanoochan/62474900.html

php内で、標記を切り分けて、
imgタグなら?指定に従った画像を、aタグなら?指定に従ってHtmlを出したいのです。
(imgタグの方が主機能です。Htmlにはリンクを入れる必要があるので、
 imgに統一できません)
常に  header('Content-Type: image/gif');
でよいように思えますが、?以降を間違えられた時、
クリックすると、メチャメチャな画面が出てしまいます。

$_SERVERを、Googleって見ましたが、わかりません。
ご教授お願いします。

尚、切り分けた後は、($callで判定できるとすると)
...続きを読む

Aベストアンサー

・ブラウザからのリクエストとしては、A からのアクセスなのか IMG からのアクセスなのかを直接的に 区別するような情報はありません。
・ただし、Accept: リクエストヘッダ($_SERVER['HTTP_ACCEPT']) に、そのリクエストでブラウザが受け取り可能なデータ形式の情報が入っています。
(Accept にどういう情報を載せるかはブラウザ次第です)


というわけで、HTTP_ACCEPT が、「IMG 経由の場合は画像形式のみを指定されている」のであれば、どちらからあのアクセスか判断できることになります。

面白そうなのでちょっと調べてみました。いくつかのブラウザについて具体的に調べてみたところ、なかなか簡単には判断できなさそうです。

・Firefox3.5
IMG の場合: image/png,image/*;q=0.8,*/*;q=0.5
A の場合: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
アドレスバー直打ち: Aの場合と同じ

・IE8
IMGの場合: */*
Aの場合: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, application/pdf, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/x-silverlight, application/x-shockwave-flash, */*
アドレスバー直打ち: Aの場合と同じ

・Opera 10
IMGの場合: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Aの場合 : text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
アドレスバー直打ち: Aの場合と同じ

といった感じになりました。
ブラウザが送り出すリクエスト情報については、このAccept:以外はまったく同じでしたので、Accept以外の情報で判断することは不可能です。

お望みの機能を実現するとしたら、上述のようなAccept:ヘッダ情報の違いで判別するしかありません。
上述のように、ブラウザ毎に動作が違いますから、汎用的な判断は無理そうです。
どうしても実現したかったら、User-Agent: リクエストヘッダ($_SERVER['HTTP_USER_AGENT'])によるブラウザチェックを併用して、

・Firefox3.5の場合→HTTP_ACCEPT にtext/ が含まれるなら A 経由と判定
・IE8の場合→HTTP_ACCEPT に application/ が含まれるなら A 経由と判定
・Opera 10 の場合→判断不可能

といった感じでしょうか。

このやり方で実現するなら、私が今回調べた Fx3.5・IE8以外にも、使われる可能性のあるブラウザについては、どうなっているのか実際に調べる必要があるかと思います。
また、User-Agent は詐称可能ですから、使っているブラウザの誤判定による誤動作の可能性は捨て切れません。

また、アドレスバーに直接URLを入れた場合は、A経由相当になりますので、
画像として表示することはできなくなります。

・ブラウザからのリクエストとしては、A からのアクセスなのか IMG からのアクセスなのかを直接的に 区別するような情報はありません。
・ただし、Accept: リクエストヘッダ($_SERVER['HTTP_ACCEPT']) に、そのリクエストでブラウザが受け取り可能なデータ形式の情報が入っています。
(Accept にどういう情報を載せるかはブラウザ次第です)


というわけで、HTTP_ACCEPT が、「IMG 経由の場合は画像形式のみを指定されている」のであれば、どちらからあのアクセスか判断できることになります。

面白そうな...続きを読む

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を考えた場合変数とおなじであるからだとおもいます

QWORD2007での数式のフォントについて

WORD2007で,数式を挿入する際,ツールにある数式をこれまでWORD2003などにあった数式エディタと同じフォントで使用したいのですがどうすれば良いのでしょうか?
また数式エディタのショートカットを作る方法があればお教えください。どうも最新の数式は使いづらくて…。

Aベストアンサー

挿入タブの数式の書式関しては分かりませんが、同じ挿入タブに有るオブジェクト挿入からの数式(数式3.0等)は今までとフォントが同じかと思います。

ショートカットに関してはOfficeボタン(左上のスタートメニュー)のWordのオプション

ユーザー設定

ショートカットキー:ユーザー設定
の中で設定出来ます。

個人的にはWord2007になってから最初は使い勝手に戸惑っていましたが、TeXの様に直線入力する分には寧ろ使いやすくなっていて新しい数式エディタもオススメです!

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)にデータを入力してみると、止まることなく動き...続きを読む

Q=A1といった簡単な数式が・・・

セルに数式を打ち込みますが、何かの拍子に、数式を読まなくなります。
たとえば、=A1といったような数式も、セル内にそのまま"=A1"と表示されます。数式を変更したりすると、おかしくなるようです。
いったんセル内がおかしくなると、どのような数式を入れても、そのままの文字列としてしか表示されません。

同じシート内の他の未使用のセルで数式を入れると機能しますが、数式をいじると、文字列表示になってしまい、元に戻りません。

久しぶりにエクセルの数式を使いましたが、入り口でつまずいています。
助けてください。

Aベストアンサー

こんばんは。

>何かの拍子に、数式を読まなくなります。

これって、はっきり言ってバグに近いなって思うことがあります。MSは、直してほしいと思います。

つまり、#2の人のおっしゃっているのは、その数式のセルが書式-文字列になっている場合ですよね。

そうでなくて、A1の書式が、文字列になっている場合、例えば、C1: に「 =A1 」と入れますよね。「数式をいじると、文字列表示になってしまい、元に戻りません。」ということで、「そのまま"=A1"」になってしまいます。

それをドラッグすると、他の数式も、文字列になってしまいます。

この状態が正しいとしたら、

「入り口でつまずいています。」

早めに知ってよかったと思いますね。私は、何年も、つまづいてしまいました。^^;

私の悪いのは、こういう状況って、レアケースなので、何年間か、ツール-オプション-データ範囲の形式および数式を拡張する で直ると思っていました。

結論としては、

「書式-文字列」は必要ない限りは避けること。
  と
書式-文字列のセルにしたら参照しないこと。

場合によって、文字列は、「'123」とプリフィックス(接頭辞)をつけること。

ぐらいが対処法ではないか、と思います。
状況が違っていたらすみません。たぶん、Excel 2000 ~2003 共通の話だと思います。

こんばんは。

>何かの拍子に、数式を読まなくなります。

これって、はっきり言ってバグに近いなって思うことがあります。MSは、直してほしいと思います。

つまり、#2の人のおっしゃっているのは、その数式のセルが書式-文字列になっている場合ですよね。

そうでなくて、A1の書式が、文字列になっている場合、例えば、C1: に「 =A1 」と入れますよね。「数式をいじると、文字列表示になってしまい、元に戻りません。」ということで、「そのまま"=A1"」になってしまいます。

それをドラッグすると...続きを読む

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エクセルで数式を変更すると

数式の入ったエクセルのセルの数式を変更したいと思い
数式バーから、数式の不要な部分を消去しました。
すると、その部分のセルの表示が、数式による結果ではなく
数式そのままが表示されます。
他のセルの書式をコピーしても、直りません。
どうしたら、良いのでしょうか。
教えてください。

Aベストアンサー

No.1さんの言われている通りです。
式の前の「=」は必須です。これがないとエクセルは式とは認めず「文字列」とみなすようです。

ちなみに、問題のセルを選択して、右クリック→「セルの書式設定」→「表示形式」タブで、ブルーのバーが「文字列」以外を指しているかどうかを確認してください。

もし「文字列」なら「標準」を選んでみてください。

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数式オブジェクトの変換

Word2003で作成した数式を、Word2007で追加された数式編集で
編集できるようにしたいのですがどうしたらよいでしょうか?

word2003で作成したものは、数式3.0というオブジェクトだったのですが
word2007を使うようになってからは、こちらに搭載された数式編集機能
の方が使いやすいため、どうしても数式3.0のオブジェクトを変換したいのです。

よろしくお願いいたします。

Aベストアンサー

2003のファイルを2007で開くと、数式をWクリックすれば、
「数式3.0」が起動し編集できますが、新たに2007の数式は
使えません。

一旦、2007形式で保存し直せば、2007の数式エディタが
使えますが、2003で作成した数式は「数式3.0」が起動します。
これを使い編集はできます。

2007にも「挿入」「オブジェクト」に「数式3.0」があるので、
これが起動します。

http://office.microsoft.com/ja-jp/word-help/HA010117654.aspx

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ランキング