質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

1830閲覧

引数付きプロシージャの実行

Dis

総合スコア19

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2021/07/28 01:22

VBA

1 2Sub CSV出力(ByVal sht As Worksheet, Optional ByVal rngStart As Range = Nothing) 3  Dim varFile As Variant 4  Dim FSO As New FileSystemObject 5  Dim TS As TextStream 6  Dim lngRowMin As Long, lngRowMax As Long 7  Dim lngColMin As Long, lngColMax As Long 8  Dim i As Long 9 10   11  varFile = Application.GetSaveAsFilename(InitialFileName:=sht.Name & ".csv", _ 12                      FileFilter:="CSVファイル(*.csv),*.csv", _ 13                      FilterIndex:=1, _ 14                      Title:="保存ファイルの指定") 15  If varFile = False Then 16    Exit Sub 17  End If 18     19  '開始行列、終了行列を取得 20  If rngStart Is Nothing Then 21    lngRowMin = 1 22    lngColMin = 1 23  Else 24    lngRowMin = rngStart.Row 25    lngColMin = rngStart.Column 26  End If 27  With rngStart.CurrentRegion 28    lngRowMax = .Item(.Count).Row 29    lngColMax = .Item(.Count).Column 30  End With 31   32  Set TS = FSO.CreateTextFile(Filename:=varFile, Overwrite:=True) 33   34  For i = lngRowMin To lngRowMax 35    TS.WriteLine CSV_EditRec(sht, i, lngColMin, lngColMax) 36  Next 37   38  TS.Close 39  Set TS = Nothing 40  Set FSO = Nothing 41 42  MsgBox ("CSV出力しました。" & vbLf & vbLf & varFile) 43End Sub 44

VBA

1 2Private Function CSV_EditRec(ByVal sht As Worksheet, _ 3                i As Long, _ 4                lngColMin As Long, _ 5                lngColMax As Long) As String 6  Dim strRec As String 7  Dim strCol As String 8  Dim j As Long 9 10  strRec = "" 11  For j = lngColMin To lngColMax 12    Select Case True 13      Case IsNumeric(sht.Cells(i, j)) 14        strCol = CStr(CDbl(sht.Cells(i, j))) 15      Case IsDate(sht.Cells(i, j)) 16        If InStr(sht.Cells(i, j), "-") Then 17          strCol = sht.Cells(i, j) 18        Else 19          strCol = Format(sht.Cells(i, j), "yyyy/mm/dd") 20        End If 21      Case InStr(sht.Cells(i, j), ","), InStr(sht.Cells(i, j), """") 22        strCol = """" & sht.Cells(i, j) & """" 23      Case Else 24        strCol = sht.Cells(i, j) 25    End Select 26    If strRec = "" Then 27      strRec = strCol 28    Else 29      strRec = strRec & "," & strCol 30    End If 31  Next 32  CSV_EditRec = strRec 33End Function 34

上記はエクセルの真髄様より抜粋させていただいております。
大変、初歩的な質問なのですが、引数付きのプロシージャの実行の仕方がわかりません。
この場合はコールステートメント等で実行するのでしょうか?
また、その場合はどのようなカードを書くのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2021/07/28 02:21

> 引数付きのプロシージャの実行の仕方がわかりません。 質問のコードでは、CSV_EditRec()はCSV出力()で使用するコードになっていますが、何が分からないのでしょうか?
Dis

2021/07/28 08:19

申し訳ありません。本当にわかりません。 Subプロシージャのcsv出力を実行できない理由がわかりません。 Functionが実行できない理由はわかるのですが… 仮に、このコードでは、実行できないのが正しいとして、なぜそのような迂遠な方法を取るのかがわかりません。 Subプロシージャで書かれたものを他のSubプロシージャから呼び出して使うことに何の意味があるのでしょうか?
sazi

2021/07/28 09:10

CSV出力()の実行方法が分からないという事ですか? ユーザーの操作によるものなら、「CSV出力」などのボタンを設けて、そのボタンのクリックイベントで、 call CSV出力() などとしますが、質問はそういう事ですか?
Dis

2021/07/28 13:00 編集

非常にわかりにくくて申し訳ありません。 私ならCSV出力プロシージャから直接実行できるコードを書くのかなと考えていたので、なぜCSV出力プロシージャを別のプロシージャ(callステートメントを記載したプロシージャ)から実行しなければいけないのかが、わかりません。 これは作り手の癖なのか、このコードを書くにあたっては、必ずcallステートメントを記載したプロシージャを用意しなければいけないのか… そこらへんがわかりませんでした。
guest

回答2

0

VBA

1Sub CSV出力() 2 Dim sht As Worksheet, rngStart As Range 3 Set sht = ActiveSheet 4'以下略 5

としたらどうでしょう。

投稿2021/07/28 09:18

jinoji

総合スコア4585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Dis

2021/07/28 12:57

大変わかりやすかったです。初歩的な質問にお答えいただきありがとうございました。
guest

0

ベストアンサー

Subプロシージャなら、下記のようなフォーマットで

vba

1 Call プロシージャ名(引数1, 引数2)

Callは省略できます。

vba

1 プロシージャ名 引数1, 引数2

Functionプロシージャなら、Callは使いません。
返り値をどのように使うか次第です。
例えば、返り値を変数に代入するなら、下記のような感じです。

vba

1 Dim 変数 2 3 変数 = プロシージャ名(引数1, 引数2)

投稿2021/07/28 02:13

hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Dis

2021/07/28 08:21

丁寧なご回答ありがとうございます。 上記にも書きましたが、なぜこのSubプロシージャは実行できないのかがわかりません。 また実行できないとして、他のプロシージャから実行する理由もわかりません… (Callステートメントから呼び出すコードは非常にわかりました。ありがとうございます。) 大変申し訳ありませんが、ご教示いただけたらと思います。
hatena19

2021/07/28 12:34

どのシートを出力したいのか明示されていないですが、 アクティブなシートを出力するなら下記のようなコードでどうでしょうか。 Call CSV出力(ActiveSheet)
Dis

2021/07/28 12:56

起動できました。ありがとうございます。 ベストアンサーにさせていただきます。 人様のをコードを借りておきながら、申し訳ないのですが、なぜわざわざcallステートメントを記載したプロシージャとcsv出力プロシージャを分けるかがわかりません。 これは作り手の癖ととらえてよろしいのでしょうか? (私が書いていないので、なんとも言えませんが、私ならCSV出力プロシージャからそのまま実行できるコードを書くと思ったので)
hatena19

2021/07/29 08:36

Call CSV出力(ActiveSheet) とすれば、後からこの1行を見たとき、ActiveSheet をCSV出力するとすぐに分かります。 また、ActiveSheetではなく、例えば Sheet1 をCSV出力したい場合は、 Call CSV出力(WorkSheets("Shhet1")) とできます。 つまり使い勝手が格段に向上します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問