質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

597閲覧

vbaで配列にかぶりのないようにO列の値を入れていきたい

risa__

総合スコア10

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2022/11/03 06:08

前提

vbaでO列(被りのある値あり)の値をかぶりがないように集めていきたいです。

実現したいこと

O列で上のセルと等しくない時だけ配列にそのセルの値を入れていくようにしたいです。
(A列にも同じ行まで他の値が入っています。)

発生している問題・エラーメッセージ

「インデックスが有効範囲にありません。(エラー番号:9)」と出てしまうので、「If Not Not Acord Then・End If」を入れましたが、配列の中に値が入りません。

どなたかご教授いただきたいです。
よろしくお願いいたします。

該当のソースコード

Option Explicit

Sub createUpload()
Dim i As Integer
Dim Acord() As Variant
If Not Not Acord Then
For i = 4 To Cells(Rows.Count, "A").End(xlUp).Row
If Cells(i, "O") = Cells(i - 1, "O") Then
ReDim Preserve Acord(UBound(Acord) + 1)
Acord(UBound(Acord)) = "i"
End If
Next i
End If
Worksheets("Sheet1").Range("E6").Value = Acord
End Sub

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

何やら回りくどい書き方してごっちゃごちゃになってますが、要は「O列のデータのユニークリストをE列に作りたい」ですよね?
ならもっと単純な方法があります。DictionaryやCollectionの仕様を利用すれば楽に実装できるうえに重複する数値のセルが離れてても対応できますよ。

VBA

1Option Explicit 2 3Sub createUpload() 4 Dim A As New Collection, i As Long 5 6 'Collectionは重複するキーを入れようとするとエラーが出ることを利用して重複しないリストを作成 7 On Error Resume Next 8 For i = 4 To Cells(Rows.Count, 1).End(xlUp).Row 9 A.Add Cells(i, 1), Cells(i, 1) 10 Next i 11 On Error GoTo 0 12 For i = 1 To A.Count 13 Cells(i + 5, 5) = A(i) 14 Next i 15End Sub

ほぼここのパクリなのでCollectionの解説なんかはここ見ればより詳しい解説が載ってます

投稿2022/11/03 08:02

pig_vba

総合スコア807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

risa__

2022/11/03 09:13

ご教授いただき、ありがとうございます。 私がやりたいと言っていたことと、やっていたことが違いましたが、ユニークな値の列も作らないといけないので、pig_vbaさんに教えて頂いたことも元に作り直したいと思います。 ありがとうございました!
guest

0

自己解決

お二人ともご教授いただきありがとうございます。
お二人の内容を見て、自分のやっていることとやりたいことが違っていることに気づきました。

O列のユニークリストをE列に作りたいのではなく、
O列に出てくる同じ値の他の行の最小値や、同じ値のカラー列のリストのようなものを作りたいと思っていたので、
同じ値の出てくる最初の行数と最後の行数を出せばいいのだなとわかりました。

もう一度考えなおして、作り直したいと思います。
ご教授いただきありがとうございました!

↓こんなイメージのExcelの表です。
イメージ説明

投稿2022/11/03 09:00

risa__

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

If Not Not Acord Then で配列の初期化を判定しているのだと思いますが、入れる位置を間違っています。

O列で上のセルと等しくない時だけ配列にそのセルの値を入れていくようにしたいです。

ということなら、
If Cells(i, "O") = Cells(i - 1, "O") Then
ではなく、
If Cells(i, "O") <> Cells(i - 1, "O") Then
じゃないですか。

さらに、配列をシートに出力するときは、配列のサイズとセル範囲のサイズをそろえる必要があります。

Acord(UBound(Acord)) = "i"は配列に "i"という文字を格納してますが、やりたいことはそうではないですよね。セルの値を格納するなら、
cord(UBound(Acord)) = Cells(i, "O")ですね。

とりあえず上記を考慮して書き直すと、下記になります。

vba

1Sub createUpload() 2 Dim i As Integer 3 Dim Acord() As Variant 4 5 For i = 4 To Cells(Rows.Count, "O").End(xlUp).Row 6 If Cells(i, "O") <> Cells(i - 1, "O") Then 7 If Not Not Acord Then 8 ReDim Preserve Acord(UBound(Acord) + 1) '配列のサイズを拡張 9 Else 10 ReDim Acord(0) '配列の初期化 11 End If 12 Acord(UBound(Acord)) = Cells(i, "O") 13 End If 14 Next i 15 Worksheets("Sheet1").Range("E6").Resize(, UBound(Acord)).Value = Acord 16End Sub

上記の結果がご希望と異なるなら、どこが違うか指摘してください。

投稿2022/11/03 07:28

hatena19

総合スコア33620

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

risa__

2022/11/03 09:10

ご教授いただき、ありがとうございます。 私がやりたいと言っていたことと、やっていたことが違いましたが、hatena19さんに教えていただいたことも使って作り直したいと思います。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問