ClosedXMLの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
投稿者 YuO  (社会人) 投稿日時 2025/1/6 12:58:05
> 「Sub Main' が 'WinFormsApp1' で複数回宣言されています: WinFormsApp1.My.MyApplication.Main(Args As String()), WinFormsApp1.Module1.Main()」とのエラーが出ます。

WinFormsAppとあるので、プロジェクトを「Windows フォーム アプリ」として作成してしまったのでしょう。
Sub Mainを使う場合は、「コンソール アプリ」を選択してプロジェクトを作成する必要があります。
投稿者 とくま  (社会人) 投稿日時 2025/1/6 13:55:00
補足ですが、
C#だと分かりやすく Program.cs というファイルに自動で書かれた Sub Main が出てきますが、
VBだと表に出てこないかも。エラーメッセージがMyApplicationの下にあるって言ってるし、
スタートアップフォームを決めたら、裏で自動で作られちゃうのかもね。

Sub Main はプログラムを開始する特殊な関数で、そこからプログラムを起動するお約束の
関数です。なので「Windows フォーム アプリ」のまま実行したいなら、関数名を別のものに
変更して、ボタンクリックのイベント関数から、変更後の関数名呼ぶような形にしても良いでしょう。
投稿者 tanaka  (社会人) 投稿日時 2025/1/7 10:29:43
ありがとうございます。
vb2022は、始めたばかりなので、基本的な部分が勉強不足です。
基本的な事をまず、調べてみようと思います。
それから、また、ClosedXMLに、戻ろうと思います。
よろしくお願いします。
投稿者 とくま  (社会人) 投稿日時 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 って関数名は特別の「おまじない」だから、自分で作らないようにしようね
で先に進んでも良い内容だと思います。
投稿者 tanaka  (社会人) 投稿日時 2025/1/7 11:50:03
アドバイスありがとうございます。
取り敢えずここは、解決とします。
ClosedXMLは、上手く行ったのですが、別の問題が発生して。