変奏現実

パソコンやMMORPGのことなどを思いつくまま・・・記載されている会社名・製品名・システム名などは、各社の商標、または登録商標です。

この画面は、簡易表示です

Excel

EXCELをデバッグしますか?

とあるトコで
古いバージョンのEXCELのVBAで
セルをダブルクリックし、Application.FileDialogでファイル選択モードでダイアログを出して選らんだファイル名をセルに文字を書いてみた。
実はフォルダ名まで良かったので、フォルダ選択ダイアログにモードを変えてみると
EXCELがエラった。
VisualStudioがインストしてあったので
デバッグしますか?と出てきた。
はいを選択すると
Excel.sln の出来上がり。
でもEXEのPDBファイルは持っていないのでそこまで。
いや、そうじゃなくてVBAのせいでEXCELが落ちるってのが困るんだが・・・(大笑
他のPCで動かすとEXCEL君は健在。
ぐぐってみても、それらしい情報も無い。どうやら特定のPCのみの現象らしい。
さらにググってるうちにセルをダブルクリックするとテキストの編集モードになることを思い出した。
これが貧層なパワーしかないソコのPCには途方も無いくらい負担らしい、PC起動時にすぐEXCELを立ち上げテキスト入力をかな漢変換モードで行うと、1分ぐらいは帰ってこないので、起動後10分はアイドリングしている。
そこで古いMS-Officeのカスタマー エクスペリエンス向上プログラムをOFFって再起動した。
※自宅のPCでも、タスクスケジューラにMicrosoft⇒Windows⇒Customer Experience Improvement Programが存在し、状態は準備完了、次回の実行は2017/03/03 0:00:00、前回の実行時刻は2017/03/02 19:40:39 となっているので、今のMS-OFFICEでも機能している様なので、試しにEXCELのオプションのセキュリティセンターのプライバーオプションの2つ目のチェックボックスをOFFってみた。
確かに軽くなったもののやはりEXCEL君はダウンしてしまう。
諦めてVBAのソースを修正。
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
重い処理
Cancel = True
End Sub
※MS-OFFICE 365の場合、古いEXCELではテンプレが若干違ってた気がする。
やっと非力なPCでも乗り切れるようになった。
つまり、非力PCには負担な内容のVBAマクロの直後にセルの編集モードに遷移するのはとても危険であることが判った。
試しに自宅のPCとMS-OFFICE365では、やはり再現しなかった。
新しいCPUの新しいPCと新しいEXCELを買えば何もせずとも解決できるってことだね。(大笑
状況終了。



【EXCEL】 セキュリティ警告を消す方法

ファイルサーバのEXCELファイルを開くと セキュリティ警告 のバーが出る。
しかし、このバーを閉じ保存しても、開くとまた出てくる。
なので、ファイルのある場所を「信頼できる場所」に登録しなければならないらしい。

EXCELから セキュリティ警告を消す方法

  1. ファイル⇒オプション
  2. 左のセキュリティセンター
  3. 右の【セキュリティセンター】ボタン
  4. 「信頼できる場所」を押す
  5. 下の「プライベート ネットワーク上にある信頼でいる場所を許可する」にチェックを入れる
  6. 【新しい場所の追加】ボタン⇒セキュリティ警告を表示したくないEXCELファイルのおいてある場所を入力
  7. 【OK】ボタンを押して保存

当然サブフォルダも含める様にした方がいい。



[EXCEL]ヘッダーとフッター

フッターに会社名を入れることが多い。
しかもシート数が半端なかったりすることも多いので・・・
EXCELのマクロ記録モードでヘッダー等をイジると

    With ActiveSheet.PageSetup
        .LeftHeader = "ヘッダー左"
        .CenterHeader = "ヘッダー中央"
        .RightHeader = "ヘッダー上"
        .LeftFooter = "フッター左"
        .CenterFooter = "フッター中央"
        .RightFooter = "フッター右"
        .LeftMargin = Application.InchesToPoints(0.7)
        .RightMargin = Application.InchesToPoints(0.7)
        .TopMargin = Application.InchesToPoints(0.75)
        .BottomMargin = Application.InchesToPoints(0.75)
        .HeaderMargin = Application.InchesToPoints(0.3)
        .FooterMargin = Application.InchesToPoints(0.3)
        .Zoom = 100
        .PrintErrors = xlPrintErrorsDisplayed
        .OddAndEvenPagesHeaderFooter = False
        .DifferentFirstPageHeaderFooter = False
        .ScaleWithDocHeaderFooter = True
        .AlignMarginsHeaderFooter = True
        .EvenPage.LeftHeader.Text = ""
        .EvenPage.CenterHeader.Text = ""
        .EvenPage.RightHeader.Text = ""
        .EvenPage.LeftFooter.Text = ""
        .EvenPage.CenterFooter.Text = ""
        .EvenPage.RightFooter.Text = ""
        .FirstPage.LeftHeader.Text = ""
        .FirstPage.CenterHeader.Text = ""
        .FirstPage.RightHeader.Text = ""
        .FirstPage.LeftFooter.Text = ""
        .FirstPage.CenterFooter.Text = ""
        .FirstPage.RightFooter.Text = ""
    End With

と 書き出してくれるので
シートを替えながら、このマクロを実行すればいい。
しかしブックの数も半端ないなら・・・
またBATの出番だ。
CScriptで実行するブートストラップは省略

  var EXCEL = WScript.CreateObject("EXCEL.Application");
  var SHELL = WScript.CreateObject("WScript.Shell");
  var FS    = WScript.CreateObject("Scripting.FileSystemObject");
  //カレントフォルダのファイルを列挙する
  echo(SHELL.CurrentDirectory);
  var folder = FS.GetFolder( SHELL.CurrentDirectory );
  var em = new Enumerator( folder.Files );
  //順にループ
  for( em.moveFirst(); !em.atEnd(); em.moveNext() ) {
    //EXCELっぽいファイルだけ処理
    if(em.item().Name.indexOf(".xls")>0) {
      //ファイルをEXCELで開く
      var book = EXCEL.Workbooks.Open(em.item().Name);
      try {
        echo(book.name +": "+book.Worksheets.Count+" sheets");
        EXCEL.DisplayAlerts = false;
        //
        var saveFlag=false;
        //1シートづつループ
        for(var i = 1; i<=book.Worksheets.Count; i++) { var sheet = book.Worksheets(i) //白紙は何もしない様にする if(sheet.UsedRange.Count>0) {
            echo(" "+sheet.name +":"+sheet.UsedRange.Count+" セル");
            var hdrText = em.item().Name + ":" + sheet.name;
            //ヘッダーを調整済みならヘッダーを調整しない
            if(sheet.PageSetup.LeftHeader.indexOf(hdrText)<0) {
              sheet.PageSetup.LeftHeader  = hdrText + " "+ "\n" + sheet.PageSetup.LeftHeader;
              // 改行を入れてあるので1行分ぐらい高くする
              sheet.PageSetup.TopMargin += 12;
            }
            //フッターに会社名を入れる
            sheet.PageSetup.RightFooter = "株式会社 *****";
            saveFlag=true;
          }
        }
        // ヘッダーやフッターを調整した時だけ保存
        if(saveFlag) {
          book.Save();
          echo(book.name +" Saved");
        }
      } catch(e){
        var i, ary = [];
        ary.push("number:"+e.number.toString(16));
        for (i in e) { ary.push(i + ":" + e[i]); }
        echo("例外処理:" + ary.join(", "));
      } finally {
        // ブックを確実に閉じる
        if (book != null){
          book.Close(false);
        }
      }
    }
  }
  EXCEL = null;
  SHELL = null;
  FS    = null;

微妙なのは、ヘッダーの高さ、改行を入れているので、少し嵩上げしている

sheet.PageSetup.TopMargin += 12;

こんなコードをEXCELブックのフォルダにぺーストしてダブルクリックするだけで
EXCELの資料の全シートにプロジェクト名とか会社名を入れるとか・・・実にくだらない仕事がサクっと進む。
注意点はネットドライブを割り当てておかないと、BAT系は全滅。




top