
こんばんは。私はVBA初心者です。
”良くVBとVBAは同様な言語”と伺いますが、実際にVBプログラムのソースを
VBAにコピーしてもエラーが出て使用できません。
私がいまいちVBとVBAの明確な違いがわかっていないからだと思いますが、頭がもやもやです。
VBはHP上からVB2005を入手しました。
そもそもVBとVBAの相違点は何が違いますか?
HPを見ているとVBAでもVB同様にシステムも組めると記載されているため
EXCEL上で動作するVBAで、簡単なシステムを組みたいと思ってます。
どうすればVBプログラムをEXCEL VBAに簡単に移植できますか?
作業手順、移植する際に注意する点等、アドバイスを教えてください。
また参考になるHPや本をご紹介くださいませ。
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
私はあまり詳しくはないですが、たとえばこんな例はいかがでしょう。
今開かれているエクセルのシートのあるセルに画像を貼り付けたい。
貼り付けたい画像のパスはC:\test.jpg
だったとします。
これをVBで作ったらどうなるでしょう?という例です。
そんなの簡単でしょうけど、こんなに長くなってしまって泣きそうになると思います。
Imports System
Imports System.Text
Imports System.Reflection
Imports System.Runtime.InteropServices
Module Module1
Sub Main(ByVal cmdArgs() As String)
Dim objApp As Object
Dim objBooks As Object
Dim objBook As Object
Dim objSheets As Object
Dim objSheet As Object
Dim objRange As Object
Dim objPictures As Object
Dim objParams() As Object
'
Dim objPicture As Object
Dim myBook As String
Dim mySheet As String
Dim myRange As String
Dim picturePath As String
Dim dstRange As String
picturePath = "C:\test.jpg"
If cmdArgs.Length = 4 Then
myBook = cmdArgs(0) 'ブック名
mySheet = cmdArgs(1) 'シート名
myRange = cmdArgs(2) 'セルのアドレス
dstRange = cmdArgs(3) 'セルのアドレス
Else
MsgBox("PicturePaste.exeのアプリケーションエラー,引数が足りません")
Exit Sub 'コマンドラインで引数3つ代入してくれてなかったら終了
End If
Try
'エクセルが起動していて、アクティブなブック、シート
'があるときに呼び出された時、このアプリが起動すると仮定してコードを書きます。それ以上ややこしいのを作れと言ったら泣きます。
objApp = Marshal.GetActiveObject("Excel.Application") 'すでに起動されているエクセルをアタッチ
objBooks = objApp.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, Nothing, objApp, Nothing)
ReDim objParams(0)
objParams(0) = myBook
objBook = objBooks.GetType().InvokeMember("Item", BindingFlags.GetProperty, Nothing, objBooks, objParams) 'ブックのコレクションから指定されたブックをひとつ取り出してアタッチ
objSheets = objBook.GetType().InvokeMember("Worksheets", BindingFlags.GetProperty, Nothing, objBook, Nothing) 'ブックから、シートのコレクションをアタッチ
objParams(0) = mySheet
objSheet = objSheets.GetType().InvokeMember("Item", BindingFlags.GetProperty, Nothing, objSheets, objParams) 'シートのコレクションから指定されたシートをひとつ取り出してアタッチ
ReDim objParams(1)
objParams(0) = myRange
objParams(1) = myRange
objRange = objSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, Nothing, objSheet, objParams) '指定されたシートから指定されたセルをアタッチ
objRange.GetType().InvokeMember("Select", BindingFlags.InvokeMethod, Nothing, objRange, Nothing) '貼り付けたい場所のセルをセレクト
objPictures = objSheet.GetType().InvokeMember("Pictures", BindingFlags.GetProperty, Nothing, objSheet, Nothing)
ReDim objParams(0)
objParams(0) = picturePath
objPicture = objPictures.GetType().InvokeMember("Insert", BindingFlags.InvokeMethod, Nothing, objPictures, objParams) '画像を貼り付け
objParams(0) = "ユニークになりそうな画像の名前" & myRange
objPicture.GetType().InvokeMember("Name", BindingFlags.SetProperty, Nothing, objPicture, objParams) '画像に名前を付ける
ReDim objParams(1)
objParams(0) = dstRange
objParams(1) = dstRange
objRange = objSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, Nothing, objSheet, objParams) '指定されたシートから指定されたセルをアタッチ
objRange.GetType().InvokeMember("Select", BindingFlags.InvokeMethod, Nothing, objRange, Nothing) '最初に選択されていたセルを選択し直しておく
Catch e As Exception
MsgBox(e.Message)
End Try
End Sub
End Module
これを「エクセルの処理だったらエクセルに付いてるVBAで処理しよう。」とすると間違いも少なく数行ですみます。まるで魔法のステッキみたいに感じると思います。
これが違い。。。かなぁ。。。
この意見はあくまで参考です。他の方はどう思っているのか。。。
No.3
- 回答日時:
>VB6.0のサンプルプログラムならVBAにそのまま移植できると解釈で良いですか?
#2さんの回答のように基本的なコードであればそのまま使えますが、VBAでは使えない構文も存在します。
VBで簡単に使えるタイマーはVBAには無いのでAPIやフリーのライブラリ等を使う必要があります。
VBの入出力についてはフォームを使ったインターフェイスを介在すると思いますが、エクセルVBAではフォームよりもシートを直接操作することがメインになると思います。
アクセスではフォームボタンからデータベースの操作が主になってきます。
>VBAを利用してシステムを構築する方は少ないのは事実で、それなりにメリットがあるからと理解しています。
VBAは限定された機能しかないのでできることは限られます。
(大抵の事は可能ですが、どこまでできるかはプログラマのスキル次第です。)
そのため、独立したアプリケーションとして作成することはできません。他のソフトを操作するにはそれなりの知識(WinAPI等)が必要になってきます。
また、VB等の開発ソフトを利用した方が多くの機能を盛り込めますし、ライブラリの配布制限にも違反することは無いでしょう。
アプリケーションの配布やインストールも簡単です。
VBAではインタープリンタなので動作速度にも優位性はありません。
あなたがどのような物を組みたいのか解りませんが、VBAのみでも問題無い場合もあるでしょう。
ユーザーインターフェースや堅牢性・互換性など、使用上の問題をクリアできて、結果を出すことができれば利用者にとって中身(プログラム)は関係ないのですからね。
>私の質問が漠然としているのかもしれませんが、結局明確にここが違う!!
ネット検索するといくつもの質問サイトで同じ文面の質問がされていますが、「VBAはアプリケーションに特化したプログラム」と言う回答が目立ちます。
異なる部分についてはあまり触れられていないのは、プログラムの使用目的が異なるからでしょう。
VB6コードのコピーでエラーが発生しても修正箇所はわずかで済むと思います。
アプリケーションに特化した機能を使うには、アプリケーションに関しての知識が要求されます。
エクセルだとデータの集計・転記・検索・抽出等が主な作業になると思いますが、作業の目的によって手順や方法は様々です。
エクセルの機能を知っていて効率的な手順と処理速度を向上させる方法を会得していないと、良いプログラムを書くことはできません。
(VBからエクセルを呼び出して処理する場合も同様ですが・・・)
まあ、エクセルで処理速度が必要なゲームを作成したいと言うのであれば「不適」と回答できますが、それ以外であれば「可」とも言えます。
「可」のレベルも「問題なし」~「無理やり実装(疑似等)」まであるでしょう。
ご回答ありがとうございます。
hana-hana3さんの回答から何と無く差がわかってきました。
取りあえずVBソースをコピーしエラー部分を修正する方法で進めてみたいと思います。
この方法の方が速そうですね。
VBとVBAでは処理速度の差もあるんですね。
勉強になりました。ありがとうございました。
No.2
- 回答日時:
大体はNo1の方が言われていますが、VBもVBAもプログラム言語としては確かにほぼ同じなんですよね。
例えば数値を入力して何らかの計算や集計をして結果を表示するプログラムがあったとしましょう。
真ん中の集計や計算をするメインの部分は、ほぼ同じですね。
ただし、その前後の入出力の部分は変わってきます、
VBならVBに用意されたウィンドウやテキストボックスを使いますが、
VBAならVBAで用意された物を使ったり、Excelならワークシートに直接読み書きする場合もあるでしょう。
つまり移植方法としてはメインと入出力の部分を分けて考えて、
入出力はVBとVBAの方法の違いを知る必要があると言う事ですね。
他には関数や機能も少し違う所がありますね。
早速回答いただきありがとうございます。
確かにに表計算などの結果表示などのアプリケーションの違いはありそうですね。
hana-hana3さんがいわれていた基本的にはベースは一緒というのはこのことですね。
移植する際にはセル・シート操作部分は移植時に注意してみたいと思います。
私がVBAを使用しているのは表計算もありますが、最終的には他ソフト操作や連携もしたいためです。
その他VBAがVB6.0より劣る機能は無いんですか?
No.1
- 回答日時:
>どうすればVBプログラムをEXCEL VBAに簡単に移植できますか?
VBAはアプリケーションに依存して動作するプログラムで、アプリケーションの制御に特化した機能を持っています。
ベースはVB6なので、VB6とは仕様の異なる.NETのVBをそのままコピーしても使えません。
>作業手順、移植する際に注意する点等、アドバイスを教えてください。
移植する内容(プログラム)次第かと思います。
双方の仕様を理解していくしか無いでしょう。
早速、回答いただきありがとうございます。
hana-hana3さんの回答からVB6.0のサンプルプログラムならVBAにそのまま移植できると解釈で良いですか?
他HPなどでも具体例が少なくVBとVBAはほぼ同じで”A”の意味の違いを述べているものが多いです。
ただシステム開発者はVBやVC使用者が多い!!VBAを利用してシステムを構築する方は少ないのは事実で、それなりにメリットがあるからと理解しています。
当然、VBにあってVBAがカバーできない機能(ベースは同じだが違い)がある筈です。
ここでは移植出来ない機能、移植時の注意点について教えて欲しいと思います。
私の質問が漠然としているのかもしれませんが、結局明確にここが違う!!という核心部分が見えて来ないと何に気を付け仕様比較すべきか判断が難しいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBでExcelの表形式の様なデザインを作りDBと連携させる。 4 2023/02/28 11:39
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
- C言語・C++・C# visual studioでフォームデザインを作成する時のVB.netとC#の違い 2 2023/06/22 03:04
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- Excel(エクセル) Excel VBA 3 2023/04/22 10:46
- Excel(エクセル) ランダムで四択の問題を作る場合にvbaで何を学べばいいでしょうか。 1 2022/04/14 16:45
- Microsoft ASP ASP.NETや.NET、C#とかVBとか 2 2022/05/16 21:16
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) VBプロジェクトでのフォルダ構成について 1 2023/07/22 03:49
- Excel(エクセル) Excel ハイパーリンク設定について 教えてください 例なんですが、 VBAにてファイル1の列Gに 2 2022/11/04 17:52
このQ&Aを見た人はこんなQ&Aも見ています
-
これまでで一番「情けなかったとき」はいつですか?
これまでの人生で一番「情けない」と感じていたときはいつですか? そこからどう変化していきましたか?
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
コンビニでおにぎりを買うときのスタメンはどの具?
コンビニでおにぎりを買うとき、何の具材を選ぶことが多いですか?
-
AIツールの活用方法を教えて
みなさんは普段どのような場面でAIツール(ChatGPTなど)を活用していますか?
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
VBAをVBに変換する方法
その他(プログラミング・Web制作)
-
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
-
4
frxファイルの役目
Visual Basic(VBA)
-
5
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
6
GPIB制御
その他(ソフトウェア)
-
7
vbaから他のアプリを終了
Visual Basic(VBA)
-
8
構造体配列の特定のメンバーをFor~Eachで
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Ryzen 3700(無印)はWin11に対応...
-
API、OCX、DLLって何でしょう?
-
BiilderとD-Show フレームレー...
-
C/C++でチャットソフトを作りた...
-
FORTRAN でプログレスバーを作る
-
PICの逆アセンブル?について
-
Unityがすごく遅いです。ノート...
-
SNMPトラップ情報をC#.netで作...
-
バージョンのつけ方
-
ニンテンドーDS用、自作プロ...
-
VBプログラムをEXCEL VBAに移植...
-
MS-DOSで作ったBASICプログラム...
-
プログラマの実力の奥深さ
-
オフラインの掲示板
-
EXCEL-VBAのプログラムを移植し...
-
このプログラミング誰か教えて...
-
i,j,k
-
1年無職の彼氏 別れるべきですか?
-
Excelで用語辞典を作成するには?
-
6~7割の正解で、なぜ合格?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
API、OCX、DLLって何でしょう?
-
Ryzen 3700(無印)はWin11に対応...
-
VBプログラムをEXCEL VBAに移植...
-
コンソールアプリでファイル選...
-
SNMPトラップ情報をC#.netで作...
-
C言語のHP-UXからLinuxへのポ...
-
C#のプログラムを読むコツって...
-
オフラインの掲示板
-
大至急!!! ピクトグラミング...
-
VBS:コンピュータ名を取得し、...
-
printf系の書式「w」ってなに?
-
UNIX環境でのCプログラム上でC...
-
VB.net エラーメッセージを英文...
-
C言語プログラミング 逆行列を...
-
CoInitializeSecurityが失敗する
-
PICの逆アセンブル?について
-
変数の大きさを超える代入
-
自動で施設の空きを通知するプ...
-
ニンテンドーDS用、自作プロ...
-
C/C++でチャットソフトを作りた...
おすすめ情報