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

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

ただいまの
回答率

90.48%

  • VBA

    1863questions

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

  • Excel

    1596questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

Excel VBA 行列の書き出しのための関数が書けません

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 617

haruka_1996

score 3

前提・実現したいこと

整数k,lと1次元配列を入力とし、配列のサイズnを求めた上で、配列に格納されるている値をセル(k,l)からセル(k+n-1,l)まで書き出す関数を実装したいです。
(functionを用います。)

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

functionが実際にどのように動いているのか分かりません。
1次元配列をどのように入力すればいいのか分からないです。

該当のソースコード

Function kadai1(x() As Double) As Double
Dim n, k, l As Integer
Dim i As Integer
Dim a() As Double

n = UBound(x)
ReDim a(1 To n)

For i = 1 To n
  a(i) = x(i)
  Cells(k + i - 1, l).Value = a(i)
Next i
kadai1 = a

End Function

試したこと

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

エクセルVBA
excel vba

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

課題ということでヒントを、、、

1) functionがどう動いているか

このfunction(関数)は、引数にdouble値の配列が渡されて、戻り値でdouble値の配列を返そうとしています
渡されてきた配列 x を新しい配列 a に入れなおし、a の内容をセルに書きだしています
書き出しが全部終わったら、配列 a を呼び出しもとに戻り値として返しています

(問題点)

・変数 k と l が初期化されていないため、セルに書きだすところでエラーになります
→ k と l に適切な値で初期値を入れましょう

・戻り値が double とされていますが、実際には a という配列を返そうとしているのでエラーになります
→ 配列が戻せるようにfunctionの宣言を修正しましょう

2) 1次元配列の入力方法

関数 kadai1 の呼び出し方がわからない、ということでしたらこんな感じです

ret = kadai1(x)

これだけでは動きません
x と ret はそれぞれ配列です
その2つの配列をどのように用意すればよいかは考えてください

それではがんばってください

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/20 21:38

    回答ありがとうございます。
    functionとはsubを作り、そちらでk,lは初期値を入力しています。
    配列を返すのではなく、セルに書き出すことまで出来れば良いと思っています。
    考えてもx等の配列の用意の方法が分かりませんでした。(思いついてもfor文とinputboxを用いる方法だけです…)
    1次元配列の用意の方法のヒントをもう少し頂けませんでしょうか?

    キャンセル

  • 2016/05/21 00:55 編集

    つまり・・・呼び出し元の sub で、セルの出力先を指定する k と l 、出力する値の入った配列 x() を用意して、セル出力をするための処理が書かれた関数 Function にそれらを引き渡したい・・・というイメージで、sub側で用意する配列 x() の書き方がわからないということですかね?

    キャンセル

  • 2016/05/21 13:03

    おっしゃる通りです。
    お教えいただければ幸いです…

    キャンセル

  • 2016/05/21 14:39

    解決いたしました。
    ありがとうございました。

    キャンセル

checkベストアンサー

0

整数k,lと1次元配列を入力とし

まずFunctionの引数にkとlと1次元配列(ここでは例示されているx()としましょう)を使う必要がありますね

(functionを用います。)

あとFunctionの戻り値はどうしますか?
結果を例えばBoolean(書き出せたかもしくはエラーで書き出せなかったかなど)で返すようにするのでしょうか?
もし戻り値が不要なら(例えばセルに値(結果)を書き出すだけなら)Subでも済みますから...

例えば上記のような形だと

Function kadai1(ByVal k As Integer, ByVal l As Integer, ByVal x() As Integer) As Boolean
 'やりたい処理を書く
 'If Errorなら
  Return False
 'Else
  Return True
 'End If 

End Function


みたいな感じですね

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/20 20:15

    回答ありがとうございます。
    関数として定義して、他のところで使えるようにするのが目的です。
    結果は数字で返します。

    キャンセル

  • 2016/05/20 20:29

    よく理解できていないのですが
    >結果は数字で返します
    は何を指しているのですか?

    この関数は
    - 指定されたセル(セル範囲)に配列で指示された値を書き出す
    ものですよね

    他のところ(別のワークシートですか?)で使いたいなら、引数で書き出す先のワークシート名を渡してあげる方が、余程良いように思いますが..

    キャンセル

  • 2016/05/20 22:07

    結果の部分はこちらの勘違いでした。
    大変、申し訳ありません。
    先ほどの回答は趣旨にあっております。
    戻り値は不要でセルに書き込むだけですが、functionで関数として作らなければなりません。

    functionだけでは実行できないので、そのためのsubを作りたいのですが、どのように作れば良いのでしょうか。
    k,l,x()をどのように設定すれば良いのかいまいち理解しておりません。
    教えていただきたいです…

    キャンセル

  • 2016/05/21 03:58 編集

    FunctionでもSubでも引数の渡し方は一緒です
    ざっくりと結果を返す必要があるか、ないかと考えてもいいです
    したがって
    ```
    Sub kadai1の処理(ByVal k As Integer, ByVal l As Integer, ByRef x() As Integer)

     Dim i As Integer
     i = 0

     For Each xItem In x()
      Cells(k + i, l).Value = xItem

      i = i + 1
     Next

    End Sub

    Sub kadai1()

     Dim x(5) As Integer
     x(0) = 3
     x(1) = 1
     x(2) = 4
     x(3) = 9
     x(4) = 2
     x(5) = 6

     Call kadai1の処理(1, 1, x)

    End Sub
    ```
    な感じでしょうか?

    あと引数で配列を渡すときはByValではなくByRefでした
    失礼しました

    キャンセル

  • 2016/05/21 13:59

    回答ありがとうございます。

    Sub kadai1()

    k = 3
    l = 3
    Dim x(6) As Integer
    x(1) = 3
    x(2) = 1
    x(3) = 4
    x(4) = 9
    x(5) = 2
    x(6) = 6

    Call kadai10(1, 1, x)

    End Sub

    Function kadai10(ByVal k As Integer, ByVal l As Integer, ByRef x() As Integer) As Boolean
    Dim xItem As Variant
    Dim i As Integer
    i = 0

    For Each xItem In x()
    Cells(k + i, l).Value = xItem
    i = i + 1
    Next

    End Function

    とやったところ何とか動きました。
    しかし、subからfunctionへk,lの値をうまく渡せません。
    どうすればいいのでしょうか?

    キャンセル

  • 2016/05/21 14:39

    Call kadai10(k, l, x)とすることで出来ました!
    ありがとうございました♪

    キャンセル

関連した質問

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

  • VBA

    1863questions

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

  • Excel

    1596questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。