![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_15.png?e8efa67)
こんにちは。
いままでは特定のシートにタイトルや数値、書式を入れて、その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へ戻す。
こんな感じの使い方です。
宜しくお願い致します。
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 をしてテンポラリーシートを作らないのか、ということになってしまいます。
こんなところで、ご了解願えますでしょうか?
ご回答有り難う御座います。
内容了解しております。
キャリア2年と仰っていますので、
私も簡単に紹介致します。
社内SEで汎用機からオフコンに移りCOBOLを中心に長らくやってきました。
4,5年前からパソコン系も手掛けています。
VBAを本格的にやり始めたのは1、2年と言ったところでしょうか。やらなければと思いながら月日がたってしまいました。
No.3
- 回答日時:
訂正します。
i_september 様
# ご質問のレベルからすると、ベーシックの最初の段階が危ういように読めます。・・・
その段落の部分は、ご質問の内容からは外れて、失礼な内容でした。申し訳ありません。少し、テンションが高すぎました。
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)としても、モジュールレベルやプロジェクトレベルで、プロパティの値は、確保できます。
.
ご回答ありがとう御座います。
Wendy02さんも「私も考えたことがあるからです」と
仰っていますから、同様に疑問を感じることは
自然のように思います。
コードは誤解が無いよう補助的に単純にしています。
不特定多数の人が参加していますので、
難しいところがあるようですね。
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
----------------------------------------------
勘違いでしたらご容赦願います。
以上です。
ご回答有難う御座います。
この方法は試してみましたが、
X名は"A1"の参照となるため、
Clearの時点でX名の内容も
消えてしまいます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Webアプリケーションのエラーメ...
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
Object型からDouble型へのキャスト
-
C#でフォームのオブジェクト名...
-
VBA 同じ名前のオブジェクトを...
-
EXCEL VBAにて動的にCheckBOXを...
-
ビジュアルC++でボタンの有...
-
ワイルドカード<?>と型パラメー...
-
newは明示的にした方が良いのか?
-
error C2712: オブジェクト ア...
-
VBAからノーツを起動
-
C++でのクラスオブジェクトの破棄
-
Struts Listの情報がgetできない。
-
JavaScriptとjQueryのbindの違い
-
MATLABプロットの線にアルファ...
-
戻り値がクラスオブジェクト
-
VBAのWindowオブジェクトとWork...
-
ifstreamクラスとistreamクラス
-
ADO オブジェクトの渡し方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
EXCEL VBAにて動的にCheckBOXを...
-
VBA 同じ名前のオブジェクトを...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
ワイルドカード<?>と型パラメー...
-
COMコンポーネントって何?
-
Object型からDouble型へのキャスト
-
LISTBOXの内容が更新されま...
-
オブジェクトレベルとメタレベル
-
ビジュアルC++でボタンの有...
-
戻り値がクラスオブジェクト
-
CoCreateInstanceでエラーになる。
-
Accessの連結・非連結オブジェ...
-
オブジェクト名をforループ内で...
-
JqueryとPrototypeの比較
-
JAVAからHTMLへ値を返す方法
-
VBAでvlookup関数から、別シー...
-
Vbで通常使用するプリンターを...
おすすめ情報