
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルVBAでセルに表示されているとおりの数値を取得したい(時間の計算結果) 1 2022/03/30 17:52
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Excel(エクセル) Excelの空文字判定について 7 2023/01/06 13:25
- Excel(エクセル) エクセルの関数式を教えてください。 2 2022/11/29 21:09
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) Excel VBA 最終行を取得しVlookup関数をコピーする方法をコーディングで教えてください。 3 2023/05/11 13:14
- Excel(エクセル) Excleマクロ セル値の代入と文字列の結合について 3 2022/10/05 16:47
- Excel(エクセル) エクセルで、 A1セルに「A」という値、 B1セルに「B」という値が入っています。 どちらも表示形式 5 2023/02/22 23:05
- Excel(エクセル) Excelで数式をそのままコピーしたい どうすればいいですか? 4 2022/09/16 02:16
- その他(プログラミング・Web制作) python文字化けエラーが発生しているようです 3 2022/04/13 19:41
このQ&Aを見た人はこんなQ&Aも見ています
-
好きな人を振り向かせるためにしたこと
大好きな人と会話のきっかけを少しでも作りたい、意識してもらいたい…! 振り向かせるためにどんなことをしたことがありますか?
-
歳とったな〜〜と思ったことは?
歳とったな〜〜〜、老いたな〜〜と思った具体的な瞬間はありますか?
-
モテ期を経験した方いらっしゃいますか?
一生に一度はモテ期があるといいますが、みなさんどうですか? いまがそう! という方も、「思い返せばこの頃だったなぁ」という方も、よかったら教えて下さい。
-
人生でいちばんスベッた瞬間
誰しも、笑いをとろうとして失敗した経験があると思います。
-
「これいらなくない?」という慣習、教えてください
現代になって省略されてきたとはいえ、必要性のない慣習や風習、ありませんか?
-
ExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。
Visual Basic(VBA)
-
選択した項目を上から順番にコピーするマクロ
Access(アクセス)
-
繰り返し1行~28行までを順順にコピーする方法
Visual Basic(VBA)
-
-
4
VBAで繰り返しコピーしながら下へ移動させる方法
Excel(エクセル)
-
5
別シートに順番で貼り付け
Visual Basic(VBA)
-
6
ある範囲のセルから任意の値を検索して、その隣のセルの値を取得するという関数はありますか?
Excel(エクセル)
-
7
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
8
VBAで特定の文字が入力されたセルを選択
Excel(エクセル)
-
9
エクセルVBAでセルに入力したパスでブックを開く
Excel(エクセル)
-
10
エクセルVBAでコピーして順番に張り付けをしたい!
Visual Basic(VBA)
-
11
VBA Cのセルが空白でなかったら、Aのセルに順番に数値を入力
Visual Basic(VBA)
-
12
【VBA】特定列に文字が入っていたらそのセル行をコピーしてマスターブックの同じ行に貼り付けたい
その他(Microsoft Office)
-
13
VBA別シートの最終行の次行へ転記したい。
Visual Basic(VBA)
-
14
i=cells(Rows.Count, 1)とi=cells(Rows.Count, 2)の違い
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
首吊りどこ締めるの
-
リンク先のファイルを開かなく...
-
小数点以下を繰り上げたものを...
-
2つの数値のうち、数値が小さい...
-
エクセルで数式の答えを数値と...
-
エクセル指定した範囲からラン...
-
VLOOKUP関数を使用時、検索する...
-
一番多く表示のある値(文字列...
-
値が入っているときだけ計算結...
-
MIN関数で空白セルを無視したい...
-
ある範囲のセルから任意の値を...
-
エクセルで空白セルを含む列の...
-
エクセルのラベルの値(文字列...
-
爪が紫色?
-
健否~書類の書き方~
-
EXCELで条件付き書式で空白セル...
-
彼女のことが好きすぎて彼女の...
-
納豆食べた後の尿の納豆臭は何故?
-
エクセルでエラーが出て困って...
-
ワードのページ番号をもっと下...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
首吊りどこ締めるの
-
彼女のことが好きすぎて彼女の...
-
EXCELで条件付き書式で空白セル...
-
爪が紫色?
-
ワードのページ番号をもっと下...
-
エクセル指定した範囲からラン...
-
VLOOKUP関数を使用時、検索する...
-
2つの数値のうち、数値が小さい...
-
小数点以下を繰り上げたものを...
-
EXCELで式からグラフを描くには?
-
風俗店へ行く前のご飯
-
リンク先のファイルを開かなく...
-
エクセルで数式の答えを数値と...
-
勃起する時って痛いんですか? ...
-
値が入っているときだけ計算結...
-
MIN関数で空白セルを無視したい...
-
精子に血が・・・
-
一番多く表示のある値(文字列...
-
エクセルのラベルの値(文字列...
-
白血球が多いとどんな心配があ...
おすすめ情報