ClosedXMLのSub Mainエラー への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 とくま  (社会人)
投稿日時
2025/1/7 11:38:04
VB だと自動でやってくれることが多いので、「基本的な部分」と言えば間違ってはいないんだけど、
それを初心者の基礎知識として必須か?というと微妙な感じ。
覚えて損は無いけど、いわゆる「おまじない」としてそういうものだと先に進むのもありかも。
勉強したいなら、まずプログラムの開始ってのは「エントリポイント」っていうキーワードです。
「Windows フォーム アプリ」でも実は裏で Sub Main があるはずの前提で、それを自作の Sub Main
関数にすると、スタートアップフォームを表示するプログラムも、自分で作る必要が出てきます。
手順としては、
[アプリケーションが始まるときに呼び出す位置(エントリポイント)を変更する]
https://dobon.net/vb/dotnet/programing/startupobject.html
[アプリケーションのエントリポイントを自作する]
https://dobon.net/vb/dotnet/programing/makeentrypoint.html
の順になります。
ここまできて、最初の質問文に戻りますが、
>エクセル操作でClosedXMLのサンプル
は、プログラムを実行したら、Excelファイルを編集して、即、プログラムが終了する
という前提のサンプルプログラムだと言えます。
なので、プロジェクトのテンプレートとして「コンソール アプリ」で作成し、
自動で書かれた Sub Main にサンプルコードの関数内のコードだけコピペすれば、
プログラムを実行したら、Excelファイルを編集して、即、プログラムが終了する
コンソールアプリになります。
「Windows フォーム アプリ」で作成し、エントリポイントを自作に変更して、
自分で書いた Sub Main にサンプルコードの関数内のコードだけコピペすれば、
プログラムを実行したら、Excelファイルを編集して、即、プログラムが終了する
Windows フォームアプリ(フォーム起動せず)になります。
Main って関数名は特別の「おまじない」だから、自分で作らないようにしようね
で先に進んでも良い内容だと思います。
それを初心者の基礎知識として必須か?というと微妙な感じ。
覚えて損は無いけど、いわゆる「おまじない」としてそういうものだと先に進むのもありかも。
勉強したいなら、まずプログラムの開始ってのは「エントリポイント」っていうキーワードです。
「Windows フォーム アプリ」でも実は裏で Sub Main があるはずの前提で、それを自作の Sub Main
関数にすると、スタートアップフォームを表示するプログラムも、自分で作る必要が出てきます。
手順としては、
[アプリケーションが始まるときに呼び出す位置(エントリポイント)を変更する]
https://dobon.net/vb/dotnet/programing/startupobject.html
[アプリケーションのエントリポイントを自作する]
https://dobon.net/vb/dotnet/programing/makeentrypoint.html
の順になります。
ここまできて、最初の質問文に戻りますが、
>エクセル操作でClosedXMLのサンプル
は、プログラムを実行したら、Excelファイルを編集して、即、プログラムが終了する
という前提のサンプルプログラムだと言えます。
なので、プロジェクトのテンプレートとして「コンソール アプリ」で作成し、
自動で書かれた Sub Main にサンプルコードの関数内のコードだけコピペすれば、
プログラムを実行したら、Excelファイルを編集して、即、プログラムが終了する
コンソールアプリになります。
「Windows フォーム アプリ」で作成し、エントリポイントを自作に変更して、
自分で書いた Sub Main にサンプルコードの関数内のコードだけコピペすれば、
プログラムを実行したら、Excelファイルを編集して、即、プログラムが終了する
Windows フォームアプリ(フォーム起動せず)になります。
Main って関数名は特別の「おまじない」だから、自分で作らないようにしようね
で先に進んでも良い内容だと思います。
投稿者 tanaka  (社会人)
投稿日時
2025/1/7 10:29:43
ありがとうございます。
vb2022は、始めたばかりなので、基本的な部分が勉強不足です。
基本的な事をまず、調べてみようと思います。
それから、また、ClosedXMLに、戻ろうと思います。
よろしくお願いします。
vb2022は、始めたばかりなので、基本的な部分が勉強不足です。
基本的な事をまず、調べてみようと思います。
それから、また、ClosedXMLに、戻ろうと思います。
よろしくお願いします。
投稿者 とくま  (社会人)
投稿日時
2025/1/6 13:55:00
補足ですが、
C#だと分かりやすく Program.cs というファイルに自動で書かれた Sub Main が出てきますが、
VBだと表に出てこないかも。エラーメッセージがMyApplicationの下にあるって言ってるし、
スタートアップフォームを決めたら、裏で自動で作られちゃうのかもね。
Sub Main はプログラムを開始する特殊な関数で、そこからプログラムを起動するお約束の
関数です。なので「Windows フォーム アプリ」のまま実行したいなら、関数名を別のものに
変更して、ボタンクリックのイベント関数から、変更後の関数名呼ぶような形にしても良いでしょう。
C#だと分かりやすく Program.cs というファイルに自動で書かれた Sub Main が出てきますが、
VBだと表に出てこないかも。エラーメッセージがMyApplicationの下にあるって言ってるし、
スタートアップフォームを決めたら、裏で自動で作られちゃうのかもね。
Sub Main はプログラムを開始する特殊な関数で、そこからプログラムを起動するお約束の
関数です。なので「Windows フォーム アプリ」のまま実行したいなら、関数名を別のものに
変更して、ボタンクリックのイベント関数から、変更後の関数名呼ぶような形にしても良いでしょう。
投稿者 YuO  (社会人)
投稿日時
2025/1/6 12:58:05
> 「Sub Main' が 'WinFormsApp1' で複数回宣言されています: WinFormsApp1.My.MyApplication.Main(Args As String()), WinFormsApp1.Module1.Main()」とのエラーが出ます。
WinFormsAppとあるので、プロジェクトを「Windows フォーム アプリ」として作成してしまったのでしょう。
Sub Mainを使う場合は、「コンソール アプリ」を選択してプロジェクトを作成する必要があります。
WinFormsAppとあるので、プロジェクトを「Windows フォーム アプリ」として作成してしまったのでしょう。
Sub Mainを使う場合は、「コンソール アプリ」を選択してプロジェクトを作成する必要があります。
投稿者 tanaka  (その他)
投稿日時
2025/1/6 11:28:19
vb2022使用。
エクセル操作でClosedXMLのサンプルを貼り付けて実行したのですが、「Sub Main' が 'WinFormsApp1' で複数回宣言されています: WinFormsApp1.My.MyApplication.Main(Args As String()), WinFormsApp1.Module1.Main()」とのエラーが出ます。
探したのですが、重複して、Sub Mainの宣言は見当たらなかったのですが、どこが原因でしょうか?
よろしくお願いします。
コードを記載します。
Imports ClosedXML.Excel
Module Module1
Sub Main()
' Excel ファイルの保存先
Dim filePath As String = "SampleExcelFile.xlsx"
' 新しいワークブックを作成
Using workbook As New XLWorkbook()
' 新しいワークシートを作成
Dim worksheet = workbook.Worksheets.Add("Sample Sheet")
' セルにデータを書き込む
worksheet.Cell("A1").Value = "ID"
worksheet.Cell("B1").Value = "名前"
worksheet.Cell("C1").Value = "年齢"
' サンプルデータを追加
worksheet.Cell("A2").Value = 1
worksheet.Cell("B2").Value = "田中太郎"
worksheet.Cell("C2").Value = 30
worksheet.Cell("A3").Value = 2
worksheet.Cell("B3").Value = "鈴木花子"
worksheet.Cell("C3").Value = 25
' 列幅を自動調整
worksheet.Columns().AdjustToContents()
' ファイルを保存
workbook.SaveAs(filePath)
Console.WriteLine($"Excel ファイルが作成されました: {filePath}")
End Using
End Sub
End Module
エクセル操作でClosedXMLのサンプルを貼り付けて実行したのですが、「Sub Main' が 'WinFormsApp1' で複数回宣言されています: WinFormsApp1.My.MyApplication.Main(Args As String()), WinFormsApp1.Module1.Main()」とのエラーが出ます。
探したのですが、重複して、Sub Mainの宣言は見当たらなかったのですが、どこが原因でしょうか?
よろしくお願いします。
コードを記載します。
Imports ClosedXML.Excel
Module Module1
Sub Main()
' Excel ファイルの保存先
Dim filePath As String = "SampleExcelFile.xlsx"
' 新しいワークブックを作成
Using workbook As New XLWorkbook()
' 新しいワークシートを作成
Dim worksheet = workbook.Worksheets.Add("Sample Sheet")
' セルにデータを書き込む
worksheet.Cell("A1").Value = "ID"
worksheet.Cell("B1").Value = "名前"
worksheet.Cell("C1").Value = "年齢"
' サンプルデータを追加
worksheet.Cell("A2").Value = 1
worksheet.Cell("B2").Value = "田中太郎"
worksheet.Cell("C2").Value = 30
worksheet.Cell("A3").Value = 2
worksheet.Cell("B3").Value = "鈴木花子"
worksheet.Cell("C3").Value = 25
' 列幅を自動調整
worksheet.Columns().AdjustToContents()
' ファイルを保存
workbook.SaveAs(filePath)
Console.WriteLine($"Excel ファイルが作成されました: {filePath}")
End Using
End Sub
End Module
取り敢えずここは、解決とします。
ClosedXMLは、上手く行ったのですが、別の問題が発生して。