Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8716 / 13644 ツリー ←次へ | 前へ→

【31547】マクロにおけるMMULT関数 ちか 05/11/25(金) 13:21 お礼[未読]
【31550】Re:マクロにおけるMMULT関数 Kein 05/11/25(金) 13:57 発言[未読]
【31553】Re:マクロにおけるMMULT関数 ちか 05/11/25(金) 14:43 発言[未読]
【31556】Re:マクロにおけるMMULT関数 Kein 05/11/25(金) 15:16 発言[未読]
【31591】Re:マクロにおけるMMULT関数 kobasan 05/11/26(土) 1:08 発言[未読]
【31593】Re:マクロにおけるMMULT関数 ichinose 05/11/26(土) 9:12 発言[未読]
【31595】Re:マクロにおけるMMULT関数 追伸 ichinose 05/11/26(土) 9:25 発言[未読]
【31601】Re:マクロにおけるMMULT関数 追伸 kobasan 05/11/26(土) 13:05 発言[未読]

【31547】マクロにおけるMMULT関数
お礼  ちか  - 05/11/25(金) 13:21 -

引用なし
パスワード
   はじめまして。あの〜あるセルにMMULT関数を組み込みたいのですが上手くいきません。縦はB2:B" & w+1 &"でいいのですが、横の場合記
号がB3:H3のように変わってしまいます。以下のようなコードではエラーにな
ってしまいます。どうかアドバイスをお願いします。

Range("AA2")Cells(i,1).Formula = "=MMULT(B2:B" & w+1 &",Sheet5!B3:& w3
&")"

【31550】Re:マクロにおけるMMULT関数
発言  Kein  - 05/11/25(金) 13:57 -

引用なし
パスワード
   >記号がB3:H3のように変わってしまいます。
参考書などで、絶対参照と相対参照の違いを学習して下さい。
たぶんそれで解決するはずです。

【31553】Re:マクロにおけるMMULT関数
発言  ちか  - 05/11/25(金) 14:43 -

引用なし
パスワード
   ▼Kein さん:
>>記号がB3:H3のように変わってしまいます。
>参考書などで、絶対参照と相対参照の違いを学習して下さい。
絶対参照って言うのはB3:H3のようにある決まった範囲を参照することで相対参照はあるセルから自分で範囲を指定して参照することですよね。
私の場合変数や定数を使用するので相対参照になると思うのですが、それで今回、縦の列の参照はB3:B" & v + 2 &で上手くいくのですが、横の列の場合記号がB,C,Dと変化していくことになります。このような場合縦の列のようなコードを横の列で作ることはできるのでしょうか?ほんとに今わかんなくて・・すいません。

【31556】Re:マクロにおけるMMULT関数
発言  Kein  - 05/11/25(金) 15:16 -

引用なし
パスワード
   横へずらすことで計算対象の列を変化させたいなら、列記号には "$" をつけない、
計算対象の列を固定してしまいたければ "$" をつける。というだけのことです。
それで思い通りにいかなければ、あなたのコードに欠陥があることになります。
しかし、あなたはまだ「どういうことがしたいか」という点を説明していないのだから
答えられることはそれぐらいです。

【31591】Re:マクロにおけるMMULT関数
発言  kobasan  - 05/11/26(土) 1:08 -

引用なし
パスワード
   今晩は。

    A    B    C
1つ目の行列            
2    1    1    1
3    2    2    2
4    3    3    3
        
        
1つ目の行列
12    1    1    1
13    2    2    2
14    3    3    3
15            
        
行列積を A22 から貼り付け
22
23
24

の場合のコードはこんな感じになります。
Address(0, 0)を使って、行と列の指定を楽にしています。
参考にしてください。

Sub 行列積()
Dim n1 As Long, n2 As Long
Dim m1 As Long, m2 As Long
Dim addrss1 As String, addrss2 As String
  '
  '1つ目の行列の範囲 (m1,n1)行列
  m1 = 3: n1 = 3
  addrss1 = Range("A2").Resize(m1, n1).Address(0, 0)
  '2つ目の行列の範囲 (m2,n2)行列
  m2 = 3: n2 = 3
  addrss2 = Range("A12").Resize(m2, n2).Address(0, 0)
  '
  '行列積の貼り付け
  Sheets("sheet1").Range("A22").Resize(m1, n2).FormulaArray = _
     "=MMult(Sheet1!" & addrss1 & "," & "Sheet1!" & addrss2 & ")"
End Sub

【31593】Re:マクロにおけるMMULT関数
発言  ichinose  - 05/11/26(土) 9:12 -

引用なし
パスワード
   皆さん、おはようございます。


>    A    B    C
>1つ目の行列            
>2    1    1    1
>3    2    2    2
>4    3    3    3
>        
>        
>1つ目の行列
>12    1    1    1
>13    2    2    2
>14    3    3    3
>15            
という入力データとしてのセル範囲に対して

結果として


>        
>行列積を A22 から貼り付け

>22     6   6    6
>23    12   12   12     
>24    18   18   18

という出力をしたい。
>
ちかさんへ
上記のような具体例を提示して
やりたいことと
入力データと出力データを明確にした記述をすることを
心がけてください。

文章だけでは判りづらいと思いませんか?
具体例が一つで足りなければ二つでも三つでも提示します。

自分が知りたいことを見ている方に理解してもらう
努力をしましょう!!

>Sub 行列積()
>Dim n1 As Long, n2 As Long
>Dim m1 As Long, m2 As Long
>Dim addrss1 As String, addrss2 As String
>  '
>  '1つ目の行列の範囲 (m1,n1)行列
>  m1 = 3: n1 = 3
>  addrss1 = Range("A2").Resize(m1, n1).Address(0, 0)
>  '2つ目の行列の範囲 (m2,n2)行列
>  m2 = 3: n2 = 3
>  addrss2 = Range("A12").Resize(m2, n2).Address(0, 0)
>  '
>  '行列積の貼り付け
>  Sheets("sheet1").Range("A22").Resize(m1, n2).FormulaArray = _
>     "=MMult(Sheet1!" & addrss1 & "," & "Sheet1!" & addrss2 & ")"
>End Sub

で、 kobasanさんの提示された例のデータを基にして・・・。

MMULT関数って私は、使ったことがありませんが
本来は、 kobasanさんのコードのように配列数式として使用することで
その機能を発揮するものだと思います(特例は除いて)。


配列を使用せずに行と列の掛け算の和を少しでも簡単にするために使用する
というのなら、上記のデータ例を引用すると

'================================================================
Sub 行列積2()
  dim rrng as range
  dim crng as range
  dim rw as long,col as long
  Set rrng = Range("A2").Resize(, 3)
  Set crng = Range("A12").Resize(3)
  With Range("a22")
    For rw = 1 To 3
     For col = 1 To 3
      .Cells(rw, col).Formula = "=mmult(" & rrng.Offset(rw - 1, 0).Address & "," & _
            crng.Offset(0, col - 1).Address & ")"
      Next
     Next
    End With
End Sub

で試してみて下さい

【31595】Re:マクロにおけるMMULT関数 追伸
発言  ichinose  - 05/11/26(土) 9:25 -

引用なし
パスワード
   >>    A    B    C
>>1つ目の行列            
>>2    1    1    1
>>3    2    2    2
>>4    3    3    3
>>        
>>        
>>1つ目の行列
>>12    1    1    1
>>13    2    2    2
>>14    3    3    3
>>15            
>という入力データとしてのセル範囲に対して
>
>結果として
>
>
>>        
>>行列積を A22 から貼り付け
>
>>22     6   6    6
>>23    12   12   12     
>>24    18   18   18


尚、Keinさんの

>絶対参照と相対参照の違い

を応用すれば

'==========================================
Sub 行列積3()
  Dim rrng As Range
  Dim crng As Range
  Set rrng = Range("A2").Resize(, 3)
  Set crng = Range("A12").Resize(3)
  With Range("a22").Resize(3, 3)
    .Formula = "=mmult(" & rrng.Address(False, True) & "," & _
            crng.Address(True, False) & ")"
    End With
End Sub

なんて方法もありますが、ちかさんが提示されたコードからだと

行列積2のコードがなされていたことに近いでしょうか?

【31601】Re:マクロにおけるMMULT関数 追伸
発言  kobasan  - 05/11/26(土) 13:05 -

引用なし
パスワード
   皆さん今日は。

ichinoseさんに刺激されて、
いろんな方法があるということで、また一つ載せてみます。
関数にこだわらなければ、シンプルに、こんな方法もあります。
行列の範囲に悩まなくて住むので、自分としては結構気に入っているのですか。

データ形式は、今まで通りです。

Sub 行列積4()
Dim vntA, vntB, vntC
Dim n As Integer

  vntA = Range("A2").Resize(3, 3).Value
  vntB = Range("A12").Resize(3, 3).Value
  vntC = Application.MMult(vntA, vntB)
  '
  '---------------A22から貼り付け
  Sheets("Sheet1").Range("A22").Resize(3, 3) = vntC
End Sub

8716 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free