ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

EXCEL VBAコミュのファイル間の処理

  • mixiチェック
  • このエントリーをはてなブックマークに追加
初めまして、VBAの初心者です。
以下、ダイアログを開いてそこから選んだファイルに対してマクロを実行したいのですが、上手くいきません。

Sub open_d()
Dim MyStr As String
Dim i, col, num As Integer
'Dim OpenFileName As String
Dim SheetName As String, Target As String, buf As String
Dim OpenFileName
Dim book As String
OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls") 'ファイルオープン
If OpenFileName <> "False" Then
Workbooks.Open Filename:=OpenFileName
buf = Dir(OpenFileName)
Workbooks(buf).Activate
'オープンしたファイルに対する処理
Application.ScreenUpdating = False '画面更新停止
book = ActiveWorkbook.Name
For col = 4 To 26 '列幅調整
Sheet2.Columns(col).ColumnWidth = 30.25
Next col
blnSaveStatus = Application.DisplayStatusBar 'プログレスバー
Application.DisplayStatusBar = True
strBarNow = "現在 0%:□□□□□□□□□□"
Application.StatusBar = strBarNow
For i = 4 To Sheet1.Cells(Rows.Count, 2).End(xlUp).Row 'Cells(Rows.Count, 2)はセル(最終行, 2列目)
For j = 2 To 24
MyStr = Sheet1.Cells(i, j)
If MyStr <> "" Then
Sheet2.Cells(i + 2, j + 2) = MyStr
End If
Next j
progress = Int(i * 100 / Sheet1.Cells(Rows.Count, 2).End(xlUp).Row) ' 進捗率(%)
mass = Int(i * 10 / Sheet1.Cells(Rows.Count, 2).End(xlUp).Row) ' 10%単位
strBarWk = "現在 " & progress & "%:" & _
String(mass, "■") & String(10 - mass, "□")
If (strBarWk <> strBarNow) Then
Application.StatusBar = strBarWk 'バー更新
strBarNow = strBarWk
End If
Application.StatusBar = False ' ステータスバーの制御をExcelに戻す
Application.DisplayStatusBar = blnSaveStatus
Next i
End If
Application.ScreenUpdating = True
End Sub


「'オープンしたファイルに対する処理」から下の処理が、実行したexcelファイルに対して行われ、オープンしたファイルに行われません
どのように組み直せばいいのか、どなたか分かる方がいらっしゃいましたらご享受ください


コメント(5)

activateではなく、withで対象となるブックを明示的に指定してやればいいと思います。
Application の前にどのブックに対して操作しているのかを明示すればよいのです。


Thisworkbook.Application.DisplayStatusBar = strBarWk


そもそも、VBAは明示的に指定せずともコーディングはある程度できます。
ただし毎回同じ結果を得ることができるかと言えば、Noと言えます。

では、どうやって明示すれば良いかというと、明示できる限り明示すればよいのですよ。
(ただし必要最小限の明示にしたほうが見やすいので、後々楽になる。)

上記の例を明示できる限り明示する場合は、頭にExcelが入ります。

Excel.Thisworkbook.Application.DisplayStatusBar = strBarWk

でも、この場合にExcelは明示せずともThisworkbookだけでも結果が変動することはありません。

一番忘れがちになるのが、RangeとCerlls、Worksheetsあたりでしょうか?
特に、Range(Cells(i,1),Cells(j,2)) と表記する際にRangeには明示してもCellsには明示し忘れる方が多々見受けれます。

これ等を全て明示しないと「100回やって99回以上同一の結果」を得ることはできないでしょう。
Excel2007で実行してみてわかったこと。

(1)オープンしたファイルをactivateしても、
Sheet2.Columns(col).ColumnWidth = 30.25
とオブジェクト名で指定すると、VBAコードが記述されているブックのSheet1やSheet2が参照される(Debug.Print Sheet1.Nameで確認)

(2)Withでブックを明示的に指定する下記の方法
With Workbooks(buf)
.Sheet2.Columns(col).ColumnWidth = 30.25
End With
でも、オブジェクト名でシートを指定するとエラーが発生する(実行時エラー438)
したがってシートを指定する際はインデックスやワークシート名で指定する必要がある。

の2点です。
皆様、ご教授ありがとうございます
いろいろ予定が立てこんでおりまして返信が遅れた次第です
申し訳、ありません

>魔流 さん
詳細説明ありがとうございます
だいぶ分るようになってきました

>Yujinさん
検証までしていただいてありがとうございますました
また、エラーの解決方法も示して頂きありがとうございます

>いなぞーさん
新しい(?)方法を提供していただきありがとうございます
不勉強なもので、まだあまり理解していないので試してみたいと思います

取り急ぎお礼です。
ありがとうございました

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

EXCEL VBA 更新情報

EXCEL VBAのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。