Excel VBA質問箱 IV

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

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


82 / 13645 ツリー ←次へ | 前へ→

【82066】ユーザー関数(引数・戻り値とも配列)にExcelシートから配列を渡したい popopo 22/9/9(金) 17:57 質問[未読]
【82067】Re:ユーザー関数(引数・戻り値とも配列)に... マナ 22/9/9(金) 22:26 発言[未読]
【82068】Re:ユーザー関数(引数・戻り値とも配列)に... popopo 22/9/10(土) 2:25 質問[未読]
【82069】Re:ユーザー関数(引数・戻り値とも配列)に... マナ 22/9/10(土) 10:16 発言[未読]
【82070】Re:ユーザー関数(引数・戻り値とも配列)に... マナ 22/9/10(土) 10:26 発言[未読]
【82071】Re:ユーザー関数(引数・戻り値とも配列)に... ヘビー 22/9/23(金) 19:05 発言[未読]

【82066】ユーザー関数(引数・戻り値とも配列)にE...
質問  popopo E-MAIL  - 22/9/9(金) 17:57 -

引用なし
パスワード
   関数(引数・戻り値とも配列)を
Excelワークシートから配列を渡し、ユーザー関数として呼び出したい。
ご協力下さい。

・VBAコードからは、問題なく利用可能な関数Pu
・Excelワークシートから呼び出し不可。#VALUE!表示

・以下関数で挟み、VBAからは利用可能
 ・Pre_関数(引数:文字列 戻り値:配列)
 ・Post関数(引数:配列  戻り値:文字列)

◎・xPack関数(引数:文字列 戻り値:文字列):パッケージ シートからも利用可能
 種々関数を連結したく、高速化からも、直接呼出す方法はないでしょうか?
 宜しくお願い致します。

準備 A1=12, B1=45
結果
・C1=Pre(A1,B1)  '{12,45}スピル表示
・C2=Pu(Pre(B1,C1) '#VALUE!
・C3=Pu(C1#)    '#VALUE!
・C4=Pu({12,45})  '#VALUE!
・C5=Pu(Pre("12","45")) '#VALUE!

・C11=Post(Pre(A1,B1))  '#VALUE!
・C12=Post(Pu(Pre(B1,C1)))'#VALUE!
・C13=Post(Pu(C1#))    '#VALUE!
・C14=Post(Pu({12,45}))  '#VALUE!
・C15=Post(Pu(Pre("12","45"))) '#VALUE!

・C21=xPack(A1,B1) '-1881 正 パッケージ関数

不具合を再現する単純コード 演算内容は問わず
--
Public Function Pu(p() As Long) As Long() '配列受取・配列戻り
  Dim ret() As Long: ReDim ret(UBound(p))
  ret(0) = p(0) + p(1) '和
  ret(1) = p(0) - p(1) '差
  Pu = ret
End Function

Public Function Pre(S1 As String, S2 As String) As Long()'演算 配列戻り
  Dim ret() As Long: ReDim ret(1)
  ret(0) = CInt(S1)
  ret(1) = CInt(S2)
  Pre = ret
End Function

Public Function Post(p() As Long) As String '加工、戻り値文字列
  Post = p(0) * p(1) '積
End Function

Public Function xPack(S1 As String, S2 As String) As String '引数,戻り値文字列
  xPack = Post(Pu(Pre(S1, S2)))
End Function
---

【82067】Re:ユーザー関数(引数・戻り値とも配列)...
発言  マナ  - 22/9/9(金) 22:26 -

引用なし
パスワード
   ▼popopo さん:

よくわかりませんが、これでエラーにはなりませんでした。

Public Function Pu(p() As Variant) As Long()  '配列受取・配列戻り
  Dim ret() As Long: ReDim ret(1 To UBound(p))
  ret(1) = p(1) + p(2) '和
  ret(2) = p(1) - p(2) '差
  Pu = ret
End Function。

【82068】Re:ユーザー関数(引数・戻り値とも配列)...
質問  popopo  - 22/9/10(土) 2:25 -

引用なし
パスワード
   マナ さん、貴重なヒントありがとうございまうす。

再現できました。C1#が不可は不思議
足掛かりにして、もう少し反応を調べてみます。

=pu(pre(A1,B1)) '{57,0}スピル表示
=pu(C1#)    '#VALUE!
=pu(pre(A1,B1)) '{57,0}スピル表示
=pu(pre(A1,B1)) '{57,0}スピル表示

ユーザー関数では、以下限定の模様ですね
 ・引数はバリアント型
 ・配列はindex=1から

【82069】Re:ユーザー関数(引数・戻り値とも配列)...
発言  マナ  - 22/9/10(土) 10:16 -

引用なし
パスワード
   ▼popopo さん:

>再現できました。C1#が不可は不思議

これも、よくわかりませんが、エラーにはなりませんでした。

Public Function Pu(p As Variant) As Long()  '配列&Range受取・配列戻り
  p = Application.Transpose(Application.Transpose(p))
  Dim ret() As Long: ReDim ret(1 To UBound(p))
  ret(1) = p(1) + p(1) '和
  ret(2) = p(1) - p(2) '差
  Pu = ret
End Function

【82070】Re:ユーザー関数(引数・戻り値とも配列)...
発言  マナ  - 22/9/10(土) 10:26 -

引用なし
パスワード
   >p = Application.Transpose(Application.Transpose(p))

TypeName(p)="Range" のときだけでよかったかもしれません。

【82071】Re:ユーザー関数(引数・戻り値とも配列)...
発言  ヘビー  - 22/9/23(金) 19:05 -

引用なし
パスワード
   変数名
C1,R1に似た物はPCによっては撥ねられます。
でもその内エラーにならなくなります。
ここが摩訶不思議。

Sub R()
a=0
End Sub

Sub C()
a=0
End Sub

Sub R1()
a=0
End Sub

Sub C1()
a=0
End Sub

なども、マクロマクロに表示され無い場合も。
でもその内表示されるようになります。
ここも摩訶不思議。
RとCは予約後らしい。

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