ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

お世話になります
今現在エクセル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
思いっきりベタ書きです
--------------------------------

このQ&Aに関連する最新のQ&A

A 回答 (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 でも関係ないってことです。
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2009/05/25 08:37

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/19 21:56

基本的にVBAとVB6.0のコードの書き方は同じです。

VBからでは当然Excel関係のオブジェクト参照がないので、CreateObjectやGetObject等でちゃんとオブジェクトを作成・参照してあげれば動作部分は大きく変更する必要はありません。

ですが・・・
Gotoの使用は出来る限り避けたほうがよいですね・・・。
SubやFunctionで機能を分けるようにしたほうが、デバッグや修正・改良がしやすくなりますよ。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/19 21:44

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング