honjarake blog

自分用にテキトーにまとめる

自分用 OFFICE2007以降 VBA FileSearchについて

pocket9 ドキュメント支援ツール
機能一覧 | 設計書仕様書テンプレート PocketDOC | 株式会社イーイノベーション
の「PocketDocPropertyChangeTool」を利用しようとしてFileSearchでエラーが出た。
調べてみると、Application.FileSearchの構文がOFFICE2007以降で使えなくなっているとの事。

FileSearchをScripting.FileSystemObjectのFileSearchに入れ替えれば動くようなので
クラス化している下記のサイト
Office2007以降廃止となった「FileSearch」の代替クラスを作る - xixiixiiixivの勉強日記
を見つけてそのまま置き換えてみた。
※上記ソースコードをVBEでクラスモジュールとして貼付し、FileSearchClassという名前で保存。

PocketDocPropertyChangeTool側の記述を変更していく。

<shtMain>
[Private Sub cmdAction_Click]
 ' ファイル検索の開始
'   With Application.FileSearch
    With New FileSearchClass

おまけでBrowseForFolderに初期値表示のフォルダを設定

<shtMain>
[Private Sub cmdAction_Click]
 CreateObject("Shell.Application").BrowseForFolder(0, "フォルダを選択してください", &H1 + &H10, vDefFolder)

上記のvDefFolderの部分の引数はVariant型でないと初期値として反映されず少し詰まった。(ずっとString型で指定していた)

ここまでの修正を実行するとFileSearchClassにFileTypeのプロパティがなくてエラーが発生。

<shtMain>
[Private Sub cmdAction_Click]
.FileType = msoFileTypeAllFiles

消してもいいけど、後で処理を追加してみようと思い、クラスにダミーのFileTypeを追加。

端末毎に参照設定いじるのめんどそうだなと思い
FileSearchClass側の fso関連の変数を全部Objectに変更して
new FileSystemObject してるところを CreateObject("Scripting.FileSystemObject") に置き換えた。
FileTypeはmsoFileTypeが使えればそのまま使うが、下記のようにした。

<FileSearchClass>
Public Enum enumFileType
  msoFileTypeAllFiles = 1
  msoFileTypeBinders = 6
  msoFileTypeCalendarItem = 11
  msoFileTypeContactItem = 12
  msoFileTypeDatabases = 7
  msoFileTypeDataConnectionFiles = 17
  msoFileTypeDesignerFiles = 22
  msoFileTypeDocumentImagingFiles = 20
  msoFileTypeExcelWorkbooks = 4
  msoFileTypeJournalItem = 14
  msoFileTypeMailItem = 10
  msoFileTypeNoteItem = 13
  msoFileTypeOfficeFiles = 2
  msoFileTypeOutlookItems = 9
  msoFileTypePhotoDrawFiles = 16
  msoFileTypePowerPointPresentations = 5
  msoFileTypeProjectFiles = 19
  msoFileTypePublisherFiles = 18
  msoFileTypeTaskItem = 15
  msoFileTypeTemplates = 8
  msoFileTypeVisioFiles = 21
  msoFileTypeWebPages = 23
  msoFileTypeWordDocuments = 3
  msoLastModifiedAnyTime = 7
  msoLastModifiedLastMonth = 5
  msoLastModifiedLastWeek = 3
  msoLastModifiedThisMonth = 6
  msoLastModifiedThisWeek = 4
  msoLastModifiedToday = 2
  msoLastModifiedYesterday = 1
End Enum

FileSearchClass の方に下記を追加

<FileSearchClass>
Public FileType As enumFileType

shtMainも変更

<shtMain>
[Private Sub cmdAction_Click]
' .FileType = msoFileTypeAllFiles     '検索対象ファイルのタイプを設定
  .FileType = enumFileType.msoFileTypeAllFiles

また、ここまでの修正で

<shtMain>
[Private Sub cmdAction_Click]
.FileName = "*.xls;*.doc;"

の複数拡張子指定で、一切一致するファイルを見つけられなかった。
Likeでも書き方次第で判定できそうだが、正規表現でのマッチングに変更した。

FileSerchClassに下記を追加

<FileSearchClass>
'正規表現マッチング
Private Function ExtRegExp(ByVal Target As String, ByVal FileExt As String) As Boolean
  'RegExpオブジェクトの作成
  Dim reg As Object
  Set reg = CreateObject("VBScript.RegExp")
  
  Dim sPtn As String
  
  'パターン作成
  sPtn = Replace(FileExt, " ", "")
  sPtn = Replace(sPtn, "*.", "")
  sPtn = Replace(sPtn, ";", "|")
  sPtn = IIf(sPtn Like "*|", Left(sPtn, Len(sPtn) - 1), sPtn) '末尾条件整理
  sPtn = ".+\.(" & sPtn & ")"                                 '「*.(拡張子1[|拡張子2]...)」に成形
  
  '正規表現の指定
  With reg
      .Pattern = sPtn     'パターンを指定
      .IgnoreCase = True  '大文字と小文字を区別するか(False)、しないか(True)
      .Global = True      '文字列全体を検索するか(True)、しないか(False)
  End With

  ExtRegExp = (reg.Execute(Target).Count > 0)

End Function

Likeで拡張子の判定している箇所をExtRegExpに置換

<FileSearchClass>
[Private Sub runSearch(sArgSearchPath As String)]
' If Not (oFile.Name Like FileName) Then GoTo CONTINUE ' 処理対象外を除外
 If Not ExtRegExp(oFile.Name, FileName) Then GoTo CONTINUE  ' 処理対象外を除外

これで大体動くようになった。

自分用 サーバーイベントログ解決 Perflib 1008

1008 エラー Microsoft-Windows-Perflib Application

サービス "BITS" のエラー

サービス "BITS" (DLL "C:\Windows\System32\bitsperf.dll") の Open プロシージャに失敗しました。このサービスのパフォーマンス データは利用できません。データ セクションの最初の 4 バイト (DWORD) に、エラー コードが含まれています。

qiita.com

サービス"RemoteAccess" のエラー

サービス "RemoteAccess" (DLL "C:\Windows\System32\rasctrs.dll") の Open プロシージャに失敗しました。このサービスのパフォーマンス データは利用できません。データ セクションの最初の 4 バイト (DWORD) に、エラー コードが含まれています。

あるIT技術者の障害(じゃなくて生涯)対応 : 今日のトピック
少し古い?
訂正
Remote Access | ソフトウェアブログ
RemoteAccessはrasctrs.iniがパフォーマンスカウンタに使用する.iniファイル名
C:\Windows\WinSxS\amd64_microsoft-windows-rasctrs.resources_31bf3856ad364e35_6.3.9600.16384_ja-jp_dfbd247b6f4cfb4bにある模様
引き続き実施する

Windows10 Access 2013以降の環境での円マーク→バックスラッシュ化について

現象の原因がAccessバージョンなのか、OSバージョンなのかハッキリしないがメモ

現象:

WINDOWS10 , ACCESS2013 , ACCESS2016 にて、今まで使用していた額面表示のテキストの「¥」が「\」になる。
(打つのがめんどくさいので、「¥」と「\」はいずれも半角と見なす)

原因:

額面表示用の文字のフォントが「欧文フォント」だったから。
(新環境では)欧文フォントは今までの「¥」のコード(0x5C)に対して「\」が割り振られるようになっている模様。
#この仕様がUnicode本来の仕様らしい

対処:

日本語フォントにすれば従来どおりの「¥」が表示された。
ただし、額面の「0」には斜線が入っていて欲しいので日本語フォントには
IPA情報処理推進機構)のフリーフォントIPAゴシック」を導入した。
#ちなみに「IPAex~フォント」は自分の環境では「0」に斜線が入っていない

結論:

円マークがバックスラッシュになるのは「欧文フォント」が原因。
でも、Windows 7 環境では「¥」がちゃんと出ているのでOSバージョンも関係あるんだろうと思う。
#Windows8は確認していないので知らない

自分用 VectorDirectDLのリンクをファイルの直リンクに差し替えるやつ

変更元は
VectorDirectDL
二重にajaxでGETすることになる事と、テストを一個のページでしかしていない事に注意
重大なミス:複数バージョン存在するときの直リンクに不備有り 要修正

// ==UserScript==
// @name        VectorDirectDL
// @description Vectorのページにダウンロードボタンを追加する
// @version     2.0
// @namespace   phodra
// @include     http://www.vector.co.jp/soft/*
// @exsample    http://www.vector.co.jp/soft/dl/win95/util/se169348.html
// @exsample    http://www.vector.co.jp/soft/dl/winnt/util/se100730.html
// @original    https://greasyfork.org/ja/scripts/7501-vectordirectdl
// ==/UserScript==
/* add //↓ファイル直リンクに入れ替え ~ //↑ファイル直リンクに入れ替え */
(function () {
  // リンクを追加する関数
  var AppendLink = function (page)
  {
    var $page = $(page);
    // 挿入箇所
    $inspos = $('h1');
    // ダウンロードボタンと名前を取得
    $btns = $page.find('a.btn.download');
    $names = $page.find('td>strong.fn');
    if ($names.size() == $btns.size())
    {
      for (i = 0; i < $btns.size(); i++)
      {
        // ダウンローページヘのダイレクトリンクを作成
        var $link = $('<a class=\'downloadlink\'/>');
        $link.text($names.eq(i).text());
        $link.attr('href', $btns.eq(i).attr('href'));
        //↓ファイル直リンクに入れ替え
        $.ajax({
          type: 'GET',
          url: $btns.eq(i).attr('href'),
          success: function (data) {
            var $data = $(data);
            $elm = $data.find('#summary a');
            if ($elm.size() > 0)
            {
              //alert($elm[0]);
              $link.attr('href', $elm[0]);
            }
          }
        });
        //↑ファイル直リンクに入れ替え
        // ソフト名の下に挿入
        $inspos.after($link);
        $inspos.after(' ');
      }
    }
  };
  // ダウンロードタブのエレメント
  var $dltab = $('#v_step>.download');
  if ($dltab.size() > 0)
  {
    // ダウンロードタブページを取得
    $.ajax({
      type: 'GET',
      url: $dltab.attr('href'),
      beforeSend: function (xhr) {
        xhr.overrideMimeType('text/html; charset=Shift_JIS');
      },
      success: function (data) {
        AppendLink(data);
      }
    });
  } 
  else
  {
    // すでにダウンロードタブページの場合
    AppendLink(document);
  }
}) ();

自分用 select option を使った検索ボックス他

greasemonkey 自分用ソースコードまとめ2 - honjarake blog

// ==UserScript==
// @name            test item
// @namespace       http://espion.just-size.jp/archives/05/136155838.html
// @description     code test
// @grant           none
// @include         *
// @exclude         https://apis.google.com/*
// ==/UserScript==
window.load = (function () {
  //----------------------------------------
  //console.log('test item 1 start');
  //----------------------------------------
  if (window != parent) {
    //iframeで埋めこまれた場合の処理
    return;
  }
  var ElemDiv = document.createElement('div');
  //var Docbody = document.body;
  var Docbody = document.getElementsByTagName('body') [0];
  var t_code;
  //===============================================
  var m_div = ElemDiv.cloneNode(true);
  m_div.id = 'm_div';
  Docbody.insertBefore(m_div, Docbody.firstChild);
  t_code = '';
  t_code += '<ul>';
  //t_code += '     <li><label id="lbB">youtube:</label><input type="text" id="tbB"></input><input type="button" id ="bB"></input>';
  t_code += '     <li><label id="lbc">google</label><input type="text" id="tbC"></input><input type="button" id ="bC"></input>';
  t_code += '     <li><select id="sel_s"></select><input type="text" id="tb_sels"></input><input type="button" id="b_sels"></input>';
  t_code += '</ul>';
  //----------------------------------------
  m_div.innerHTML += t_code;
  //----------------------------------------
  var m_list = m_div.getElementsByTagName('li');
  //--------------------------------------------------------------
  var styleTag = document.createElement('style');
  styleTag.type = 'text/css';
  //----------------------------------------
  t_code = '';
  t_code += '#m_div{ position: fixed; z-index: 999; top:300px; width:205px; left:-200px; text-align:left; padding:1px; background: #FFF8DC; font-size:10px;}' + '\n';
  t_code += '#m_div:hover{ position: fixed; z-index: 999; top:300px; left:0px; padding:1px; background: #dedeff; }' + '\n';
  t_code += '#m_div input[type="text"]{ width:100px !important; margin:2px 2px 5px 5px; }' + '\n';
  //----------------------------------------
  var t_node = document.createTextNode(t_code);
  styleTag.appendChild(t_node);
  //----------------------------------------
  var headerTag = document.getElementsByTagName('head') [0];
  if (!headerTag) alert('header is nothing');
  headerTag.appendChild(styleTag);
  //----------------------------------------
  //console.log('test item 1 end');
  //----------------------------------------
  /*
  var bB = document.getElementById('bB');
  bB.value = 'repeat';
  bB.onclick = function () {
    var tbB = document.getElementById('tbB');
    var re = /http.*:\/\/www.youtube.*\/watch/;
    var found = location.href.match(re);
    if (found) {
      tbB.value = location.href.replace('youtube', 'youtuberepeat');
      document.location = tbB.value;
    } else {
      tbB.value = 'not youtube video';
    }
  }
  */
  var bc = document.getElementById('bC');
  bc.value = 'search';
  bc.onclick = function () {
    var tbc = document.getElementById('tbC');
    if (tbc.value != '') {
      window.open('https://www.google.co.jp/search?q=site:' + document.location.hostname + ' ' + tbC.value);
    }
  };
  // 汎用focus-blur -------------------------
  function tbonfocus() {
    var b = document.getElementById('m_div');
    b.style.left = 0;
  };
  function tbonblur() {
    var b = document.getElementById('m_div');
    if (b.style.removeProperty) {
      b.style.removeProperty('left');
    }
    if (b.style.removeAttribute) {
      b.style.removeAttribute('left');
    }
  };
  // ----------------------------------------
  var tbc = document.getElementById('tbC');
  tbc.onfocus = tbonfocus;
  tbc.onblur = tbonblur;
  // select
  // <select id="sel_s"></select>
  // <input type="text" id="tb_sels"></input>
  // <input type="button" id="b_sels"></input>
  var url = {
    monst: 'http://モンスターストライク.gamewith.jp/search/results?query=',
    twitter: 'http://t-proj.com/twitter/?q=',
  };
  var sels = document.getElementById('sel_s');
  var elopt = document.createElement('option');
  for (key in url) {
    //alert(key + ' : ' + url[key]);
    var opt = elopt.cloneNode();
    opt.id = 'sel_' + key;
    opt.innerHTML = key;
    opt.setAttribute('value', key);
    sels.appendChild(opt);
  }
  var bsels = document.getElementById('b_sels');
  var tbsel = document.getElementById('tb_sels');
  bsels.value = '探す';
  bsels.onclick = function () {
    var tbsel = document.getElementById('tb_sels');
    if (tbsel.value != '') {
      var strSelect = sels.options[sels.selectedIndex].text;
      //alert(url[strSelect]);
      window.open(url[strSelect] + tbsel.value);
    }
  };
  tbsel.onfocus = tbonfocus;
  tbsel.onblur = tbonblur;
  sels.onfocus = tbonfocus;
  sels.onblur = tbonblur;
  if (document.addEventListener) {
    // キーボードを押したときに実行されるイベント
    document.addEventListener('keydown', function (e) {
      var keyID = (e.keyCode)? e.keyCode: e.charCode;
      if (document.activeElement.id == 'tb_sels') {
        if (keyID == 13) {
          bsels.onclick();
        }
      }
    });
  }
  // ----------------------------------------

}) ();

リンクを(略)別窓で開くやつの自分用修正版

リンクをすっきりした別窓で開くやつ グリモン - honjarake blog

// ==UserScript==
// @name        リンクをすっきりした別窓で開くやつ
// @namespace   http://honjarake.hatenablog.jp/
// @include     http://comic-walker.com/contents/detail/*
// @include     http://seiga.nicovideo.jp/my/manga/favorite
// @include     http://www.alphapolis.co.jp/manga/viewOpening/*
// @include     http://www.mangaz.com/book/*
// @include     http://tonarinoyj.jp/manga/*
// @version     0.0.1
// @grant       none
// ==/UserScript==
$("a[href*='/view'], a[href*='/watch'], a[href*='/navi'], a[href*='viewer']").click(function (e) {
    e.preventDefault();
    window.open($(this).attr('href'), 'comic_viewer', 'fullscreen=1, menubar=no, toolbar=no, scrollbars=yes');
});

自分用 ニコニコ動画 ユーザーIDで動画探すリンク(ニコチャートURL変換)

// ==UserScript==
// @name        nico user video search link
// @namespace   us0305
// @include     http://www.nicovideo.jp/user/*
// @version     0.0.0.1
// @grant       none
// ==/UserScript==
(function () {
  var patURI = 'nicovideo';
  var repURI = 'nicochart';
  var tergetID = 'watchRegisterBtn';
  
  var ElmAnc = document.createElement('a');
  var AddBase = document.getElementById(tergetID);
  if (AddBase) {
    ElmAnc.text = '◆ユーザーIDで動画を検索する(nico chart)';
    ElmAnc.id = 'openNicoChart';
    ElmAnc.href = location.href.replace(patURI, repURI).replace(/\?.*$/,'');
    AddBase.parentNode.insertBefore(ElmAnc, AddBase.nextSibling); 
  }
})();