• 締切済み

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

  • VBAでご相談です!

    Excel2010使用。 VBA初心者です。 VBAでご相談させて下さい。 複数のファイルを1つにまとめる 作業をしたいと思い、ググったところ あるサイトで下記のコードを見つけました。 ただ、このコードでは、ファイルをダイアログから 選択する形になります。 これを、ファイルを指定した状態で実行させたいと思い、 自分で試してみたのですが、上手くいきませんでした。 同一フォルダ内には4つのファイルがあり、全て同じ様式の シートが複数あります。ただ、フォルダ名が毎月変更になります。 この同一フォルダ内のデータの中の特定のシートを一つのシートに まとめたいと考えているのですが、可能でしょうか? 可能であれば、アドバイスいただけるとありがたいです。 Sub sample() Dim myPath As String Dim wb_A As Workbook, wb_B As Workbook Dim i As Long, s As Long myPath = Application.GetOpenFilename(("Excel ファイル (*.xls), *.xls"), , "データを蓄積するブックを選択して下さい。") If myPath = "False" Then Exit Sub Set wb_A = Workbooks.Open(myPath) myPath = Application.GetOpenFilename(("Excel ファイル (*.xls), *.xls"), , "データを取得するブックを選択して下さい。") If myPath = "False" Then Exit Sub Set wb_B = Workbooks.Open(myPath) With wb_B For i = 1 To .Worksheets.Count 'wb_Bループ For s = 1 To wb_A.Worksheets.Count 'wb_Aループ '同じ名前のシートがあるとき データコピー If .Worksheets(i).Name = wb_A.Worksheets(s).Name Then .Worksheets(i).Range("A1").CurrentRegion.Copy _ wb_A.Worksheets(i).Range("A65536").End(xlUp).Offset(1) Exit For End If '同じ名前のシートが無いとき シートコピー If s = wb_A.Worksheets.Count Then .Worksheets(i).Copy Before:=wb_A.Sheets(1) End If Next s Next i wb_B.Close False MsgBox "完了" End With End Sub ※長文、説明下手で申し訳ありませんが よろしくお願いします。 <参考URL>   http://www.excel.studio-kazu.jp/kw/20040709212700.html

  • ExcelVBAで特定のブックをcloseしたい

    よろしくお願いします。Excel2000ですが、2002,2003,2007でも利用できることを前提に考えています。  複数のExcelブックを開いているとき、特定のファイル名のブックを閉じる方法を考えています。  2通り考えたのですが、いずれもだめでした。デバッグ機能でステップインしながら確認したのですが、エラーにもならず、closeメソッドを通過していました。 以下のVBAはなにか誤りがあるのでしょうか? (その1)  For i = 1 To Workbooks.Count   If Left(Workbooks(i).Name, 2) = "v3" Then    msw = Workbooks(i).Name    If msw <> "V3main.xls" Then     Workbooks(msw).Close    End If   End If  Next (その2)  For Each wb In Workbooks   If Left(wb.Name, 2) = "v3" Then    MsgBox (wb.Name)    If wb.Name <> "V3main.xls" Then     With wb      .Saved = True      .Close     End With    End If   End If  Next wb

  • メッセージ表示の解除

    VBAで読み取り専用でファイルが開かれているときは、処理を行わず 「誰か開いていますよ」というメッセージを表示してしばらくしてから 再度処理をするといったことを行いたいと考えています。 しかし、読み取りが解除されたとき「ファイルが編集可能となりました」の表示がされてしまいます。 これを解除するにはどうしたらいいでしょうか? If wb.ReadOnly = True Then Workbooks("test.xls").Close MsgBox ("ただいま他の方が使用中です。しばらくしてOKボタンを押下してください。") GoTo LABEL1 End If

  • VBA like演算子について

    VBA like演算子について 下記コードで”パターン文字列が不正です”とエラーで止まってしまいます。 For n = 3 To 89 If n Like "[5-7]" Then GoTo Skip_Line・・・・(1) If n Like "[39-70]" Then GoTo Skip_Line・・・(2)     処理・・・・・ Skip_Line: Next n nは行数で5-7行目と39-70行目を処理せずに飛ばそうとしています。 (1)はうまくいくのですが(2)の方で”パターン文字列が不正です”とエラーで止まってしまいます。 どなたかお知恵をおかしい頂ければ幸いです。

  • エクセルVBAで条件式について

    例えば、エクセルVBAでif~thenのような条件式で条件に合わなかったら、そのプロシージャ内の処理をすべてキャンセルするか、条件にあわなかったら、それ以降の下段に記述されているプロシージャ内のVBAをキャンセルする方法はありませんか?

  • EXCEL VBA2010 MsgBox

    Sub 重複() Dim i As Long, j As Long For i = 6 To 500 For j = 3 To 3 If WorksheetFunction.CountIf(Range("C6:C500"), Cells(i, j)) > 1 Then Cells(i, j).Interior.ColorIndex = 6 End If Next j Next i End Sub このVBAに重複が何件ありますよというメッセージを出したいです。 MsgBoxの入れ方を教えてください。

  • ドライブが違ってもファイルが正常に開けるようする

    windows7 Excel2007を使って、みようみまねでマクロ作成の初心者です。  現在 遠方の知人とEXCELブックのやり取りをしています。   フォルダの中にA・B・Cブックとマクロ記入用のDブックが入っており   これをフォルダごと送っています。双方とも以下のマクロで開いています。   Sub Eァイルを開く() Dim wb As Workbook On Error Resume Next '開いて作業中の場合 Set wb = Workbooks("Eファイル.xls") On Error GoTo 0 If wb Is Nothing Then Set wb = Workbooks.Open(ThisWorkbook.Path & "\Bフォルダ名\Eファイル.xls") End If End Sub   変更 私のマイドキュメントを外付けハードディスクのHドライブに移動する。        ¥H¥マイドキュメント¥計算処理      知人のマイドキュメントを外付けハードディスクのFドライブに移動する。        ¥F¥マイドキュメント¥計算処理      そしてやり取りは、マクロ記入のDブックのみとする。   そしてやりたいことは、双方のパソコンでエラーなくファイルを開けるようにしたいのです。試行錯誤的にコード書きましたがうまくいきません。どうコードを書いたらよろしいでしょうか? Sub  Eファイルを開く() Dim wb As Workbook On Error Resume Next ChDrive "F" ''フォルダが存在するかどうか調べます Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") If FSO.FolderExists("..\計算処理") Then '開いて作業中の場合。 Set wb = Workbooks("Eファイル.xls") On Error GoTo 0 If wb Is Nothing Then Set wb = Workbooks.Open(ThisWorkbook.Path & "\Bフォルダ名\Eファイル.xls") End If Else ChDrive "H" ChDir "計算処理" '開いて作業中の場合。 Set wb = Workbooks("Eファイル.xls") On Error GoTo 0 If wb Is Nothing Then Set wb = Workbooks.Open(ThisWorkbook.Path & "\Bフォルダ名\Eファイル.xls") End If Set FSO = Nothing End If End Sub

  • For ~ Next の使い方

    for ~ next 構文の途中でカウンターを進めることはできますか。 For I=1 to 10 処理 if ~ then next 処理 next このようにすると、エラーになります。 仕方なく次のようにしていますが、もっと良い方法はありますか。 For I=1 to 10 処理 if ~ then goto 次の行へ 処理 次の行へ: next

  • VBAでエラートラップがうまくいきません。

    VBAで次のようなプロシージャを実行してみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   If Target.Value = " " Then          ~コード~   END IF END SUB すると複数のセルが選択されるとエラーがでます。そこで次のようにしてみました。 Private Sub Worksheet_SelectionChange(ByVal Target As Range)   On Error GoTo エラー処理   If Target.Value = " " Then     On Error GoTo 0           ~コード~   END IF   EXIT SUB エラー処理:   EXIT SUB END SUB ところがこれでもやっぱりIF文のところでエラーがでます。 当方初心者でなぜエラーがでるのかわかりません。 わかりやすくご教授ください。 よろしくお願いします。

  • EXCELのVBA NULL、スペースの判断

    EXCEL2000を使用しています. 入力データはテキストファイルで VBAで 空白値のを読み飛ばししたい為 if mid(da_i,1,1) <> " " then goto aa end if で判断していますが、空白データが読み飛ばしできません. (null値ではありません) どのようにすればよいのでしょう? また、null値の場合の読み飛ばしは if mid(da_i,1,1) <> "" then goto bb end if でよいのでしょうか?

専門家に質問してみよう