• 締切済み

Excel97・VBA『シートの操作』ついての質問

環境はExcel97+Win2000を使用しています。 基本的に【データ】と【ログ】というシートがあって 動作は データ入力後ボタン押下で結果をログに出力するという内容なのですが、 【ログ】シート作成部分の動作が思うようにいかないので2つ質問させてください。 ''以下ログシート作成部分のVBAソース ' 既存のログシートを削除する '☆↓ Set DS1 = Worksheets("ログ") Application.DisplayAlerts = False DS1.Delete Application.DisplayAlerts = True '☆↑ 'ログシートを作成する Set LS1 = Worksheets.Add(after:=Worksheets("データ")) Sheets("データ").Select'★ LS1.Name = "ログ" 質問1  このソースでは、あらかじめ空の【ログ】シートがないと「☆部分」でエラーになってしまうのですが、 『【ログ】シートが無い時は「☆部分」をパスする』とような関数ってありませんか? 質問2  【ログ】シートを作成しても【データ】シートを表示のままでいて欲しいのですが『Set LS1 =・・・』の部分を実行すると【ログ】シートを表示してしまいます。 今は『★行』を書いて対応しているのですが 画面がちらついてかっこ悪いんです。ですので画面をちらつかせない方法は知りませんか? この2つでもう2週間悩んでいます。。。 助けて下さい。よろしくお願いします。。。

noname#6248
noname#6248

みんなの回答

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.4

> ScreenUpdatingではなくApplication.ScreenUpdatingで解決しました。 ごめんなさい。 > けど、【ログ】シートを消して書いた後は、どうしても【ログ】シートを表示してしまうんですね… > 完了後に=Trueで復旧させたとたん待ってましたとばかりに… マクロをキックするときに選択されているシート名を保存しておいて、 Application.ScreenUpdating=Trueの直前の行で Worksheets(元のシート名).Selectを書くといかがですか?

noname#6248
質問者

補足

>Worksheets(元のシート名).Selectを書くといかがですか? Sheets("データ").Select ですよね… 画面が一瞬ちらつくんですよ。 ですのでこのちらつきをどうにか出来ないかという事です…

回答No.3

シートが無い時の処理ですが エラーコードは分かりませんが エラー処理をしてはどうですか。 「エラーが発生したらAへ」 としてエラー監視を開始。 エラー時は、 エラー(シート削除エラー)なら 処理をして a.次の行から先に進む b.もう一度やり直す c.指定行からすすむ(たしか) のうちひとつを選ぶということができます。 エラー監視スタート On Error GoTo エラー処理名 エラー監視解除 On Error GoTo 0 エラー判断 Select Case Err.Number Case 53 '53 not fonund エラーからの戻り方 Resume Next ちらつきは#1の方に賛成です。 画面更新ストップ ScreenUpdating=False 復旧 ScreenUpdating=True trueで必ず戻してください。 これでも少しちらつくカンジはしますが これしかないですね。

  • mitsu-s
  • ベストアンサー率25% (7/27)
回答No.2

実行時にブックの何番目かにログシートが有る場合の削除 Dim i As Integer For i = 1 To Worksheets.Count If Worksheets(i).Name = "ログ" Then Worksheets(i).Delete Exit For End If Next または、ログシートがある場合必ず最後にあるという場合は If Worksheets(Worksheets.Count).Name = "ログ" Then Worksheets("ログ").Delete End If ログシートの作成 Worksheets.Add after:=Worksheets(Worksheets.Count) Worksheets(Worksheets.Count).Name = "ログ" データシートをアクティブ化 Worksheets("データ").Activate データシート → ログシート → データシートと アクティブになるのがカッコ悪いのであれば処理の最初に ブックを閉じて最後にブックを開くという手は? ブックの最小化 ActiveWindow.WindowState = xlMinimized ブックの最大化 ActiveWindow.WindowState = xlMaximized

noname#6248
質問者

お礼

回答ありがとうございます。 シートが複数なので For i = 1 To Worksheets.Count…を使用しようと思います。 ありがとうございました。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> LS1.Name = "ログ" 最後のシートを指すのだからSheets(Worksheets.Count)で良かったカナ? Sheets(Worksheets.Count)="ログ" 試験してませんので間違ってたらごめんなさい。 > 画面がちらついてかっこ悪いんです。ですので画面をちらつかせない方法は知りませんか? 実行前にScreenUpdating=Falseを設定してください。 一連の処理後にはScreenUpdating=Trueで復旧させてください。 ちらつきは無くなるし、再描画を行わない分処理速度が向上できます。

noname#6248
質問者

お礼

早速の回答ありがとうございます。 ScreenUpdatingではなくApplication.ScreenUpdatingで解決しました。 けど、【ログ】シートを消して書いた後は、どうしても【ログ】シートを表示してしまうんですね… 完了後に=Trueで復旧させたとたん待ってましたとばかりに… もう少し考えてみます…

関連するQ&A

  • Excelマクロについての質問です。

    Excelのマクロについての質問です。 マクロについての質問です。 以下のようなマクロを作成しました。 このマクロを動作させているのはこのマクロを作成したファイル上です。 Sub Macro9() Dim WBA As Workbook Dim WBB As Workbook Dim WSA As Worksheet Dim WSB As Worksheet Set WBA = Workbooks("A") Set WBB = Workbooks("B") Set WSB = WBB.Worksheets("1") For i = 100 To 3000 Step 20 Worksheets.Add Before:=Worksheets("Sheet1") Dim k As String k = i ActiveSheet.Name = (k / 100) Set WSA = WBA.Worksheets(k / 100) WSB.Range("A1:AY30").Copy Destination:=WSA.Range("A1") WSA.Range("D4:I30").Clear WSA.Range("Q4:V30").Clear WSA.Range("AD4:AI30").Clear WSA.Range("AQ4:AV30").Clear Next i Application.DisplayAlerts = False Sheets("Sheet1").Delete Application.DisplayAlerts = True Application.DisplayAlerts = False Sheets("Sheet2").Delete Application.DisplayAlerts = True Application.DisplayAlerts = False Sheets("Sheet3").Delete Application.DisplayAlerts = True End Sub そこで質問ですが、このマクロを作動させると何のエラーの表示もなく最後まで動作は完了します。 ですが、シートの作成は30まで作成できてもその後のセルのコピー&ペーストはなぜかシート6.8までしかできていません(7~30までのシートはシート作成はできているのですがコピペのみが実行されず空白のままになっています。) シートもコピペも両方ともシート30まで完了するにはどの点を改善すればいいのでしょうか? 知恵が足りずどうしても直す事が出来ません。 長文申し訳ございませんが是非皆さまのお知恵をお貸しください。 宜しくお願い致します。

  • エクセルVBAが途中で止まります

    以前別のカテゴリで質問したのですが、そちらでは解決出来なかったので、こちらで改めて質問します。 下記のマクロで、一つのブックからSheet1だけをコピーして来て、少し処理をし、元のブックを閉じるというもので、ブックの数は多くて3000程、少ない時は300位です。 で、このマクロだと900位までですと最後まで行くのですが、それを超えるとリストが95位で止まってしまいます。 自宅で別データを作ってやってみるとうまくいきました。 コピー元のブックにはテキストデータのみで、200文字から500文字程度の大きさしかありません。 ファイル名も50文字程度の物を全部20文字程度まで短くしてもみましたが、ダメでした。 どうかお知恵をお貸しください。 Sub ★1★ブックの結合() Dim sFile As String Dim sWB As Workbook, dWB As Workbook, aWB As Workbook Dim dSheetCount As Long Dim i As Long Dim SOURCE_DIR As String 'エクセルデータに変換されたファイルのあるフォルダを選択します。 MsgBox "エクセルに変換されたデータのフォルダを選択" With Application.FileDialog(msoFileDialogFolderPicker) If .Show = True Then SOURCE_DIR = .SelectedItems(1) & "\" End If End With Application.ScreenUpdating = False '指定したフォルダ内にあるブックのファイル名を取得 sFile = Dir(SOURCE_DIR & "*.xls") 'フォルダ内にブックが無ければ終了 If sFile = "" Then Exit Sub '集約用ブックを作成 Set dWB = Workbooks.Add '転記マクロの中のDMリストシートをコピーする Workbooks("転記用マクロ.xlsm").Worksheets("DMリスト").Copy Before:=dWB.Worksheets("Sheet1") Application.DisplayAlerts = False Worksheets(Array("Sheet1", "sheet2", "sheet3")).Select ActiveWindow.SelectedSheets.Delete Application.DisplayAlerts = True '集約用ブック作成時のシート数を取得 dSheetCount = dWB.Worksheets.Count Do 'コピー元のブックを開く Set sWB = Workbooks.Open(Filename:=SOURCE_DIR & sFile) 'コピー元のsheet1を集約用ブックにコピー sWB.Worksheets("sheet1").Copy After:=dWB.Worksheets(dWB.Sheets.Count) シート転記 'コピー元ファイルを閉じる Application.DisplayAlerts = False sWB.Close Application.DisplayAlerts = True 'セルA2の名前を変更する 'シート名をセルA2の値に変更 'ActiveSheet.Name = Range("A2").Value '次のブックのファイル名を取得 sFile = Dir() Loop While sFile <> "" '集約用ブックを保存する 'dWB.SaveAs Filename:=DEST_FILE Application.ScreenUpdating = False End Sub

  • VBAで複数シートをまとめたい

    VBAを作るのは今回が初めてで行き詰ってしまいました。 フォルダ内の「.xlsx」4つのファイルのSheet1(4つともSheet1です) を統合.xLsmの1月シートのb2~値でコーピー貼り付けを行いたいのですが、 下記のものでやっていけば出来のかなと思ってますが、ご教授お願い致します。 Private Sub CommandButton1_Click() Dim sFile As String Dim sWB As Workbook, dWB As Workbook Dim dSheetCount As Long Dim i As Long Dim c As Long Dim ws As Worksheet Debug.Print (ws.Index) Const SOURCE_DIR As String = "C:\Users\KWEUSER\Desktop\data\" Application.ScreenUpdating = False '指定したフォルダ内にあるブックのファイル名を取得 For c = 1 To 4 sFile = Dir(SOURCE_DIR & "*.xlsx") 'フォルダ内にブックがなければ終了 If sFile = "" Then Exit Sub '集約用ブックを作成 Set dWB = Workbooks.Add '集約用ブック作成時のシート数を取得 dSheetCount = dWB.Worksheets.Count Do 'コピー元のブックを開く Set sWB = Workbooks.Open(Filename:=SOURCE_DIR & sFile) 'コピー元の c (1,2,3,4,5)シートを集約用ブックにコピー sWB.Worksheets(c).Copy After:=dWB.Worksheets(dSheetCount) 'シート名をファイル名に ActiveSheet.Name = sFile 'コピー元ファイルを閉じる sWB.Close '次のブックのファイル名を取得 sFile = Dir() Loop While sFile <> "" '集約用ブック作成時にあったシートを削除 Application.DisplayAlerts = False For i = dSheetCount To 1 Step -1 dWB.Worksheets(i).Delete Next i Application.DisplayAlerts = True '集約用ブックを保存して閉じる dWB.SaveAs Filename:="C:\Users\KWEUSER\Desktop\data\" & c & ".xlsx" dWB.Close Next Application.ScreenUpdating = False End Sub

  • エクセルVBA 1つのシートで出来ますか?

    説明が下手で申し訳ございませんが、宜しくお願い致します。 sheet(1)に20個のボタンがあります。 ボタンをクリックすると、別のシートが開きます。 開いたシートにも複数のボタンがあり、そのうちの任意のボタンをクリックすると、そのボタンの値がsheet(1)のそれぞれのボタンに対応したセルに入力される、という動作を実現したいと思っています。 現状、下記のようなコードで目的の動作は実現できてはいるのですが、各ボタンそれぞれにシートを作っているような状況です。(データ自体は全く同じ内容のものが、計20シート) たぶん、もの凄く頭の悪い事をやっているんだろうと思います。 sheet(1)を除いた各シートの入力データ自体は全く同じなので、シート一枚で出来るんじゃないのかなと思い、ネットや本で調べながら色々試してみたのですが、どうも上手く行きません。データが同じでも、sheet(1)のクリックしたボタンによって入力するセルを変えなければならないのが問題です。 sheet(1)のボタンとセルの関連付けや、sheet(1)のどのボタンを押したのかの判別ができればいいのかなと思って調べてみても、初心者にはよく理解できず、もう何週間もチャレンジしているのですがお手上げです。 上級者の方の知恵をお借りできれば幸いです。 Sub sheet2を開く() Worksheets(2).Select End Sub Sub 入力1() Worksheets(1).Range("F8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("F8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("F8") = "データ3" Worksheets(1).Select End Sub Sub sheet3を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("H8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("H8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("H8") = "データ3" Worksheets(1).Select End Sub Sub sheet4を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("M8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("M8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("M8") = "データ3" Worksheets(1).Select End Sub    ・    ・    ・    ・    ・

  • エクセル2003 シートを保護するとマクロエラー

    sub macro1()  worksheets("Sheet2").copy before:=worksheets(1)  with worksheets(1)   .range("D4:BH14").interior.colorindex = xlnone   .range("D16:BH21").interior.colorindex = xlnone   .printout  end with  application.displayalerts = false  worksheets(1).delete  application.displayalerts = true end sub 以前に、こちらの質問で回答をいただきました。 会社のプリンターは古すぎなのですが、 見事!なんとか、会社のプリンターでできました。 入力されたくないセルもあり、シートを保護しました。 すると、マクロにエラーがかかりました。 なるべく、触られたくないセルがあったり、データを入力してほしいデータもあり… セルの保護をかけながら、マクロを有効に動かしたく思います。 よろしくお願いします。

  • EXCELのシートを並べ替えすると・・・

    エクセルのシートを並べ替えようと思って こちらで調べてようやく並べ替えができるようになったのですが、幾つかあるデータの中で実行するとエラーが出るものがあります。 シートの名前は1日~31日&集計という構成なのですが、下記を実行すると実行エラー9:インデックスが有効範囲にありません!とでます…デバックを押すと Worksheets(CStr(Wwh.Cells(N, 1).Value)).Move After:=Sheets(N) のところが黄色になっています。 同じようなシートの構成があるデータで試してみると成功するものと失敗するものがありもう何がなにやら(;´Д`) 何か変更しないとだめなんでしょうか? 分かる人がいたらアドバイスお願いします。 Sub SortSheets() Dim Wwh As Worksheet Dim N As Integer Application.ScreenUpdating = False Sheets.Add Before:=Worksheets(1) Set Wwh = ActiveSheet For N = 2 To Worksheets.Count   Cells(N - 1, 1).Value = Worksheets(N).Name   Cells(N - 1, 2).Value = _   Application.GetPhonetic(Worksheets(N).Name) Next N Range("A1").CurrentRegion.Sort Key1:=Range("B1"), _   Order1:=xlAscending, Header:=xlNo, OrderCustom:=1 '昇順 'Range("A1").CurrentRegion.Sort Key1:=Range("B1"), _   Order1:=xlDescending, Header:=xlNo, OrderCustom:=1 '降順 For N = 1 To Range("A1").End(xlDown).Row   Worksheets(CStr(Wwh.Cells(N, 1).Value)).Move After:=Sheets(N) Next N For N = 2 To Worksheets.Count   If Worksheets(N).Visible = xlSheetVisible Then     Worksheets(N).Activate     Exit For   End If Next N Application.DisplayAlerts = False Wwh.Delete Application.DisplayAlerts = True Application.ScreenUpdating = True Set Wwh = Nothing End Sub

  • Excelマクロにてシートの削除を行いたいです。

    初めて投稿させて頂きます。 質問内容  Excelのマクロを使用して指定シート以外のシートの削除を行いたいです。 前条件  外部CSVファイルを取込み、データによってシートを追加して振り分けています。  再度マクロを実行した場合特定のシートを残し(フォーマット等)、他のシートを削除してからデータの振り分けを実施する予定です。 やってみた事  下記の様に書いて実施してみたのですがエラーとなってしまいます。 Sub Clear()   Application.DisplayAlerts = False   For I = 1 To Worksheets.Count     If (Worksheets(I).Name <> "sheet") Then       Sheets(Worksheets(I).Name).Select       ActiveWindow.SelectedSheets.Delete     End If   Next I   Application.DisplayAlerts = True End Sub 上記の書き方だと1シート毎削除なので、選択したシートを一括で削除出来るとうれしいです。 どなたかご存知の方お願いします。

  • EXCELの変数を使用したシート削除マクロについて

    ご教示お願いします。。。 シートAのセルA1に”1111”と入力します。 シート追加マクロを作成し、1111というシートを追加することまではできましたが、 今度はシート削除マクロを作成し、同じく、”1111”のシートを削除しようと思います。 セルA1は都度変わるので、変数を指定し、その変数を使用して削除マクロを作成。 <既に1111シートはあるものと仮定します。> X = Range("A1") '---(1)XにA1セルに入力された数値をセット(1111がセットされる) Application.DisplayAlerts = False '---(2)(削除)確認メッセージをOFF Worksheets(X).Select        '---(3)ワークシートX(X=1111)を選択 ActiveSheet.Delete        '---(4)選択したワークシートを削除 Application.DisplayAlerts = True '---(5)(削除)確認メッセージをONに戻す。 Worksheets("Sheet1").Select    '---(6)ワークシートSheet1を選択して終わり。 上記のマクロを作成し実行すると、(3)で【実行時エラー’9’:インデックスが有効範囲にありません。】 のエラーメッセージがでます。 変数を使用せずに、直接[Worksheets("1111").Select]を明記すると問題なく通ります。 意味が分からず・・・。 変数の指定方法に間違いがあるのでしょうか? お詳しい方がいらっしゃいましたら、ご教示の程よろしくお願いします。。。

  • ACCESSのVBAにてExcelのシートをコピーしたい

    入庫.xlsに現在、"原紙"というシートがあります。 入庫.xlsには、"原紙"と入庫のあった日のシートがあるようにしたいのです。 今日、入庫があれば、入庫.xlsには "原紙"と"20"のシートが存在するようにしたいのです。 AccessのVBAにて1文でシートのコピーってできないでしょうか? Dim oApp As Object Dim StWk1 As String Dim SHizk As String Dim Hizk As Integer Hizk = DatePart("d", Me![入庫日付]) SHizk = CStr(Hizk) StWk1 = "c:入庫.xls" Set Xls = GetObject(StWk1) Xls.Application.Windows(1).Visible = True Xls.Application.worksheets("原紙").Copy After:=Xls.Application.worksheets(SHizk) Xls.Application.worksheets(SHizk).Activate 上記のように作成してみたのですが、実行すると、 Xls.Application.worksheets("原紙").Copy After:=Xls.Application.worksheets(SHizk) のところで、エラーになります。 実行エラー'9': インデックスが有効範囲にありません。 のメッセージが表示されます。 教えてください。

  • エクセルvba アクティブシート以外の範囲指定

    現在エクセルのVBAを勉強中(かなり初心者ですが。。)で、仕事でも使う封筒印刷用のマクロを組んでみようと思っています。 作成したユーザーフォーム内のリストボックスに、宛名一覧を入力したワークシートからデータを引っ張ってきて表示しようと思っているのですが、宛名一覧を記述しているシートがアクティブの際にはうまく動作するのですが、その他のシート(封筒のレイアウトを書き込んでいるシートなど)がアクティブの時には 実行時エラー'1004' アプリケーション定義まてはオブジェクト定義のエラーです。 というエラーが表示され、うまく行きません。 うまく行く方法をご教授いただけたらと思います。よろしくお願いいたします。 ソース(標準モジュールに記述) Sub adrsList() UserForm1.ListBox1.List = Worksheets("address").Range(Cells(Worksheets("address").UsedRange.Rows.Count, 8)).Value UserForm1.Show End Sub ※address:住所録のデータがH列に格納されているワークシートです

専門家に質問してみよう