Excel VBA質問箱 IV

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

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


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

【70657】保存 situmon 11/12/13(火) 20:59 発言[未読]
【70658】Re:保存 UO3 11/12/13(火) 21:42 発言[未読]
【70660】Re:保存 situmon 11/12/13(火) 22:43 お礼[未読]
【70661】Re:保存 UO3 11/12/14(水) 0:31 発言[未読]

【70657】保存
発言  situmon  - 11/12/13(火) 20:59 -

引用なし
パスワード
   Public Sub フォルダ保存()
Dim fpath As String
Dim fso As String
Dim c As Variant

For Each c In Selection
 Call パス取得(fpath)
 fso = fpath & "\" & c
 MkDir fso
Next c
End Sub

Public Sub パス取得(ByVal fpath As String)
fpath = ThisWorkbook.Path
End Sub

保存できません。
cに問題があると思うのですが。
cはselectionのvalueが返っているから?
 fso = fpath & "\" & c
ここのcが文字列になってないから?
どうしたらいいかわかりません。

【70658】Re:保存
発言  UO3  - 11/12/13(火) 21:42 -

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

まず、Call パス取得(fpath) ですけど、もちろんSubプロシジャで引数に値を返すことはできます。
ただし、その場合は Public Sub パス取得(ByRefl fpath As String) にする必要があります。
(通常のCallを書けばデフォルトByRefですけどね)
ByVal は値渡しで、サブプロシジャ側でテンポラリーに生成されるfpathという名前の(プロシジャレベルの)変数に
呼び出し側の引数の値がいれられるだけで、サブプロシジャ側でfpathに値をセットしても
呼び出し側の元々のfpathは更新されません。

普通は、Functionプロシジャ仕立てにしますね。

また、標準モジュールのプロシジャには、とくにPublicと記述する必要はありません。
それと cの値を扱うわけですが、c.Value とプロパティを明示したほうがわかりやすいですね。

ということで、以下のようにして試してみてください。
選択領域の値が空白であるとか、フォルダ名には使用できない文字だとか、あるいはすでに同名のフォルダがあるとか、
本来は、そのようなチェックもいれるほうぎいと思いますが、割愛しています。

Sub フォルダ保存()
Dim fpath As String
Dim fso As String
Dim c As Variant

  For Each c In Selection
   fpath = パス取得
   fso = fpath & "\" & c.Value
   MkDir fso
  Next c
  
End Sub

Function パス取得() As String
  パス取得 = ThisWorkbook.Path
End Function

【70660】Re:保存
お礼  situmon  - 11/12/13(火) 22:43 -

引用なし
パスワード
   なるほど。ありがとう。
byrefですね。
ただfunctionとbyrefの使い分けは?
どういった場合で分けるの?
またなぜ今回のケースはfunction?

publicと記載するのはどういった場合?

以上しっくりきません。
調べてもいまいち。

お願いします。

【70661】Re:保存
発言  UO3  - 11/12/14(水) 0:31 -

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

こんばんは

>ただfunctionとbyrefの使い分けは?

Function と byRef は、まったく異なるカテゴリーです。

・Function と Sub

SUbプロシジャは、戻り値を持たず、そのプロシジャ内で、一定の処理をするだけ。
一方、Functionプロシジャは「ユーザー定義関数」のようなもので、処理結果が
戻り値として返されます。

excelvba.pc-users.net/fol5/5_4.html
www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_110_02.html
www.officepro.jp/excelvba/sub/index6.html

・byRefとbyVal

Subプロシジャ、Functionプロシジャともに
byVal 引き数名 と記述すると、「値渡し」で、呼び出し側の変数の値のみが渡され
変数の場所は渡されません。
したがってプロシジャ内で引数で指定された変数を変更しても、呼び出し側の変数は
変更されません。
一方、byRef 引き数名と記述すると、「参照渡し」で呼び出し側の変数の場所が渡されます。
ですのでプロシジャ側で引数で指定された変数を変更すると呼び出し側の変数も変更されます。
じゃぁ、いつもbyRefがいいねと、そう思われるかもしれません。(デフォルトはbyRefです)
でも、自分の変数の値を処理の材料として渡すけど、変更してほしくない場合の方が多いかも。
そういった場合は、byValを指定します。

www.k1simplify.com/vba/tipsleaf/leaf340.html
www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_200_100.html
homepage1.nifty.com/CavalierLab/lab/vb/byvalbyref.html

>またなぜ今回のケースはfunction?

先にも書きましたけど、byRefにしておいて、最初アップされた形でもいいんですが
サブルーティンで値を取得して、それを戻り値にして返してもらうという構成の方が
わかりやすくありませんか?

たとえばシート上で、=SUM(A1:A10) なんて書きますよね。
これは意味としては、セルの値=SUM(A1:A10)
A1:A10 という引数を SUM というFunctionプロシジャに与えて処理をさせ、その結果を
戻り値として、セルの値 という変数に書き込んでいる。
このように考えていただくとよろしいのですが。

>publicと記載するのはどういった場合?

変数やプロシジャのスコープ(適用範囲)については
home.att.ne.jp/zeta/gen/excel/c04p10.htm 等に解説がありますが
ちょっとややこしいかもしれません。

Public Sub ABC()
Private Sub ABC()
Sub ABC()

ややこしくしている元凶(?)の1つは、モジュールによってPublicやPrivateを省略した場合の
デフォルトが異なるということかなと思っています。

いずれにしましても、標準モジュールでは、デフォルトがPublic ですから Public と、わざわざ
書く人は少ないですね。

★ところで、なぜアップされたコードで byVal と指定されたのですか?

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