• 締切済み

Rangeオブジェクトを一時的に作成することは出来ますか。

こんにちは。 いままでは特定のシートにタイトルや数値、書式を入れて、そのRangeオブジェクトを参照してVBA作成を行っていました。 そこで今度はRangeオブジェクトを新たに作成して、特定セルのセルオブジェクトを、一時的にそこに格納して利用したら便利かと思いまして、色々と方法を考えましたが出来ませんでした。 もちろん個々のセル情報を一時的に保管することは出来ると思いますが、このような使い方が出来れば、今後のVBA作成作業で幅が出来ると思いまして、ご質問をさせて頂きます。 例; new X名 Rangeオブジェクト作成 X名 = Range("A1") Cells.Clear Range("B1").Formula=X名.Formula Range("B1").Interior.Color=X名.Interior.Color A1のオブジェクトを一時的に保管して、シートクリア後にその情報を利用してB1へ戻す。 こんな感じの使い方です。 宜しくお願い致します。

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

i_september さんへ このままだと、申し訳ないので、「私も考えたことがあるからです」という、私の考えた時のサンプルを再現させていただきます。 '-------------------------------------------- 'オブジェクト変数に確保(失敗) Sub TestSample1() 'サンプル作成用 Range("A1:A10").FormulaLocal = "=Row()" Range("A1:A10").Value = Range("A1:A10").Value '-------------- Dim myRange As Range Set myRange = Range("A1:A10") Range("A1:A10").Clear Range("B1:B10").Value = myRange.Value End Sub 'コレクション方式(失敗) Sub TestSample2() 'サンプル作成用 Range("A1:A10").FormulaLocal = "=Row()" Range("A1:A10").Value = Range("A1:A10").Value '-------------- Dim myRangeCollection As New Collection Dim c As Range Dim i As Integer For Each c In Range("A1:A10")  myRangeCollection.Add c Next Range("A1:A10").Clear For i = 1 To myRangeCollection.Count  Cells(i, 2).Value = myRangeCollection.Item(i) Next End Sub '================================= '配列方式(成功) Sub TestSample3() 'サンプル作成用 Range("A1:A10").FormulaLocal = "=Row()" Range("A1:A10").Value = Range("A1:A10").Value '-------------- Dim myRangeValue As Variant myRangeValue = Range("A1:A10").Value Range("A1:A10").Clear Range("B1:B10").Value = myRangeValue End Sub '-------------------------------------- 試してみれば分りますが、配列方式しか出来ません。 今回、改めて作ったものです。 '応用編 Sub TestSample4() 'サンプル作成用 Dim j As Integer Range("A1:B1").CurrentRegion.Clear For j = 1 To Range("A1:A10").Count  Cells(j, 1).FormulaLocal = "=" & j & "*2"  Cells(j, 1).Interior.ColorIndex = j Next '-------------- Dim i As Integer Dim myRangeArray(1 To 2, 1 To 10) As Variant For i = 1 To Range("A1:A10").Count  myRangeArray(1, i) = Cells(i, 1).FormulaLocal  myRangeArray(2, i) = Cells(i, 1).Interior.ColorIndex Next  Range("A1:A10").Clear For i = LBound(myRangeArray, 2) To UBound(myRangeArray, 2)  Cells(i, 2).FormulaLocal = myRangeArray(1, i)  Cells(i, 2).Interior.ColorIndex = myRangeArray(2, i) Next   End Sub  なかなか、煩雑なコードになってしまいました。  私のVBAのキャリアは、たかだか2年程度しかありませんが、一通りは、基礎的なことは終わったつもりです。しかし、たぶん、擬似的なRangeオブジェクトをメモリ上に確保するということは、出来ないと言っても間違いではないと思います。もちろん、Rangeオブジェクトというのを、オートメーション・オブジェクトのメモリ上のワークシートに、ワークブックを Visible=False で、確保するという人が出てくるかもしれません。現実にそういう人がいらっしゃったら申し訳ないのですが、それは、決して誉められた方法ではありません。メモリを圧迫しますし、もし、そこまでするなら、なぜ、Worksheets.Add をしてテンポラリーシートを作らないのか、ということになってしまいます。 こんなところで、ご了解願えますでしょうか?

i_september
質問者

お礼

ご回答有り難う御座います。 内容了解しております。 キャリア2年と仰っていますので、 私も簡単に紹介致します。 社内SEで汎用機からオフコンに移りCOBOLを中心に長らくやってきました。 4,5年前からパソコン系も手掛けています。 VBAを本格的にやり始めたのは1、2年と言ったところでしょうか。やらなければと思いながら月日がたってしまいました。

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

訂正します。 i_september 様 # ご質問のレベルからすると、ベーシックの最初の段階が危ういように読めます。・・・ その段落の部分は、ご質問の内容からは外れて、失礼な内容でした。申し訳ありません。少し、テンションが高すぎました。

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

こんにちは。i_septemberさん、 For Each ~ In で書いた Wendy02です。  私は、覚えている限りは、あまり同じことは書かないつもりではいるのですが、まず、一度、ご自分のランクを確認してみてください。前回と同様に、ご質問のレベルとコードがあまりに開きがありすぎます。 日本VBA協会 Excel 2002 VBA ベーシック http://www.vbaa.jp/vbae/level_excel_bs.htm 項目を見て、全て習得したと思うなら、次のスタンダード それが出来たなと思うなら、その次のプロフェッショナル (試験代は高いし、プライベート資格ですから、好きな人だけがすればよいと思います。)  ここの掲示板のルールは、終始回答に徹することを求められますが、やはり書いているのは人間ですから、いろいろ思うことがあります。  ご質問のレベルからすると、ベーシックの最初の段階が危ういように読めます。もう少し、基礎段階を固めることをお勧めします。独創的な発想は、オールラウンドに学習してから後のことです。少なくとも、スタンダードの項目、プロフェッショナルの項目の一部を治めたぐらいからです。それで、初めて新たなスタートラインに立つのだと思います。 >そこで今度はRangeオブジェクトを新たに作成して、特定セルのセルオブジェクトを、一時的にそこに格納して利用したら便利かと思いまして、色々と方法を考えましたが出来ませんでした。  結論から言えば、答えは、VBAでは、そのようなことは出来ません。これは、私も考えたことがあるからです。  オブジェクト(Object)というのは、プロパティ(Property)の集まりだといっても過言ではありません。Rangeオブジェクトのプロパティには、セルの位置など、さまざまな情報が入っているわけですから、「数値、書式」を入れるためだけの入れ物とは違います。また、名前定義(Names)を使う人がいますが、私は、賛成しかねます。その入れ物は、ある意味でワークシート側の文字列定数だからです。もし入れる場合は、自分で、そういう入れ物(構造体)やクラス(Class)を作らなくてはなりません。仮に、Public 変数にRangeオブジェクトを置いたところで、Rangeオブジェクトは、1つのコンテナ(Container)として、実際の位置情報(セル番地)を持った存在ですから、単に区画を区切っただけであって、それ自体を切り離し、メモリ上に置くことは出来ません。ある程度、VBAに慣れてくれば、出来ないことに気が付きます。ただし、Rangeオブジェクトから、定数を抜き出した2次元配列のみが、仮想メモリ上に置くことが可能ですが、今回のような場合は役に立ちません。 私には、せいぜい、以下のようにしか考えられません。ひとまとめに、構造体を用いてもよいかもしれませんが、そのようなことをしても、手数が増えるだけで定数(Const)で十分だと思います。 例: >Range("B1").Formula=X名.Formula >Range("B1").Interior.Color=X名.Interior.Color   ↓ Const MY_FORMULA As String = "=SUM(R10C2:R[-1]C)" Const MY_INTER_COLOR As Integer = 3 With Range("B1")   .FormulaLocal = MY_FORMULA   .Interior.ColorIndex = MY_INTER_COLOR End With なお、モジュールレベルやプロジェクトレベルの定数にしても良いかもしれません。もちろん、一般的な変数(Valuables)としても、モジュールレベルやプロジェクトレベルで、プロパティの値は、確保できます。 .

i_september
質問者

お礼

ご回答ありがとう御座います。 Wendy02さんも「私も考えたことがあるからです」と 仰っていますから、同様に疑問を感じることは 自然のように思います。 コードは誤解が無いよう補助的に単純にしています。 不特定多数の人が参加していますので、 難しいところがあるようですね。

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

こんにちは。 オブジェクトを変数に保存したいということですね? その場合は次のように オブジェクト変数を宣言して、 Setステートメントを利用します。 ------------------------------------------- Sub Test  Dim X名 As Range  Set X名 = Range("A1")  Cells.Clear  Range("B1").Formula=X名.Formula  Range("B1").Interior.Color=X名.Interior.Color End Sub ---------------------------------------------- 勘違いでしたらご容赦願います。 以上です。  

i_september
質問者

お礼

ご回答有難う御座います。 この方法は試してみましたが、 X名は"A1"の参照となるため、 Clearの時点でX名の内容も 消えてしまいます。

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

関連するQ&A

  • VBAのRangeオブジェクトについて

    いつもお世話になっております。 VBAのRangeオブジェクトについてご教示下さい。 例えば下記のPGを組みます。 Sub test() Dim r As Excel.Range Set r = Me.Range("A1") Debug.Print r.Cells.Count End Sub この時、Debug.Printには"1"と表示されます。 Debug.Printでブレイクを置き、ここでA列を削除するとDebug.printでエラーが出てしまいます。 Rangeオブジェクト生成後、もしも参照先のセルが削除してしまった場合、条件分岐の処理を入れたいのですが、どのように処理をいれればよろしいでしょうか? セル削除後、Rangeのプロパティを参照した時点でエラーが発生してしまいます。 Typeで確認するとRangeがちゃんと取れるのですが・・・。 "参照先のセルが消されたかどうか"を判別する方法はあるのでしょうか?

  • エクセルRangeオブジェクトの使い方

     エクセルで名簿を作ろうとしています。よくあることですが、入力を簡単にするため、入力メニューを作り、一人目を入力したら次の行に行くようにマクロを考えているのですが、その前に最初のセルを選択させようと下記のように記述したところ、コンパイル時に実行時エラー'1004'アプリケーション定義またはオブジェクト定義エラーです。というエラーになります。  また、作成したコマンドボタンから実行しても実行時エラー'1004'RangeクラスのSelectメソッドが失敗しましたというエラーになります。 Rangeオブジェクトの記載の仕方は間違いないと思うのですが....ちなみに書こうとしている意味は、表が、全く登録がない場合、最初B2セルから記載していくように考え、追加登録していくときはB1セル(項目に当たる行)から空白行になるまで改行するように考えました。 記述内容 Sub CommandButton1_Click() Worksheets("名簿").Select If Range("B2").Value = "" Then Range("B2").Select ←エラーになる行です Else Range("B1").Select Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Select End If 名簿登録.Show End Sub

  • rangeの意味

    xをワークシートオブジェクトとすると、 With x.range("A1")のrange("A1")とは 何を意味しているんでしょうか?セルA1を 参照していますよということでしょうか?

  • Excel: SetステートメントでRangeオブジェクトに名前付きセルを指定したい

    Excel VBAです。 RangeオブジェクトにSetステートメントで名前付きセルを指定したのですが、結果、RangeオブジェクトはEmpty値になってしまいます。名前付きではない別のセルでやってみるとうまくいきます。 Dim sSheet as Worksheet Dim wRange as Range Worksheets("Sheet1").Select 【失敗する例:名前付きセルを指定】 Set wRange=Range("c_ControlNo") 【うまくいく例:セルA1を指定】 Set wRange=Range("A1") 名前付きセルは指定できないなんてことはない、と思うのですが、どこがおかしいのでしょうか? アドバイスをお願いします。

  • 2次方程式を解くマクロを作成したのですが解けません。

    2次方程式を解くマクロを作成したのですが解けません。 マクロの授業で2次方程式を解くマクロを作成したのですが途中で何がなんだかわかんなくなってしまいました。 どこがどう間違っているのかわからない初心者なのでわかりやすい解説よろしくお願いします。 ■二次方程式の解を求めるマクロ マクロ名 niji 条件 課題のファイルのsheet1を開き、 A1にxの二乗の係数 C3にxの係数 E3に定数項 を入力した場合 判別式の結果より、I3に解の状態を表示させる 表示は 2つの異なる実根 重根 複素数根 のいずれかとする。 そして、J3、K3に二次方程式の解を表示させる。解は二次方程式の解の公式 より求める。 複素数は i としてあらわす。 以下作成したマクロ↓ Sub niji() Range("A3").Select a = ActiveCell.Formula Range("C3").Select b = ActiveCell.Formula b2 = -b / 2 Range("E3").Select c = ActiveCell.Formula d = b * b - 4 * a * c Range("J3,K3").Formula = "" 'ActiveCell.Formula = "" If d > 0 Then x1 = b2 + Sqr(d) / 2 x2 = b2 - Sqr(d) / 2 Range("J2").Select ActiveCell.Formula = "解1" Range("J3").Select ActiveCell.Formula = Str$(x1) Range("K2").Select ActiveCell.Formula = "解2" Range("K3").Select ActiveCell.Formula = Str$(x2) End If If d = 0 Then Range("J2").Select ActiveCell.Formula = "x =" Range("J3").Select ActiveCell.Formula = Str$(b2) End If If d < 0 Then d2 = Sqr(-d) / 2 Range("J2").Select ActiveCell.Formula = "x1 =" Range("J3").Select ActiveCell.Formula = Str$(b2) + " +- i " + Str$(d2) End If If "J3" = "K3" Then Range("I3").Select ActiveCell.Formula = "重解" End If If "J3" > "K3" Then Range("I3").Select ActiveCell.Formula = "2つの異なる実根" End If If "J3" < "K3" Then Range("I3").Select ActiveCell.Formula = "2つの異なる実根" End If Range("b8").Select End Sub マクロ初心者なのでわかりやすい解説お願いします。

  • 【Excel2010】VBAのFormulaの意味

    エクセル2010を使っている者です。 離れたセルの数字を置き換えられたらなと思ってその方法を探していたら、以下のマクロが見つかりました。 VBAは少しだけかじっているのでFormulaってなんだろうと思って、Formulaを消した状態でマクロを実行してみたのですが、消す前と同様にうまく動きました。 Formulaとはどういったものなのでしょうか?また、この場合、使う意味はあったのでしょうか? Sub swap() Dim w, x As Range, y As Range If Selection.Areas.Count <> 2 Then Exit Sub Set x = Selection.Areas(1) Set y = Selection.Areas(2) w = x.Formula x.Formula = y.Formula y.Formula = w End Sub それと、formulaのことを自分で調べようと思って検索していたら以下の式が見つかりました。 理解できなかったのですが、この場合もFoumulaと書く意味はあるのでしょうか? Range("A1").Formula = "=TODAY()" Range("B1").Formula = "=NOW()" Range("A5").Value = "合計" Range("B5").Formula = "=$B$2+$B$3+$B$4" よろしくお願いいたします。

  • Excel VBA 選択した範囲の1行目に色を付けたい

    VBA初心者です。 セルB4~F15に表が作成されています。 プロシージャを実行して、セルB5~F15にブルー。表1行目のセルB4とF4のみに赤の色を付けるというコードを記述したいのです。 以下のように記述しました。 Sub セルに色()    Range("B4").Select    ActiveCell.CurrentRegion.Select    Selection.Interior.ColorIndex = 8    Selection.Range(Cells(1, 1),Cells(1,5)).Interior.ColorIndex = 3 End Sub Rangeでは連続シートになるため、Unionに変更してみましたが、 Unionはオブジェクトがサポートされていない旨のエラーが出ました。 どのように記述すればよいでしょうか? どうぞよろしくお願いいたします。

  • VBAのオブジェクトブラウザの見方

    VBAのオブジェクトブラウザの見方がよくわからないので教えてください。 たとえば、オブジェクトブラウザから「countif」を見ているのですが、   Function CountIf(Arg1 As Range, Arg2) As Double の部分の見方がよくわかりません。 (1)先頭の「Function」は、ワークシート関数だからFunctionと付いているのでしょうか? (2)「Arg1 As Range, Arg2」となっていますが、なぜ、Arg2の後に「As Range」がつかないのでしょうか? セルの範囲ではなく、VBAで指定できるからですか? (3)「 As Double」は何を指しているのでしょうか? 戻り値ですか? 数値で返ってくるからDoubleなのですか? 以上です。よろしくお願い致します。

  • Range("Sheet2!A1")が何故通る?

    Excel VBAでRange関数を使っていて不思議に思う事があったので、少し質問させて下さい。 バージョンは、Office Standard 2010のVer14(32bit)です。 [Range]は、実際には[ActiveSheet.Range]の省略という認識でした。 そして、例えばSheet1がアクティブな状態で[ActiveSheet.Range("Sheet2!A1")]とすればエラーがでます。 [Range(Worksheets("Sheet2").Range("A1"))]でもエラーになります。 ところがこれが、[Range("Sheet2!A1")]だけにすると、問題なくSheet2のA1セルが取得できるのです。 セルに名前を付けた場合も、同じようにアクティブでないシートのセルが取得できました。 場合によって、Rangeの親オブジェクトがActiveSheetであったりなかったりするようなのですが、これはどのような仕様なのでしょうか? Microsoft Docsをざっと見たのですが、載ってなさそうだったので。 以下、自分がチェックに使ったコードです。 Sheet2!A1セルにShTwoという名前を付けています。 Sub test()  Debug.Print Range("A1").Address  Debug.Print Range("A1").Parent.Name ' Debug.Print ActiveSheet.Range("Sheet2!A1").Address '1004:アプリケーション定義またはオブジェクト定義のエラーです  Debug.Print Range("Sheet2!A1").Address  Debug.Print Range("Sheet2!A1").Parent.Name ' Debug.Print ActiveSheet.Range("ShTwo").Address'1004:アプリケーション定義またはオブジェクト定義のエラーです  Debug.Print Range("ShTwo").Address  Debug.Print Range("ShTwo").Parent.Name ' Debug.Print ActiveSheet.Range(Worksheets("Sheet2").Range("A1")).Address '1004:アプリケーション定義またはオブジェクト定義のエラーです ' Debug.Print Range(Worksheets("Sheet2").Range("A1")).Address ''Range'メソッドは失敗しました:'_Global'オブジェクト End Sub

  • C#でのExcel操作について.(Rangeオブジェクトへの複数範囲設定)

    C#でExcelのグラフを作成させるプログラムを書いるのですが,Rangeオブジェクトへの離れたセルの複数範囲を指定したいのですが,いろいろ調べてみましたがどうしても解決できません. 調べた限りではVBではできるようですが,C#ではできないのでしょうか? Excel.ChartObjects chartObjects =(Excel.ChartObjects)oSheet.ChartObjects(Type.Missing); Excel.ChartObject chartObj = chartObjects.Add(100, 100, 700, 400); Excel.Chart chart = chartObj.Chart; Excel.Range chartRange = oSheet.get_Range("B1","B3"); /*↑の部分で("B1:B3,B5:B8,C5")のようなことをしたいです.RangeにAddメソッドのようなものがあればと思っているのですが無いみたいなので‥‥*/ chart.SetSourceData(chartRange,Excel.XlRowCol.xlColumns); Excel.SeriesCollection seriesCollection=(Excel.SeriesCollection)chart.SeriesCollection(Type.Missing); よろしくお願いします.

専門家に質問してみよう