Microsoft Access 掲示板

汎用関数を作りたい

12 コメント
views
4 フォロー

アプリを作り始めて、ちょいちょい冗長なコードになるなと感じており
汎用関数に興味を持ち始めております。
例えば現在気になっているのが
「ファイル1を保存する」というボタンを押すと、いくつかのif条件を抜けた後
目的の保存先に保存する、というコードです。
これについて、
「ファイル2を保存する」「ファイル3を保存する」というコードを作成したいのですが、
ほぼ同じ内容になるため、なんとか効率化できないかと考えております。

function関数だと値を返す関数のため、不可能なのでしょうか・?
初心者の質問で申し訳ありません。

ポンタ
作成: 2020/09/02 (水) 18:08:06
通報 ...
1

返り値が必要ならFunctionプロシージャ、返り値が必要なければSubプロシージャを使えばいいでしょう。
とくに返り値がなくても処理が成功したか、失敗したかを返すためにFunctionにすることはよくあります。

具体例があったほうが分かり安いと思いますので、現状の「ファイル1を保存する」のコードを提示してもらったら、それをもとにどのように汎用関数(プロシージャ)にするか説明できると思います。

2
ポンタ 2020/09/02 (水) 20:32:50 0029a@1c915 >> 1

ありがとうございます。
コードを記載します。

    Dim aName As String
    Dim bPath As String
    Dim cPath As String
    Dim dText As String
    Dim fText As Stirng
    Dim gText As String

    If IsNull(Me.txt●●) Then
    MsgBox dText & "を記入してください"
    Exit Sub
            ElseIf AcDir(bPath, vbDirectory) = "" Then
            MsgBox "トップページに保存しているフォルダが存在しません。"
            Exit Sub
                 ElseIf AcDir(bPath & aName, vbNormal) = "" Then
                 MsgBox bPath & "が見つかりません。"
                 Exit Sub
                      ElseIf AcDir(cPath & fText, vbDirectory) <> "" Then
                      FileCopy bPath & aName, cPath & fText & "\" & aName
                      Shell "Explorer.exe " & cPath & fText & "\", vbNormalFocus
                      Exit Sub
                            ElseIf AcDir(cPath & gText , vbDirectory) <> "" Then
                            MsgBox "「" & fText &"」フォルダが見つかりません。「" & gText &"」フォルダに保存します。"
                            FileCopy bPath & aName, cPath & gText & "\" & aName
                            Shell "Explorer.exe " & cPath & "gText & "\", vbNormalFocus
                            Exit Sub
                                Else: MsgBox "「"& fText & "」「" & gText & "」フォルダのどちらも見つかりません。"
                                         Shell "Explorer.exe " & cPath, vbNormalFocus
                                
    End If
    End Sub```
3
ポンタ 2020/09/02 (水) 21:05:22 0029a@1c915 >> 2

AcDirは、下記サイトを採用させていただいております。
https://www.feedsoft.net/access/tips/tips47.html

4
ポンタ 2020/09/03 (木) 07:49:40 f1ed8@025a2 >> 2

元々変数を使っていなかったところを、昨夜変数にしたのですが、部分的に変換間違いでおかしいところがあるようです…スミマセン。

5
ポンタ 2020/09/03 (木) 07:57:45 f1ed8@025a2 >> 2

MsgBox bPath &"が見つかりません。"

MsgBox bPath & aName &"が見つかりません。"

6

提示のコードでは変数に値が代入されていないので、正常には動かないですよね。
実際にボタンのクリック時に記述している正常に動くコードを提示してもらえますか。

7
ポンタ 2020/09/03 (木) 12:15:02 0029a@1c915
Dim aName As String :aName = test1.txt
Dim bPath As String :bPath = "C:\Users\me\Desktop\test2
Dim cPath As String :cPath = "C:\Users\me\Desktop\test3"
Dim dText As String :dText = "test4\"
Dim fText As Stirng :eText = "test5\"
Dim gText As String :fText = "test6\"

    If IsNull(Me.txt●●) Then
    MsgBox gText & "を記入してください"
    Exit Sub
            ElseIf AcDir(bPath, vbDirectory) = "" Then
            MsgBox "フォルダが存在しません。"
            Exit Sub
                 ElseIf AcDir(bPath & "\" & aName, vbNormal) = "" Then
                 MsgBox aName & "が見つかりません。"
                 Exit Sub
                      ElseIf AcDir(cPath & "\" & dText, vbDirectory) <> "" Then
                      FileCopy bPath & "\" & aName, cPath & "\" & dText & "\" & aName
                      Shell "Explorer.exe " & cPath & "\" & dText & "\", vbNormalFocus
                      Exit Sub
                            ElseIf AcDir(cPath & fText, vbDirectory) <> "" Then
                            MsgBox "「" & dText & "」フォルダが見つかりません。「" & fText & "」フォルダに保存します。"
                            FileCopy bPath & "\" & aName, cPath & "\" & fText & "\" & aName
                            Shell "Explorer.exe " & cPath & "\" & fText & "\", vbNormalFocus
                            Exit Sub
                                Else: MsgBox "「" & dText & "」「" & fText & "」フォルダのどちらも見つかりません。"
                                         Shell "Explorer.exe " & cPath, vbNormalFocus
                                
    End If
    End Sub

一応、私の確認したところでは正常に動いているものに対して、一括置換しました。
不備あれば申し訳ありません。

8
hatena 2020/09/03 (木) 15:59:36 修正

Private Sub から書いてもらえますか。

    Dim aName As String: aName = Test1.txt
この Test1.txt ってなんですか。

    Dim fText As Stirng: eText = "test5\"
    Dim gText As String: fText = "test6\"

ここは、

    Dim fText As Stirng: fText = "test5\"
    Dim gText As String: gText = "test6\"

の書き間違いですか。

正常に動いているものに対して、一括置換しました。

正常に動いているものをそのままコピーして貼り付けてもらうのはダメですか。

あと、どのようなことをしたいのか箇条書きの文章で説明してもらえますか。
それから汎用にする場合、どこが変化して、どこが共通なのか分かるように説明してください。

このようにやりたいことを分析して他人にも伝わるよう整理することはプログラミングにおいて大切なことです。
人間に伝わらないことを、それより融通のきかないコンピュータに伝えて正しく動作させることは不可能です。

9
ポンタ 2020/09/05 (土) 11:46:55 0029a@1c915

お忙しいところお返事ありがとうございます。
そのままのコードをのせることが難しいのですが、
時間ができ次第、改めてわかりやすくまとめたいと思っています。
そのときは、またよろしくお願いいたします。

10
hiroton 2020/09/07 (月) 08:14:38 2d6b2@f966d

一度ユーザー定義関数をキーワードに調べてみることをおすすめします

11
ポンタ 2020/09/07 (月) 10:11:18 0029a@1c915

お気にかけてくださり、ありがとうございます。
とりあえず値渡しで、変数の中身だけ変えてそれぞれの処理を呼び出すようにすることはできるようになりました。
ユーザー定義関数の使いどころはピンときていないので、コード、説明等書き換える時間が取れたらまた相談させていただきたいです。その際は宜しくお願いいたします。

12
hiroton 2020/09/07 (月) 10:53:09 2d6b2@f966d

キーワードが「汎用関数」よりも「ユーザー定義関数」のほうが欲しい情報がより多く見つかるだろうくらいの話なのでその「使いどころ」は気にしなくていいですよ