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も見ています
-
カンパ〜イ!←最初の1杯目、なに頼む?
飲み会で最初に頼む1杯、自由に頼むとしたら何を頼みますか? 最初はビールという縛りは無しにして、好きなものを飲むとしたら何を飲みたいですか。
-
大人になっても苦手な食べ物、ありますか?
大人になっても、我慢してもどうしても食べれないほど苦手なものってありますよね。 あなたにとっての今でもどうしても苦手なものはなんですか?
-
遅刻の「言い訳」選手権
よく遅刻してしまうんです…… 「電車が遅延してしまい遅れました」 「歯医者さんが長引いて、、、」 「病院が混んでいて」 などなどみなさんがこれまで使ってきた遅刻の言い訳がたくさんあるのではないでしょうか?
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
好きな和訳タイトルを教えてください
洋書・洋画の素敵な和訳タイトルをたくさん知りたいです!【例】 『Wuthering Heights』→『嵐が丘』
-
VBA Cのセルが空白でなかったら、Aのセルに順番に数値を入力
Visual Basic(VBA)
-
VBAで繰り返しコピーしながら下へ移動させる方法
Excel(エクセル)
-
繰り返し1行~28行までを順順にコピーする方法
Visual Basic(VBA)
-
-
4
ExcelVBAを使って、値がある場合は作業を繰り返し実行するプログラムを作成したい。
Visual Basic(VBA)
-
5
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
首吊りどこ締めるの
-
白血球が多いとどんな心配があ...
-
彼女のことが好きすぎて彼女の...
-
EXCELで条件付き書式で空白セル...
-
エクセルで数式の答えを数値と...
-
EXCELで式からグラフを描くには?
-
2つの数値のうち、数値が小さい...
-
小数点以下を繰り上げたものを...
-
値が入っているときだけ計算結...
-
リンク先のファイルを開かなく...
-
エクセル指定した範囲からラン...
-
MIN関数で空白セルを無視したい...
-
EXCELの条件付き書式で数式を空...
-
風俗店へ行く前のご飯
-
これって喉仏ですか? 私は女性...
-
エクセルで空白セルを含む列の...
-
至急!尿検査前日にオナニーし...
-
エクセルのラベルの値(文字列...
-
エクセルでエラーが出て困って...
-
ワードのページ番号をもっと下...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
首吊りどこ締めるの
-
彼女のことが好きすぎて彼女の...
-
白血球が多いとどんな心配があ...
-
検便についてです。 便は取れた...
-
精液の落とし方を教えてください
-
勃起する時って痛いんですか? ...
-
2つの数値のうち、数値が小さい...
-
エクセル指定した範囲からラン...
-
エクセルで数式の答えを数値と...
-
これって喉仏ですか? 私は女性...
-
小数点以下を繰り上げたものを...
-
EXCELで条件付き書式で空白セル...
-
EXCELで式からグラフを描くには?
-
イタリアから帰国する際、肉製...
-
エクセルのラベルの値(文字列...
-
Excel 0目標に対して数字があ...
-
ある範囲のセルから任意の値を...
-
風俗店へ行く前のご飯
-
リンク先のファイルを開かなく...
-
甲状腺が腫れているが血液検査...
おすすめ情報