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

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

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

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

3回答

519閲覧

VBA コンパイルエラー ByRef引数の型が一致しません。

kaitsuo

総合スコア1

VBA

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

1グッド

0クリップ

投稿2024/02/05 14:13

実現したいこと

このプログラムは積み上げ棒グラフを作成してもらう内容。「データの範囲を指定 (A1からE2)」の部分でアラーが発生しており、最後の「グラフの作成」までは進めていない。関数を使って表を転置させて、利用したい。

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

転置前表範囲と転置先シートを入れることで、指定したシート(転置先シート)に転置後の表が入る関数を作成した。
これを使おうとすると「コンパイルエラー ByRef引数の型が一致しません。」が発生する。

エラーメッセージ

error

1コンパイルエラー ByRef引数の型が一致しません。

該当のソースコード

VBA

1Sub CreateStackedBarChart() 2 Dim wsResult As Worksheet, wsGraph As Worksheet 3 Dim rngData As Range, rngIncome As Range, rngExpenses As Range 4 Dim i As Integer, j As Integer 5 Dim personnelCosts As Double, fixedCosts As Double 6 Dim lastRow As Integer 7 Dim productNames As Variant, margins() As Double 8 9 ' 商品名とマージンの初期化 10 productNames = Array("A", "B", "C") ' ここに商品名を列挙 11 12 ReDim margins(LBound(productNames) To UBound(productNames)) 13 14 ' マージンの入力 15 For i = LBound(productNames) To UBound(productNames) 16 margins(i) = InputBox(productNames(i) & " のマージンを入力してください", "マージン入力") 17 Next i 18 19 ' シートの設定 20 Set wsResult = ThisWorkbook.Sheets("結果") 21 Set wsGraph = ThisWorkbook.Sheets("グラフ") 22 Set wsTrsps = ThisWorkbook.Sheets("範囲") 23 24 ' 最終行を取得 25 lastRow = wsResult.Cells(wsResult.Rows.Count, "A").End(xlUp).Row 26 27 ' データ範囲を設定 28 Set rngData = wsResult.Range("B2:D" & lastRow) 29 30 ' 人件費、固定費を入力 31 personnelCosts = InputBox("人件費を入力してください", "人件費入力") 32 fixedCosts = InputBox("固定費を入力してください", "固定費入力") 33 34 ' 収入の計算 35 a = 1 36 For i = 2 To lastRow 37 For j = LBound(productNames) To UBound(productNames) 38 If wsResult.Cells(i, 2).Value = productNames(j) Then 39 a = a + 1 40 wsResult.Cells(a, 6).Value = CalculateIncome(wsResult.Cells(i, 4).Value, margins(j)) 41 42 Exit For 43 End If 44 Next j 45 Next i 46 47 '支出の計算 48 wsResult.Cells(a + 1, 7).Value = personnelCosts 49 wsResult.Cells(a + 2, 7).Value = fixedCosts 50 51 ' グラフ範囲を設定 52 Dim rngData2 As Range 53 Set rngData2 = wsResult.Range("F2:G" & a + 2) 54 Dim rngData3 As Range 55 Set rngData3 = TransposeData(rngData2, wsTrsps) 56 57 ' データの範囲を指定 (A1からE2) 58 Dim rngData4 As Range 59 Set rngData4 = ThisWorkbook.Sheets(wsTrsps).Range("A1:E2") 60 61 ' グラフの作成 62 wsGraph.Shapes.AddChart2(251, xlColumnStacked).Select 63 ActiveChart.SetSourceData Source:=rngData4 64 ActiveChart.ChartTitle.Text = "積み上げ棒グラフ" 65End Sub 66 67Function TransposeData(rng As Range, targetWorksheet As Worksheet) As Range 68 Dim newRng As Range 69 70 ' データを転置してコピー 71 rng.Copy 72 targetWorksheet.Cells(1, 1).PasteSpecial Transpose:=True 73 74 ' 転置されたデータの範囲を設定 75 Set newRng = targetWorksheet.Range("A1").CurrentRegion 76 77 ' 新しいワークシートの範囲を返す 78 Set TransposeData = newRng 79End Function 80 81 82Function CalculateIncome(salesVolume As Double, productMargin As Double) As Double 83 ' 収入の計算(商品×マージン) 84 CalculateIncome = salesVolume * productMargin 85End Function

試したこと・調べたこと

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

GPT4に聞いた。
ワークシートを定義した。

補足

助けてください

tatsu99👍を押しています

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

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

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

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

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

maisumakun

2024/02/05 14:35

どの行にエラーが出ているかは確認してみましたか?
guest

回答3

0

すでに他の方から指摘がありますが、wsTrsps の変数宣言が抜けているのでエラーになります。
変数宣言しないと、自動的にVariant型変数になりますので、
Set rngData3 = TransposeData(rngData2, wsTrsps)
で下記の引数の型指定と合わないのでそのエラーになります。
Function TransposeData(rng As Range, targetWorksheet As Worksheet) As Range

他にも、a の変数宣言が抜けています。

変数宣言なしに変数を利用すると、今回のようなトラブルやバグのもとになりますので、変数宣言を強制する設定にすべきでしょう。

Office TANAKA - 今さら聞けないVBA[変数って宣言しなくちゃいけないの?]

Option Explicitは安心のおまじない – 株式会社ホームスタッフサービス

投稿2024/02/06 00:31

hatena19

総合スコア33729

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

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

kaitsuo

2024/02/10 02:19

ありがとう
guest

0

●●●●

VBA

1Dim wsTrsps As Worksheet

が抜けているからでしょう。

投稿2024/02/05 20:38

xail2222

総合スコア1497

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

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

OOOOOO

2024/02/07 00:06

ふざけた回答はやめて下さい。
xail2222

2024/02/07 03:14

やめる必要がありますか? 根拠の提示をお願いします。
xail2222

2024/02/08 03:32

訂正されてしまった。。。 何が問題だというのか。。。クレーマー対策なのか。。。 無念
kaitsuo

2024/02/10 02:20

皆さん、ありがとう
guest

0

ンパイルエラーは、TransposeData関数の呼び出し時に、引数 targetWorksheet の型が Worksheet ではなく String で渡されているために発生しています。TransposeData関数に渡す引数は Worksheet オブジェクトでなければなりませんが、wsTrsps を String 型の変数として定義しているためにエラーが発生しています。

修正するには、wsTrsps を Worksheet オブジェクトとして定義する必要があります。また、TransposeData関数を呼び出す際には、Worksheet オブジェクトを渡す必要があります。

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("グラフ") Set wsTrsps = ThisWorkbook.Sheets("範囲") ' 最終行を取得 lastRow = wsResult.Cells(wsResult.Rows.Count, "A").End(xlUp).Row ' データ範囲を設定 Set rngData = wsResult.Range("B2:D" & lastRow) ' 人件費、固定費を入力 personnelCosts = InputBox("人件費を入力してください", "人件費入力") fixedCosts = InputBox("固定費を入力してください", "固定費入力") ' 収入の計算 a = 1 For i = 2 To lastRow For j = LBound(productNames) To UBound(productNames) If wsResult.Cells(i, 2).Value = productNames(j) Then a = a + 1 wsResult.Cells(a, 6).Value = CalculateIncome(wsResult.Cells(i, 4).Value, margins(j)) Exit For End If Next j Next i '支出の計算 wsResult.Cells(a + 1, 7).Value = personnelCosts wsResult.Cells(a + 2, 7).Value = fixedCosts ' グラフ範囲を設定 Dim rngData2 As Range Set rngData2 = wsResult.Range("F2:G" & a + 2) Dim rngData3 As Range Set rngData3 = TransposeData(rngData2, wsTrsps) ' データの範囲を指定 (A1からE2) Dim rngData4 As Range Set rngData4 = wsTrsps.Range("A1:E2") ' グラフの作成 wsGraph.Shapes.AddChart2(251, xlColumnStacked).Select ActiveChart.SetSourceData Source:=rngData4 ActiveChart.ChartTitle.Text = "積み上げ棒グラフ" End Sub Function TransposeData(rng As Range, targetWorksheet As Worksheet) As Range Dim newRng As Range ' データを転置してコピー rng.Copy targetWorksheet.Cells(1, 1).PasteSpecial Transpose:=True ' 転置されたデータの範囲を設定 Set newRng = targetWorksheet.Range("A1").CurrentRegion ' 新しいワークシートの範囲を返す Set TransposeData = newRng End Function Function CalculateIncome(salesVolume As Double, productMargin As Double) As Double ' 収入の計算(商品×マージン) CalculateIncome = salesVolume * productMargin End Function

投稿2024/02/08 01:26

shoshinsha123

総合スコア213

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

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

kaitsuo

2024/02/10 02:20

ありがとう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問