こんにちは。
いままでは特定のシートにタイトルや数値、書式を入れて、その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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Visual Basic(VBA) 【VBA】Excelの特定範囲のセルを画像で保存したい 2 2023/01/25 13:06
- Excel(エクセル) エクセル VBAの構文について 2 2023/02/10 18:26
- Visual Basic(VBA) エクセルVBA 3 2022/06/23 20:00
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/03/07 14:05
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/08 09:08
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/03/12 10:10
- Visual Basic(VBA) エクセルのマクロについて教えてください。 5 2023/06/02 08:44
- Visual Basic(VBA) エクセルのマクロとシートの保護について教えてください。 1 2022/10/18 08:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelで =EMBED("Acrobat Docu...
-
パワーポイントのVBAでテキスト...
-
withを入れ子にして使う方法
-
VBAのWindowオブジェクトとWork...
-
距離変換画像について
-
VBA 下記ソースについて質問で...
-
オブジェクト指向の間違いと改...
-
Google Apps Scriptの時刻の計算
-
Unity,C#、複数の子オブジェク...
-
クラスのインスタンスの生成
-
Rangeオブジェクトに格納できない
-
オブジェクト名をforループ内で...
-
Visual C++で"オートメーション...
-
インデザインのテキスト回り込み
-
bmp画像をjpegやpng画像に圧縮...
-
JAVAからHTMLへ値を返す方法
-
.getElementById()のエラーにつ...
-
VBからBATファイルを起動して戻...
-
オブジェクトを枠線に合わせる...
-
コンボボックスを連動させる仕...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パワーポイントのVBAでテキスト...
-
Excelで =EMBED("Acrobat Docu...
-
EXCEL VBAにて動的にCheckBOXを...
-
ワイルドカード<?>と型パラメー...
-
C#でフォームのオブジェクト名...
-
VBAのWindowオブジェクトとWork...
-
vb.net オブジェクト指向につい...
-
COMコンポーネントって何?
-
オブジェクトレベルとメタレベル
-
ビジュアルC++でボタンの有...
-
時間帯判定をする。
-
LISTBOXの内容が更新されま...
-
VBA 同じ名前のオブジェクトを...
-
オブジェクト名をforループ内で...
-
Object型からDouble型へのキャスト
-
ADO オブジェクトの渡し方
-
bmp画像をjpegやpng画像に圧縮...
-
Vbで通常使用するプリンターを...
-
戻り値がクラスオブジェクト
-
VBAでvlookup関数から、別シー...
おすすめ情報