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

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

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

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

意見交換

5回答

384閲覧

ExcelをCOM利用しているVB6のプログラムについて

xail2222

総合スコア1525

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

.NET

.NETとは、主に.NET Frameworkと呼ばれるアプリケーションまたは開発環境を指します。CLR(共通言語ランタイム)を搭載し、入力された言語をCIL(共通中間言語)に変換・実行することが可能です。そのため、C#やPythonなど複数の言語を用いることができます。

0グッド

1クリップ

投稿2025/04/03 19:19

編集2025/04/03 19:31

テーマ、知りたいこと

ExcelをCOM利用しているVB6のプログラムがあるのですが
これをVB.Netにバージョンアップしたい。という話が私の所に来ています。

私は、社内で使うだけのプログラムなら、Excelマクロでいいのではと思いました。
ソースを読む限り、VBAでも事足りると感じたためです。

VBAはソースコードのバージョン管理が上手くできないと思うので
そこがネックとしてはあるのかなと思っているのですが
果たしてどうなのでしょうか。

また、.Netへの改修は、.Net Frameworkにしろ、.Net にしろ
解放処理をやたらとしないといけないのでコードが煩雑になると思っています。

また、EPPlusやClosedXMLを使うというのも手としてはあるのかなと思ってはいますが
余り使用経験がないのでよくわかっていません。

そのため、私はExcelマクロを推して提案しようかなと思っています。
皆さんならどうしますか?

自分で試したこと

.Netにする場合、以下がいいのかなと今は感じている所です。
ただ、これよりもExcelマクロの方がいいんじゃないかなとも思っている次第です。

以下の共通処理を作って

VB.Net

1Imports System.Runtime.InteropServices 2Module Module1 3 Private mListObject As List(Of Object) 4 Public Sub AddComObject(rObject) 5 If mListObject Is Nothing Then mListObject = New List(Of Object) 6 mListObject.Add(rObject) 7 End Sub 8 9 Public Sub AllRereseComObjec() 10 For i As Integer = mListObject.Count - 1 To 0 Step -1 11 Marshal.ReleaseComObject(mListObject.Item(i)) 12 Next 13 mListObject.Clear() 14 mListObject = Nothing 15 End Sub 16End Module

こんな感じに使う方法です。

VB.Net

1 Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click 2 Dim objXLSApp As Object 3 Dim objXLSBooks As Object 'Excel.Workbooks 4 Dim objXLSBook As Object 'Excel.Workbook 5 Dim objXLSSheets As Object 'Excel.Worksheets 6 Dim objXLSSheet As Object 'Excel.Worksheet 7 8 Dim objXLSCells As Object 'Excel.Range 9 Dim objXLSRange As Object 'Excel.Range 10 11 Dim tReleaseCom As New ReleaseComClass 12 13 objXLSApp = CreateObject("Excel.Application") 14 AddComObject(objXLSApp) 15 objXLSBooks = objXLSApp.Workbooks 16 AddComObject(objXLSBooks) 17 objXLSBook = objXLSBooks.Open(TextBox1.Text, False, True) 18 AddComObject(objXLSBook) 19 objXLSSheets = objXLSBook.Sheets 20 AddComObject(objXLSSheets) 21 objXLSSheet = objXLSSheets.Item("Sheet1") 22 AddComObject(objXLSSheet) 23 objXLSCells = objXLSSheet.Cells 24 AddComObject(objXLSCells) 25 26 objXLSRange = objXLSCells.Item(1, 1) 27 AddComObject(objXLSRange) 28 objXLSRange.value = "2" 29 30 objXLSRange = objXLSCells.Item(2, 1) 31 AddComObject(objXLSRange) 32 objXLSRange.value = "2" 33 34 If System.IO.File.Exists(TextBox2.Text) Then 35 System.IO.File.Delete(TextBox2.Text) 36 End If 37 objXLSBook.SaveAs(TextBox2.Text) 38 39 objXLSBook.Close 40 objXLSApp.Quit 41 42 AllRereseComObjec() 43 44 End Sub

オブジェクトを参照するたびに、それを追加していって
最後に逆順でリリースするだけなんですけど
最後に、順番を意識してリリースするのを列挙するのが大変だったり
同じ変数名を使いまわしたい場合、最後にリリースを列挙するより良いのかなと思った次第です。

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

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

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

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

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

回答5

#1

poto568

総合スコア358

投稿2025/04/04 00:59

依頼者が存在するならExcelマクロで良いか聞いてみるのが初手。
社内で過去に盛大に失敗した事例があって、VBA絶対許さないマンが
承認ルートに立ちはだかっているなら検討するだけ無駄です。

ユーザの使い勝手の問題もあるので、ヒアリング可能なら、雑に
モックアップでも作って、手順が変わっても対応できるか確認。
少しでも使い勝手が変わることを絶対許さない(以下略)

外部要因がクリアになっていれば、質問者さんの技術の確認。
VB.NETはあまり使ったことがないけどVBAには絶対の自信がある、
とかならVBAで書いた方が良いでしょうし、どっちでも使えるなら
どっちでもいいんじゃないでしょうか。
(特殊な要件が無ければ)細かい要素技術なんてどうでも良くて、
動くように書けば動きます。

私が依頼されたら、納期をたっぷりもらって新しい技術をオモチャ
にしてスキルアップを図ります。

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

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

#2

bebebe_

総合スコア520

投稿2025/04/04 01:45

過去にC#ですがExcelファイルを編集して保存するものを作ったことがありますがやはり解放処理周りがめんどくさかったです。
EPPlusやClosedXMLを使用するとかなり楽ですがEPPlusは有償になるのでVer4を使用していますが当然Excelの新しい機能に対応していないです。
ClosedXMLのほうは画像を配置しているブックを編集して保存したときに画像が変になってしまい使用をやめました。(修正されているかもしれませんが)
自分なら処理の内容にもよりますがExcelで完結できるなら完結させたいですね。

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

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

#3

odataiki

総合スコア984

投稿2025/04/04 04:00

VBAのソースコードのバージョン管理は少しコツが必要です。
vbac.wsfというライブラリを使って
Excelファイルをテキストに分解して管理する方法があります。
手前みそですがQiitaでMSAccessのVBAのGIT管理について書いています。
大文字小文字が無視されるVBAの言語仕様がくせ者なのですよね・・・

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

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

#4

xail2222

総合スコア1525

投稿2025/04/04 13:15

#1

VBAもVB.Netも技術的には問題ないですが
VB.Netの方が必要工数が多くなりそうだと思うのと
プログラムが複雑になりそうな気がして、どんなものかなぁ。と思っていました。
poto568さんは、.NetでExcel扱ったことありますか?

#2

解放処理面倒ですよね。
ExcelVBAの1.5倍工数を見込んだ方がいいのではと思ったりしています。
Excelで完結できそうな気がしているので、それで押したいと思います。

#3
内容的には、元の奴は全部エクスポートしてくれるってことですよね。
大文字小文字の違いについては、変えないようにコーディングを気を付ければよいと思っていましたが・・・

何にしてもエクスポートして、ソース管理しておいた方が良いですよね。

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

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

#5

xail2222

総合スコア1525

投稿2025/04/08 13:33

無事、ExcelVBAにコンバートすることになりました。

そして、ただいまコンバート中なのですが
.Netにするよりも、10倍楽だと思います。

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

この意見交換はまだ受付中です。

会員登録して回答してみよう

アカウントをお持ちの方は

関連した質問