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

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

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

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

配列

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

Q&A

解決済

1回答

4652閲覧

VBA コンパイルエラー:配列がありません。 配列があるのに解決しない

kaitsuo

総合スコア1

VBA

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

配列

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

1グッド

0クリップ

投稿2024/01/31 13:33

実現したいこと

商品数量×マージンの計算を行い収支の比較を行いたいです。

発生している問題・分からないこと

ステップ実行を行い、11行目でエラーが発生しています。

エラーメッセージ

error

1コンパイルエラー:配列がありません。

該当のソースコード

Sub CreateStackedBarChart() Dim wsResult As Worksheet, wsGraph As Worksheet Dim rngData As Range, rngIncome As Range, rngExpenses As Range Dim i As Integer, j As Integer Dim personnelCosts As Double, fixedCosts As Double Dim lastRow As Integer Dim productNames As Variant, margins As Double ' 商品名とマージンの初期化 productNames = Array("A", "B", "C") ' ここに商品名を列挙 ReDim margins(LBound(productNames) To UBound(productNames)) ' マージンの入力 For i = LBound(productNames) To UBound(productNames) margins(i) = InputBox(productNames(i) & " のマージンを入力してください", "マージン入力") Next i ' シートの設定 Set wsResult = ThisWorkbook.Sheets("結果") Set wsGraph = ThisWorkbook.Sheets("グラフ") ' 最終行を取得 lastRow = wsResult.Cells(wsResult.Rows.Count, "A").End(xlUp).Row ' データ範囲を設定 Set rngData = wsResult.Range("B2:D" & lastRow) ' 人件費、固定費を入力 personnelCosts = InputBox("人件費を入力してください", "人件費入力") fixedCosts = InputBox("固定費を入力してください", "固定費入力") ' 収入と支出の計算 For i = 2 To lastRow For j = LBound(productNames) To UBound(productNames) If wsResult.Cells(i, 2).Value = productNames(j) Then wsResult.Cells(i, 6).Value = CalculateIncome(wsResult.Cells(i, 4).Value, margins(j)) Exit For End If Next j wsResult.Cells(i, 7).Value = personnelCosts + fixedCosts Next i ' グラフ範囲を設定 Set rngIncome = wsResult.Range("F2:F" & lastRow) Set rngExpenses = wsResult.Range("G2:G" & lastRow) ' グラフの作成 wsGraph.Shapes.AddChart2(297, xlColumnStacked).Select With ActiveChart .SetSourceData Source:=Union(rngIncome, rngExpenses) .FullSeriesCollection(1).Name = "収入" .FullSeriesCollection(2).Name = "支出" .ChartTitle.Text = "収入と支出の積み上げ棒グラフ" End With End Sub Function CalculateIncome(salesVolume As Double, productMargin As Double) As Double ' 収入の計算(商品×マージン) CalculateIncome = salesVolume * productMargin End Function

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

定義をvariantやdoubleなどの変更しても結果は変わらず。
productNamesが別の所で使われていると思い、名前を変更しても変わらず。
ChatGPTにも聞いたがわからず。(GPT4)

補足

初心者です。初歩的な質問かもしれませんがよろしくお願いいたします。

tatsu99👍を押しています

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

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

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

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

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

ABBA

2024/01/31 14:21

Dim productNames As Variant Dim margins As Double でも症状は変わらないですか?
kaitsuo

2024/01/31 14:40

これでは変わりませんでした。 ただ、すでに解答いただいて解決しております。 コメントありがとうございました。
guest

回答1

0

ベストアンサー

Dim margins As Doublemarginsを単純変数と宣言しているからです。配列変数と宣言しましょう。
Dim margins() As Doubleとサイズ未定で良いはずです。

投稿2024/01/31 14:02

otn

総合スコア86281

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

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

otn

2024/01/31 14:08 編集

productNames についてのエラーだという思い込みですね。 他の質問のコメントにも書いたのですが、「XXXがある」と「XXXが無い」は両立しないので、 それが間違いなくあるのなら、コンパイラが無いと言ってる物と、あなたがあると思っている物は別物だと言うことです。
kaitsuo

2024/01/31 14:23

そうだったんですね これはいい経験になりました。 早急なご回答ありがとうございます。 本当に助かりました 質の良い睡眠がとれそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問