Excelのマクロを作成しているのですが
1.指定したセル(例:A1)から特定の文字(例:結果)を含むセルの1つ上のセルまで上から順番に取得したい
(A10セルに『結果』という文字列があるなら1つ上のA9までを取りたい)
2.1でA1値を取得した時に同じ行の値(例:C1)を取得したい
(A2の時はC2、A5の時はC5といったイメージです)
3.1と2で取得した値をコレクション(例:collectionA)にaddしていきたい
stringA1 - stringC1
stringA2 - stringC2
・
・
・
みたいなイメージ?
以上3つの処理をVBAでどう書けば良いかで悩んでいます。
イメージとしては
A1の値を取得→同じ列のC1の値を取得
→A1とC1をcollectionAにadd
→これを『結果』という文字列があるA10の上のA9まで繰り返す
といった感じでしょうか
調べてみてもピンとくるものが見つからず…
どなたかどういう書き方をすれば良いか教えて頂きたいです!
No.1ベストアンサー
- 回答日時:
こんばんは
collectionをですか、普通の配列だと使いにくいのかな・・
同じ値は無いと言う事で 一例サンプルです
範囲取得を行ってその範囲をループしてAddしていきます
使い方が分からないので一応
登録を配列にして C列値(Key)を取得するケースを対応しました
Sub test0()
Dim myCollection As New Collection, i As Long, buf As String
Dim Rng As Range
Dim r As Range, rr As Range
Set r = Range("A1")
Set Rng = Range("A2", Cells(Rows.Count, "A").End(xlUp))
Set rr = Rng.Find(What:="結果", LookIn:=xlValues, LookAt:=xlPart).Offset(-1)
Set r = Range(r, rr)
If Not rr Is Nothing Then
For i = 1 To r.Count
On Error Resume Next
myCollection.Add Array(r(i).Value, r(i).Offset(, 2).Value), r(i).Offset(, 2).Value
Next i
End If
'出力例
Dim coll As Variant
For Each coll In myCollection
buf = buf & coll(0) & "------" & coll(1) & vbCrLf
Next
MsgBox buf
End Sub
On Error Resume Nextは重複エラーの対応用なのでデバッグ時は外して確認してください(変数名は適当なので判り易く変えてください)
お早い回答ありがとうございます!
VBA初心者のため検討はずれなことを言ってたら
申し訳ないのですが、
質問では例としてA1を始点にしていますが
これが例えば始点の場所がはっきりしていなくて
セル自体に名前が付けられているのでそれを元に指定する場合、
Set r = Range(セルの名前)
になるとは思いますが
この時、Set Range〜や、for文の1 to r.Countなど
他の部分の書き方も変わるのでしょうか?
No.5
- 回答日時:
仕様と合うか分かりませんが遊び(検証用)の参考コード
Variant配列とDictionaryのコード
Sub sample()
Dim Dic As Object
Set Dic = CreateObject("Scripting.Dictionary")
Dim r As Range, rr As Range, rng As Range
Set r = Range("AAA").Item(1)
Set rng = Range(r.Offset(1), Cells(Rows.Count, r.Column).End(xlUp))
Set rr = rng.Find(What:="結果", LookIn:=xlValues, LookAt:=xlPart).Offset(-1)
Set r = Range(r, rr)
If rr Is Nothing Then Exit Sub: MsgBox ""
Set r = Range(r, rr).Resize(, 3)
Dim arrData As Variant '配列
arrData = r.Value
Dim i As Long
Dim str As String
str = "Variant配列" & vbCrLf
For i = 1 To UBound(arrData, 1)
str = str & arrData(i, 1) & " : " & arrData(i, 3) & vbCrLf
Next i
MsgBox str
'配列から取り出し重複あるかも
For i = 1 To UBound(arrData, 1)
If Not Dic.Exists(arrData(i, 1)) Then
Dic.Add arrData(i, 1), arrData(i, 3)
End If
Next i
Dim v As Variant
'Dictionaryの要素参照例 vの重複無
str = "Dictionary" & vbCrLf
For Each v In Dic
str = str & v & " : " & Dic.Item(v) & vbCrLf
Next v
MsgBox str
End Sub
No.4
- 回答日時:
>その下のadd周りは基本そのままって認識で良いのでしょうか?
Key取得以外は良いと思います
本当はcollectionでなく範囲(塊)が特定されるのであれば
重複を省くならば連想配列を使用したり
ItemやKeyの取得設定が容易(パラメータがある)
重複を省かない場合は直接
Variant配列で取得すれば簡単かと・・・思います。
もっとも使う時(取得方法)によるかもですがね
お陰様でだいぶ形になってきました!
色々質問攻めしてしまいましたが
丁寧に回答してくださり本当にありがとうございます!
(とりあえずbaは一番最初のにしてます)
No.3
- 回答日時:
>この時、Set Range〜や、for文の1 to r.Countなど
Set r = Range("A1")
これを Set r = Range("AAA") のようにした場合(名前AAA)
そのあとに出て来る定数も変更する必要があります
例えば
Set r = Range("AAA")
Set Rng = Range(r.Offset(1), Cells(Rows.Count, r.Column).End(xlUp))
Set rr = Rng.Find(What:="結果", LookIn:=xlValues, LookAt:=xlPart).Offset(-1)
Set r = Range(r, rr)
r.Select
名前AAAセルから同じ行の結果が入力されている上のセルまでが選択されます
注意としては名前の付いたセルは範囲の可能性もありますので
Itemインデックスで特定したりする必要があるかも知れません
Set r = Range("AAA").Item(1)
更に存在しない場合などのエラー対策も必須になると思います
>r.Count
については最後に再設定したrのセルの個数なので1列のみであれば変える必要はないと思われます
なるほど…!
指定のセルが範囲か、存在の有無は他の部分で事前にチェックする処理が入ってるので大丈夫だと思います!
for文の1 to r.Countは変える必要は無いんですね〜
その下のadd周りは基本そのままって認識で良いのでしょうか?
No.2
- 回答日時:
すみません
Set r = Range(r, rr)
If Not rr Is Nothing Then
上下逆でしたね
あと見つからなかった場合のElse処理も入れた方が良かったかな
myCollection.Add Array(r(i).Value, r(i).Offset(, 2).Value), r(i).Offset(, 2).Value ここが判り難いかも知れないので追記します
VBA Collection をオブジェクトブラウザーで見ると
Add Count Item Remove の4つがあります
Collectionオブジェクトに値を代入する(リストを作る)場合
AddでItem を登録します その時合わせて呼び出しKeyも登録できます
Collection.Add Item:= ,Key:=
Add(Item, [Key], [Before], [After])
作成されたCollection Itemはインデックス又はKeyで呼び出せます
=Collection(Key) =Collection(番目)
worksheetsオブジェクトと似ています KeyがNameみたいな・・です
しかし、例ではKeyを取得するプロパティが無いのでItemを配列にして
Keyと同じ値を付加して代用しています(使う事はないかもですが)
myCollection.Add Array(Item,Keyの代用), Key
従って Item(0) が Item Item(1)がKeyの代替え値になります
もっともご質問の場合、Keyは不要かも知れませんね
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
ゆるやかでぃべーと タイムマシンを破壊すべきか。
これはディベートの論題だと仮定したうえでの回答お願いします。あなたは、その末にタイムマシンを壊してしまうのか、使い道を探すのかどうかを考えてもらいたいです。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
VBA Cのセルが空白でなかったら、Aのセルに順番に数値を入力
Visual Basic(VBA)
-
繰り返し1行~28行までを順順にコピーする方法
Visual Basic(VBA)
-
選択した項目を上から順番にコピーするマクロ
Access(アクセス)
-
-
4
オートフィルタのリストを順番に印刷できるマクロ
Windows Vista・XP
-
5
エクセルVBA 4行飛ばしで転記するループ処理
Excel(エクセル)
-
6
Excelで、リストから順番に値を取り出して複数シートに入力する方法
Excel(エクセル)
-
7
エクセルVBAでコピーして順番に張り付けをしたい!
Visual Basic(VBA)
-
8
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
首吊りどこ締めるの
-
彼女のことが好きすぎて彼女の...
-
検便についてです。 便は取れた...
-
白血球が多いとどんな心配があ...
-
勃起する時って痛いんですか? ...
-
小数点以下を繰り上げたものを...
-
エクセルで数式の答えを数値と...
-
2つの数値のうち、数値が小さい...
-
VLOOKUP関数を使用時、検索する...
-
Excel 0目標に対して数字があ...
-
エクセル指定した範囲からラン...
-
エクセルのラベルの値(文字列...
-
甲状腺が腫れているが血液検査...
-
MIN関数で空白セルを無視したい...
-
これって喉仏ですか? 私は女性...
-
精液の落とし方を教えてください
-
「内数」という言葉の意味がよ...
-
EXCELで条件付き書式で空白セル...
-
excelのIF関数 A,Bの大きいほ...
-
リンク先のファイルを開かなく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
首吊りどこ締めるの
-
彼女のことが好きすぎて彼女の...
-
白血球が多いとどんな心配があ...
-
勃起する時って痛いんですか? ...
-
検便についてです。 便は取れた...
-
精液の落とし方を教えてください
-
EXCELで条件付き書式で空白セル...
-
イタリアから帰国する際、肉製...
-
精子が黄色?
-
2つの数値のうち、数値が小さい...
-
これって喉仏ですか? 私は女性...
-
エクセル指定した範囲からラン...
-
甲状腺が腫れているが血液検査...
-
風俗店へ行く前のご飯
-
エクセルのラベルの値(文字列...
-
小数点以下を繰り上げたものを...
-
ある範囲のセルから任意の値を...
-
エクセルで数式の答えを数値と...
-
知能テストは、今。 義務教育課...
-
MIN関数で空白セルを無視したい...
おすすめ情報