• 締切済み

VBAからVBへ変更

お世話になります 今現在エクセルVBAにてエクセルファイル7ファイルをコントロールしています。 とりあえず手っ取り早く動作優先で作ったのでVBAで作りましたが、 VB6.0にて機能を増やしてアプリ化しようと思っていますが、元ネタを動作優先で作ったため、あちこちベタ書きのところもあります。 VBに置き換えの際、インデックスを使ったほうが処理上良いのでしょうか? 又処理内容上 FOR nextやプロシージャを使用してのプログラミングが処理内容上上手くいかないまたは困難なところがあったので、今では使用しない IF **** Then Goto AA AA: *** **** 等古い書き方を多用していますが、考え直したほうがよろしいでしょうか? サポートは私だけなので、私がわかればいいのでVBAのまま継承できるところは継承したいのですが、処理問題としてどうなのでしょうか? ご教示お願いします。 プログラムの部分抜粋 Windows("" & Sfn & ".xls").Activate For j3 = 0 To 18 For i1 = 1 To 2500 Hl1 = Workbooks("" & Sfn & ".xls").Sheets(Ss1).Cells(i1, j1 + j5 + j3).Value If Snn = Hl1 Then Workbooks("" & Sfn & ".xls").Sheets(Ss1).Cells(i1, j2).Resize(, 6).Copy 貼り付け ← 行き先プロシージャ Else: 読取列変更 ← 行き先プロシージャ If i2 >= Wsc Then Wb = 1 If Hl1 = 0 Then Book終 ← 行き先プロシージャ If Ce1 > 7 Then GoTo AX ←行き先別行 End If Next If i1 >= 5 Then j3 = j3 + 6 i1 = 1 j2 = j3 + 1 j3 = j3 - 1 Next AX: If Wb = 1 Then GoTo AE ← 行き先別行 i2 = i2 + 1 GoTo AC ← 行き先別行 -------------------------------- Sub Snn確定() If i6 = 1 Then Snn = Sn1 If i6 = 2 Then Snn = Sn2 If i6 = 3 Then Snn = Sn3 If i6 = 4 Then Snn = Sn4 If i6 = 5 Then Snn = Sn5 If i6 = 6 Then Snn = Sn6 If i6 = 7 Then Snn = Sn7 If i6 = 8 Then Snn = Sn8 If i6 = 9 Then Snn = Sn9 If i6 = 10 Then Snn = Sn10 If i6 = 11 Then Snn = Sn11 If i6 = 12 Then Snn = Sn12 If i6 = 13 Then Snn = Sn13 If i6 = 14 Then Snn = Sn14 If i6 = 15 Then Snn = Sn15 If i6 = 16 Then Snn = Sn16 If i6 = 17 Then Snn = Sn17 If i6 = 18 Then Snn = Sn18 If i6 = 19 Then Snn = Sn19 If i6 = 20 Then Snn = Sn20 If i6 = 21 Then Snn = Sn21 If i6 = 22 Then Snn = Sn22 If i6 = 23 Then Snn = Sn23 If i6 = 24 Then Snn = Sn24 If i6 = 25 Then Snn = Sn25 If i6 = 26 Then Snn = Sn26 If i6 = 27 Then Snn = Sn27 If i6 = 28 Then Snn = Sn28 End Sub 思いっきりベタ書きです --------------------------------

みんなの回答

回答No.3

> Activateを書く前にどのブックかを指定しています。 > 上書きも > Windows("" & k1 + ie1 & ".xls").Activate > ActiveWorkbook.Save > のようにどのブックかを限定して上書きしてますので > 問題ないですね。 > 閉じるのも > 条件に応じて > Workbooks("" & k1 + ie1 & ".xls").Close > で閉じてます。 > 7つだからか、今のところ問題ありません。 書き方が悪かったですかね。 ActiveWorkbook はブックの特定を Excel 側の状態に委ねてますし。。。 Workbooks("hoge.xls").Close も拡張子を表示しない環境によっては Workbooks("hoge").Close となる場合もありますし。。。 ブックを開く時や新規作成した時にオブジェクト変数で参照しちまえば Activate で Active になってくれてなくても、ブックの名前が途中で変わっても、ユーザーが拡張子を表示しない PC でも関係ないってことです。

masaojisan
質問者

お礼

ありがとうございます。

回答No.2

VB 6.0 で作成したアプリから複数の Excel をコントロール、と。 #1 さんの言うように CreateObject 等による late binding の他、VB のプロジェクトで Excel のタイプライブラリを参照設定して利用する early binding もあります。 いずれにせよ、Excel VBA から Excel ファイルをコントロールしていた時のように(質問文の例のように) ●●.Activate とか Hl1 = Workbooks("" & Sfn & ".xls").Sheets(Ss1).Cells(i1, j1 + j5 + j3).Value とかの書き方は危険。 以下、参照設定済みの状態での書き方。 1. Activate は信じない。 ブックを開けばそのブックが Active になるし、シートを追加すればそのシートが Active になってしまう。 2. いきなり「Cells(」と書いた場合はたまたま一番上にあるブックの一番上にあるシートのセルの事を指すのであり、「どのブックのどのシートの」は保証されない。 3. Workbooks のカッコの中にファイル名を入れるのは PC によってはエラーになる。「登録された拡張子を表示しない」の Windows では Excel のタイトルバーにも拡張子が表示されないから。 だから私は以下のようにします。 1. 作業対象のブックを開いたら Workbook 型の変数で確実に参照する。 2. 作業対象のワークシートを Worksheet 型の変数で確実に参照する。 これならば対象のシートがアクティブになっていなくても狙ったシートのセルを操作することができます。 (神経質すぎるのかな。。。) ' Excel を起動 Dim xlsApp As Excel.Application Set xlsApp = New Excel.Application xlsApp.Visible = True ' hoge.xls を開く Dim hogeBook As Exclel.Workbook Set hogeBook = xlsApp.Workbooks.Open("hoge.xls") ' hoge.xls の 1番左のシートを作業対象にする Dim hogeSheet As Excel.Worksheet Set hogeSheet = hogeBook.Worksheets(1) hogeSheet.Range(hogeSheet.Cells(1, 1), hogeSheet.Cells(5, 8)).Value = "aaa" ' 上書き保存して閉じる hogeBook.Save hogeBook.Close False xlsApp.Quit Set hogeSheet = Nothing Set hogeBook = Nothing Set xlsApp = Nothing

masaojisan
質問者

お礼

助言ありが乙ございます Activate は信じない ハイその通り、身にしみて分かっています。 Activateを書く前にどのブックかを指定しています。 上書きも Windows("" & k1 + ie1 & ".xls").Activate ActiveWorkbook.Save のようにどのブックかを限定して上書きしてますので 問題ないですね。 閉じるのも 条件に応じて Workbooks("" & k1 + ie1 & ".xls").Close で閉じてます。 7つだからか、今のところ問題ありません。

回答No.1

基本的にVBAとVB6.0のコードの書き方は同じです。VBからでは当然Excel関係のオブジェクト参照がないので、CreateObjectやGetObject等でちゃんとオブジェクトを作成・参照してあげれば動作部分は大きく変更する必要はありません。 ですが・・・ Gotoの使用は出来る限り避けたほうがよいですね・・・。 SubやFunctionで機能を分けるようにしたほうが、デバッグや修正・改良がしやすくなりますよ。

masaojisan
質問者

お礼

助言ありがとうございます やはりやめたほうが良いですか デバッグは追加機能を除けばもうすでに運用してますので動作的にはOKなので動作上拙くならないのであればこのまま行こうと思います。

関連するQ&A