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

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

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

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

配列

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

Q&A

解決済

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

risa__
risa__

総合スコア1

VBA

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

配列

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

3回答

0グッド

0クリップ

289閲覧

投稿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/ツールのバージョンなど)

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答3

1

何やら回りくどい書き方してごっちゃごちゃになってますが、要は「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

総合スコア670

spoofy_dragonを押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

risa__

2022/11/03 09:13

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

0

自己解決

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

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

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

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

投稿2022/11/03 09:00

risa__

総合スコア1

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

総合スコア32038

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

risa__

2022/11/03 09:10

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

VBA

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

配列

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