Excel VBA質問箱 IV

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

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


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

【78155】RC数式の一括入力が認識されません けんじ 16/4/28(木) 0:59 質問[未読]
【78156】Re:RC数式の一括入力が認識されません けんじ 16/4/28(木) 1:16 発言[未読]
【78157】Re:RC数式の一括入力が認識されません β 16/4/28(木) 6:47 発言[未読]
【78158】Re:RC数式の一括入力が認識されません β 16/4/28(木) 7:21 発言[未読]
【78159】Re:RC数式の一括入力が認識されません けんじ 16/4/28(木) 9:14 お礼[未読]

【78155】RC数式の一括入力が認識されません
質問  けんじ  - 16/4/28(木) 0:59 -

引用なし
パスワード
   元々は計算式ごとにセルに入力していたけど、従業員全員に対して繰り返す処理をする際に時間がかかることから、一括して入力するように修正したら、数式として認識してくれなくなりました。
ただし、モジュール終了後に、
1.RC形式を使用するのチェックを付け
2.入力し直し(F2 & Enter)すると、認識します。


Function 計算式1(r as range) as string
計算式1 = "ホニャララ"
'計算式2と計算式3も同様
End Function

sub 問題となっている代入()
Const 計算式1str = "=計算式1(RC[" & 対象列 - 計算式1列 & "])"
Const 計算式2str = "=計算式2(RC[" & 対象列 - 計算式2列 & "])"
Const 計算式3str = "=計算式3(RC[" & 対象列 - 計算式3列 & "])"
Const 合計式str = "=sum(RC[-3]:RC[-1])"
'実際は、計算式はもっといっぱいある。


Dim FuncStr() As String: ReDim FuncStr(日数, 合計列 - 計算式1列 + 1)

For i = 1 To 日数
  FuncStr(i, 計算式1列 - 23) = 計算式1str
  FuncStr(i, 計算式2列 - 23) = 計算式2str
  FuncStr(i, 計算式3列 - 23) = 計算式3str
  FuncStr(i, 合計列 - 23) = 合計式str
Next
'次の代入は、以前はFuncstrを使わずに直接、かつ計算式毎に代入していた。
シート.Cells(入力開始行, 計算式1列).Resize(日数, 合計列 - 計算式1列).FormulaR1C1 = FuncStr

'次の式を入れるとそのセルのみ、ちゃんと数式として認識します。
シート.Cells(入力開始行, 計算式1列).Formula = シート.Cells(入力開始行, 計算式1列).Formula

end sub

何が問題なんだか分りません。
教えていただけると大変助かります。

【78156】Re:RC数式の一括入力が認識されません
発言  けんじ  - 16/4/28(木) 1:16 -

引用なし
パスワード
   元々は


シート.range(シート.cells(入力行,計算式1列), _
 シート.cells(入力行+ 日数,計算式1列).formula _
    = "=計算式1(RC[" & 対象列 - 計算式1列 & "])"


みたいなものがずらずら並んでいるだけでした。

【78157】Re:RC数式の一括入力が認識されません
発言  β  - 16/4/28(木) 6:47 -

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

アップされたコード、実際に配列FuncStrからセル領域に書きこんでいるところのコードがありませんが
その、実際に書きこんでいるコードをコピペで、そのままアップされてはいかがでしょう。

【78158】Re:RC数式の一括入力が認識されません
発言  β  - 16/4/28(木) 7:21 -

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

セルに書きこんでいるところのコードも是非拝見したいと思っているんですが
それはそれとして、F2 を押さないと認識しない件は、配列のデータ型をStringにしているからだと思います。
Variant型にして実行してみてください。

ところで、セル領域への数式一括セットですが、ちょっと難しく考えすぎているかもしれませんね。

新規ブックに、以下のコードを貼り付け
I1:K7に適当な文字列を入れたうえで、
A1 : =UDFTEST(I1) これを K1 までフィルコピー。
そのあと、Test2〜Test7 まで実行してください。
各行のA〜C列に数式を埋め込んでいます。
いずれも、同じ結果(参照する行は異なりますが)になります。
けんじさんのヒントになればと思います。


Function UDFTEST(R As Range) As String
  UDFTEST = "abc" & R.Value
End Function

Sub test2()
  Range("A2:C2").Formula = "=UDFTEST(I$2)"
End Sub

Sub test3()
  Range("A3:C3").FormulaR1C1 = "=UDFTEST(RC[8])"
End Sub

Sub Test4()
  Dim v(1 To 1, 1 To 3) As String
  
  v(1, 1) = "=UDFTEST(RC[8])"
  v(1, 2) = "=UDFTEST(RC[8])"
  v(1, 3) = "=UDFTEST(RC[8])"

  Range("A4:C4").Value = v
  
End Sub

Sub Test5()
  Dim v(1 To 1, 1 To 3) As String
  
  v(1, 1) = "=UDFTEST(RC[8])"
  v(1, 2) = "=UDFTEST(RC[8])"
  v(1, 3) = "=UDFTEST(RC[8])"

  Range("A5:C5").FormulaR1C1 = v
  
End Sub

Sub Test6()
  Dim v(1 To 1, 1 To 3) As Variant
  
  v(1, 1) = "=UDFTEST(RC[8])"
  v(1, 2) = "=UDFTEST(RC[8])"
  v(1, 3) = "=UDFTEST(RC[8])"

  Range("A6:C6").Value = v
  
End Sub

Sub Test7()
  Dim v(1 To 1, 1 To 3) As Variant
  
  v(1, 1) = "=UDFTEST(RC[8])"
  v(1, 2) = "=UDFTEST(RC[8])"
  v(1, 3) = "=UDFTEST(RC[8])"

  Range("A7:C7").FormulaR1C1 = v
  
End Sub

【78159】Re:RC数式の一括入力が認識されません
お礼  けんじ  - 16/4/28(木) 9:14 -

引用なし
パスワード
   回答ありがとうございます。
おかげ様で成功しました。


>それはそれとして、F2 を押さないと認識しない件は、配列のデータ型をStringにしているからだと思います。
>Variant型にして実行してみてください。
これで数式として認識しました。
ありがとうございます。実行速度が0.2秒 × 50人 = 10秒程 短縮できました。
同じように他も部分も短縮できそうです。


ちなみに、
>セルに書きこんでいるところのコードも是非拝見したいと思っているんですが

『'次の代入は、以前はFuncstrを使わずに直接、かつ計算式毎に代入していた。
シート.Cells(入力開始行, 計算式1列).Resize(日数, 合計列 - 計算式1列).FormulaR1C1 = FuncStr』
の部分が書き込んでいるコードでした。


>ところで、セル領域への数式一括セットですが、ちょっと難しく考えすぎているかもしれませんね。
>いずれも、同じ結果(参照する行は異なりますが)になります。
>けんじさんのヒントになればと思います。
頂いたコードも確認しました。とても勉強になりました。
Variant型であれば、FormulaじゃなくてValueに入力しても数式として認識してくれるんですね。
質問した後、自分でも調べていたのですが、
string型であっても、配列でなければ数式として認識していたので、
配列での数式入力はできない仕様なのかと思い、諦めたところでした。

ありがとうございましたm(_ _)m

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