解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

インターネットから自動で情報を取ってくる[VBA]入門〜Webサイトを開く〜



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


パソコンが勝手に仕事してくれないかなぁ…と何度思ったことでしょう。

インターネットから自動で情報が取ってこれたら何か出来そうな気がしませんか?

インターネットから情報が取ってこれるなら社内の Web システムなんて自動化出来るようになったも同然です。

社内の Web システムでは下の様な処理があるかと思います。

【社内の Web システムの処理】
・出社、退社
・会議室の予約
・残業申請
・有休申請
・各種承認

これがワンクリックで出来たり、パソコン点けただけで出来る様になったら、とっても効率的だと思います。

まずは Internet Explorer で Web サイトを自動表示させてみます。



動作環境


Windows 7
Excel 2007
Internet Explorer



環境と素材の準備

リンクの記事で VBScriptVBA でアイコン設定などをしたアプリケーションを作成しました。
Excel VBA と VBScript で 自作アイコンとドラッグ&ドロップが出来るアプリケーションを作る - 解析エンジニアの自動化 blog

今回もアプリケーションとして作成します。
詳細な設定、作成方法はリンクの記事を参照ください。

アプリフォルダの作成

デスクトップに『IEOpener』というフォルダを作成し、図1 の様にサブフォルダを作成します。


図1 アプリフォルダの作成


アイコンの作成

シンプルに『 IE 』という文字でアイコンを作りました。


図2 作成したアイコン



プログラム

今回は少し複雑なのですが、VBScript からマクロ有効ブックのマクロを実行する様なアプリケーションにしました。

マクロ有効ブックの ThisWorkbook モジュールの Open イベントハンドラでマクロを実行すればマクロ有効ブック1つで良いのですが、自動で表示させたい Web サイトの追加や編集を行う時にふつうにマクロ有効ブックを起動させると Web サイトが立ち上がってしまうので、あえて複雑にしました。

VBScript ファイル


図3 VBScript ファイル


VBScript ソースコード


'---------------------------------------------------------------------
' 自分自身(この.vbs)のファイルがあるフォルダの親フォルダ取得
'---------------------------------------------------------------------
path = CreateObject("Scripting.FileSystemObject").getParentFolderName(WScript.ScriptFullName)
pos = instrrev(path, "\")
path = mid(path, 1, pos-1)
'msgbox path
 
'-----------------------------
' Excel オブジェクトの作成
'-----------------------------
Set obj = WScript.CreateObject("Excel.Application")
obj.Visible = True
 
'---------------
' Excel を開く
'---------------
obj.Workbooks.Open path & "\SubProgram\IE操作マクロ.xlsm"
 
'--------------
' マクロ実行
'--------------
ret = obj.Application.Run("IE操作マクロ.xlsm!main")
'msgbox ret
 
'-----------------
' Excel を閉じる
'-----------------
obj.Quit
 
'------------------------------
' シェルオブジェクトの生成
'------------------------------
Set objShell = WScript.CreateObject("WScript.Shell")
 
'------------------
' メッセージ表示
'------------------
objShell.PopUp "操作終了", 2
 
'--------------
' メモリ解放
'--------------
Set objShell = Nothing

VBA ファイル


図4 マクロ有効ブック


図5 マクロ有効ブックの中身


VBA ソースコード


' ウィンドウを最前面に持ってくる Win API
Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
 
 
 
Public cnt ' Progress サブルーチンで使用
Public statFlag ' 関数の終わりにプログラムの実行状況を把握するために使用するフラグ
 
 
 
' メインサブルーチン
Function main()
   
    statFlag = True
   
    ' シート情報定義
    strSh = "操作画面"
    startRow = 4
    endRow = 38
   
    ' 変数
    str番号 = ""
    strサイト名 = ""
    strURL = ""
    delim = "@@@@@"
   
    ' 処理
    With ThisWorkbook.Worksheets(strSh)
       
        ' 入力状況の認識
        For i1 = startRow To endRow
           
            ' 入力取得
            番号 = .Cells(i1, 2).Value
            サイト名 = .Cells(i1, 3).Value
            URL = .Cells(i1, 4).Value
           
            ' 全て入力されているなら
            If 番号 <> "" And サイト名 <> "" And URL <> "" Then
               
                ' 入力情報の記憶
                If str番号 = "" Then
                    str番号 = 番号: strサイト名 = サイト名: strURL = URL
                Else
                    str番号 = str番号 & delim & 番号: strサイト名 = strサイト名 & delim & サイト名: strURL = strURL & delim & URL
                End If
               
            End If
           
        Next i1
       
        ' 配列化
        arr番号 = Split(str番号, delim)
        arrサイト名 = Split(strサイト名, delim)
        arrURL = Split(strURL, delim)
       
        ' IE オブジェクト配列の作成
        ReDim objIE(UBound(arr番号)) As Object
       
        ' IE 操作
        For i1 = LBound(arr番号) To UBound(arr番号)
           
            ' IE 起動
            Call NewIE(objIE(i1), arrURL(i1))
           
        Next i1
       
    End With
   
    ' IE 同期
    Call SyncIE(objIE)
   
    main = statFlag
   
End Function
 
 
 
' IE を起動するサブルーチン
Sub NewIE(ByRef objIE As Object, ByVal URL)
  
   Set objIE = CreateObject("InternetExplorer.Application") ' IE オブジェクトの生成
  
   objIE.Visible = True                                     ' IE オブジェクトの可視化
  
   objIE.navigate URL                                       ' IEを開く
  
End Sub
 
 
 
' IE と同期を取るサブルーチン
Sub SyncIE(ByRef objIE() As Object)
   
    ' IE 全てを調べるループ
    For i1 = LBound(objIE) To UBound(objIE)
       
        ' ループ回数をカウントする変数
        cntLoop = 0
       
        ' ページが読み込まれるまで待つ
        Do While objIE(i1).Busy = True Or objIE(i1).readyState <> 4
            ' IE を最前面に表示する
            'rc = BringWindowToTop(CLng(objIE(i1).hwnd))
            rc = SetForegroundWindow(CLng(objIE(i1).hwnd))
            cntLoop = cntLoop + 1
            Call Progress(" Web サイト表示中")        ' Excel のステータスバーに進捗を表示する
            Application.Wait [Now()+"00:00:00.3"]   ' 0.3 秒止まる
            DoEvents                                  ' 1度処理をOSに戻す
            ' 60回IEの状態を確認してもIEの読み込みが完了していなければ
            If cntLoop > 60 Then
                cntLoop = 0
                objIE(i1).Refresh ' IEの再読み込みを実行
                Debug.Print objIE(i1).LocationName & " is Refresh!!"
            End If
        Loop
       
        Debug.Print objIE(i1).LocationName & " is OK!!"
       
    Next i1
   
End Sub
 
 
 
' SyncIE サブルーチン内で進捗を表示するサブルーチン
Sub Progress(ByVal msg)
   
    ' ステータスバーに表示する文字列の個数を設定する変数
    cnt = cnt + 1
   
    ' ステータスバーに表示する文字が10文字を超えたら1に戻す
    If cnt > 10 Then cnt = 1
   
    AnimPic = "ε"             ' 変更する文字の設定
    OriginalPic = "┏( ・_・)┛" ' 変更しない文字の設定
   
    Application.StatusBar = msg & String(cnt, AnimPic) & OriginalPic ' cnt : AnimPic の表示個数(Public 変数)
   
End Sub



結果



図6 作成したアプリケーション



図7 アプリケーションから起動した Web サイト



コメント

アイコンの作り方、VBScript ファイルの作り方などなど、アプリケーション化の詳しいやり方は下のリンクの記事でまとめています。
Excel VBA と VBScript で 自作アイコンとドラッグ&ドロップが出来るアプリケーションを作る - 解析エンジニアの自動化 blog

また、この Web サイトを自動で立ち上げるアプリケーションのアイコンを下のリンクの記事でまとめている『パソコンを起動したら自動で実行される設定が出来る VBScript 』にドラッグ&ドロップすれば、パソコンをつけただけで自動で Web サイトが立ち上がります。
パソコンを起動するとプログラムが自動で実行させる設定にする[VBScript] - 解析エンジニアの自動化 blog

今回作成したマクロ有効ブックを改造していけばパソコンをつけて、待っているだけで手間のかかる作業が出来てしまう日が来るかもしれません。



以上

パソコンを起動するとプログラムが自動で実行させる設定にする[VBScript]



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


毎朝会社でパソコンを起動させて、よく使うソフトウェアを起動して…というのはよくある話の様ですが、毎朝起動するソフトウェアなんてだいたい決まっています。

いちいちダブルクリックばっかりするのはやめましょう。

手動で設定するのもアレなんで、ファイルをドロップすると、次回からパソコンが起動したらソフトウェアを自動で起動する設定をしてくれるプログラムを作りましょう。



動作環境


Windows 7
Windows Scripting Host



プログラム

ソースコード


' ドロップされたファイルの取得
Set args = WScript.Arguments
 
' ドロップされたファイルのループ
For Each arg In args
   
    ' ドロップされたファイルのショートカットをスタートアップフォルダの中に作成する
    Call AddStartUpFolder(arg)
   
Next
 
Sub AddStartUpFolder(ByVal constPath)
  
    pos = InStrRev(constPath, "\")
    constName = Mid(constPath, pos+1)
   
    rDir = GetStartUpFolders()
    fPath = rDir & "\" & constName & ".lnk"
   
    Set myWSH = CreateObject("WScript.Shell")
    Set sc = myWSH.CreateShortcut(fPath)
    sc.TargetPath = constPath
    sc.Save
   
End Sub
 
Function GetStartUpFolders()
   
    Set myWSH = CreateObject("WScript.Shell")
    GetStartUpFolders = myWSH.SpecialFolders("StartUp")
   
End Function


VBScript ファイルの作り方

①上のソースコードを[メモ帳]にコピペします。
②[名前を付けて保存]をします。
③[ファイル名]の最後に[.vbs]を付ける。
④[ファイル種類]の[すべてのファイル]を選択する。
⑤[保存]ボタンを押す。



結果


図1 出来上がった VBScript



コメント

VBScript は気軽にドラッグ&ドロップが使えるので、VBScript ファイルの保存場所や管理方法を工夫すれば、作業の効率向上が出来ます。

リンクの記事でアプリケーション化について書いています。
Excel VBA と VBScript で 自作アイコンとドラッグ&ドロップが出来るアプリケーションを作る - 解析エンジニアの自動化 blog

パソコンを付けたら自動でプログラムが実行できる様になったので、定型的な業務を完全にプログラムで自動化出来れば、パソコン付けて待ってるだけで業務が終わらせられる様になりますね。



以上

Excel VBA と VBScript で 自作アイコンとドラッグ&ドロップが出来るアプリケーションを作る



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


小さなアプリケーションを Excel VBA で作っていると管理がめんどくさい!

使い勝手もいちいち Excel を起動して、ファイルやフォルダを選択して、ボタンを押すという動作さえわずらわしい!!

そして、作ったアプリが増えすぎてデスクトップのどこにあるかが分かりづらい!!!

これらの不満を出来る限り解決します。

この記事では印刷アプリケーションを作成します。
印刷したいファイルをドラッグ&ドロップすると『通常使うプリンタ』として設定されているプリンタでドロップしたファイルの印刷設定で印刷されるアプリケーションです。



動作環境


Windows 7
Excel 2007
Windows Scripting Host



下準備

アプリケーションフォルダの作成

図1の様に場所はどこでも良いので、フォルダを作ります。
この時、フォルダの名前がアプリケーションの名前になります。


図1 アプリケーションフォルダ


サブフォルダの作成

作成したフォルダの中にフォルダ2つとマクロ有効ブックを作成します。


図2 サブフォルダとマクロ有効ブック

アイコンの作成

ペイントソフト

Windowsに元々インストールされている『ペイント』というソフトを使います。


図3 ペイントを起動したところ


ペイントの画像のサイズ

画像のサイズを変更します。
『アイコン 画像サイズ』でインターネット検索したところ、アイコンの画像サイズは『 24×24 』か『 32×32 』が多いらしいです。
今回は『 24×24 』 にします。
『サイズ変更』ボタンを押して、『サイズ変更と傾斜』ウィンドウを開きます。


図4 サイズ変更ウィンドウ


サイズ変更ウィンドウの操作は以下の順番で行います。
①単位をピクセルにする
②『縦横比を維持する』のチェックを外す
③水平方向に『 24 』を入力する
④垂直方向に『 24 』を入力する


図5 サイズ変更操作


サイズ変更が出来ました。


図6 サイズ変更した画像


ペイントの使い方

このままだと画像が小さすぎて、アイコンが作れないので、『表示』タブの『拡大』ボタンを押して、拡大します。


図7 画像の拡大


800%まで拡大します。


図8 拡大したところ


何か文字を1文字書いてみます。
『 A 』ボタンを押します。
そして、アプリケーションをイメージ出来る1文字を入力します。

図9 A ボタンを押す


図10 文字を書く


なぜか横向きになるので、縦向きに直します。
『選択』ボタンを押して、文字を囲みます。

図11 文字の選択


『回転』ボタンを押して、文字を回転させて文字を横→縦にします。
アイコン化する時にショートカットを作成する都合で文字を画像右上に配置します。

図12 文字の回転


図13 文字を右上に配置


アイコンの保存

保存がポイントです。
ファイル名の最後に『.ico』とつけて、 ファイルの種類の『24 ビット ビットマップ』を選択して『保存』ボタンを押して、保存します。

図14 アイコンの保存

プログラム

VBScript ソースコード

まず、VBScript を書きます。
ファイルがドラッグ&ドロップされたら、画像かどうかを拡張子から判断して、印刷するVBScript です。


' 印刷出来るファイル
' .txt
' .pdf
' .xls
' .xlsx
' .ppt
' .pptx
' .doc
' .docx
' .msg
' .bat
' .vbs
' .png
' .jpg
' .bmp
 
' 印刷出来ないファイル
' .dat(パソコンの設定で Windows 標準の「メモ帳」では無く、サクラエディタで起動する設定のため InvokeVerbEx から印刷できない)
' .csv(パソコンの設定で Windows 標準の「メモ帳」では無く、サクラエディタで起動する設定のため InvokeVerbEx から印刷できない)
 
'-------------------------------------------------------------------------------------------------------
' 引数が無かった時の処理
'-------------------------------------------------------------------------------------------------------
If WScript.Arguments.count = 0 then
   WScript.Echo "引数が無いため、実行できません。" & vbNewLine & _
                "ファイルをドロップしてください。"
   WScript.Quit
End If
 
'-------------------------------------------------------------------------------------------------------
' フォルダ内ファイルリスト出力
'-------------------------------------------------------------------------------------------------------
for each args In WScript.Arguments
  
   '----------------------------------------------------------------------------------------------------
   ' ファイルシステムオブジェクト作成
   '----------------------------------------------------------------------------------------------------
   Set objFileSys = CreateObject("Scripting.FileSystemObject")
  
   '----------------------------------------------------------------------------------------------------
   ' ドロップされた引数がフォルダかファイルかを判定する
   '----------------------------------------------------------------------------------------------------
   If objFileSys.FolderExists(args) then
      ' is folder.
      WScript.Echo "フォルダがドロップされました。" & vbNewLine & _
                   "処理を終了します。"
      WScript.Quit
   ElseIf objFileSys.FileExists(args) then
      ' is file.
   else
      ' is unknown.
      WScript.Echo "フォルダ 及び ファイル とも認識できないデータがドロップされました。" & vbNewLine & _
                   "処理を終了します。"
      WScript.Quit
   End If
  
   '----------------------------------------------------------------------------------------------------
   ' ドロップされた引数がフォルダか画像かを判定する
   '----------------------------------------------------------------------------------------------------
   Flag_Image = False
   pos = InstrRev(args, ".")
   argsExtension = Mid(args, pos)
   Flag_Image = ImageDetermination(argsExtension)
  
   '----------------------------------------------------------------------------------------------------
   ' ドロップされたファイルが画像以外なら
   '----------------------------------------------------------------------------------------------------
   If Flag_Image = False Then
      
      '-------------------------------------------------------------------------------------------------
      ' シェルオブジェクト作成
      '-------------------------------------------------------------------------------------------------
      Set objWsh = WScript.CreateObject("Shell.Application")
     
      '-------------------------------------------------------------------------------------------------
      ' 引数ファイルのパスの分解
      '-------------------------------------------------------------------------------------------------
      pos = InstrRev(args, "\")
      Dir_Name = Left(args, pos - 1)
      file_Name = Mid(args, pos + 1)
     
      '-------------------------------------------------------------------------------------------------
      ' フォルダオブジェクト と ファイルオブジェクトの作成
      '-------------------------------------------------------------------------------------------------
      Set objFolder = objWsh.NameSpace(Dir_Name)
      Set objFile = objFolder.ParseName(file_Name)
      'Msgbox objFolder.Title & vbnewline & objFile.Name
     
      '-------------------------------------------------------------------------------------------------
      ' 印刷する
      '-------------------------------------------------------------------------------------------------
      objFile.InvokeVerbEx("Print")
     
      '-------------------------------------------------------------------------------------------------
      ' シェルオブジェクトの破棄
      '-------------------------------------------------------------------------------------------------
      Set objWsh = Nothing
     
   '----------------------------------------------------------------------------------------------------
   ' ドロップされたファイルが画像なら
   '----------------------------------------------------------------------------------------------------
   Else
     
      '-------------------------------------------------------------------------------------------------
      ' 印刷する
      '-------------------------------------------------------------------------------------------------
      Set objWsh = CreateObject("WScript.Shell")
      objWsh.Run "mspaint.exe " & args & " /p"
      Set objWsh = Nothing
     
   End If
  
Next
 
'-------------------------------------------------------------------------------------------------------
' 画像ファイルかどうかの判定関数
'-------------------------------------------------------------------------------------------------------
Function ImageDetermination(argsExtension)
  
   ' 画像ファイルの拡張子を記憶
   ImageExtension = Array(".jpg", ".jpeg", ".JPG", ".JPEG", ".jpe", ".jfif", ".pjpeg", ".pjp", _
                          ".png", _
                          ".gif", _
                          ".svg", ".svgz", _
                          ".bmp", ".dib")
  
   ' 画像判定ループ
   For i = LBound(ImageExtension) To UBound(ImageExtension)
     
      ' 画像ファイルの拡張子と同一の拡張子であれば
      If ImageExtension(i) = argsExtension Then
        
         ' 画像ファイルであると判断する
         ImageDetermination = True
        
         ' 関数を終了する
         Exit Function
        
      ' 画像ファイルの拡張子と不一致の拡張子であれば
      Else
        
         ' 画像ファイル以外と判断する
         ImageDetermination = False
        
      End If
     
   Next

End Function


VBScript の保存

VBScript は上のソースコードを『メモ帳』にコピペします。
『名前を付けて保存』する時にファイル名の最後に『.vbs』を付けて、ファイル種類の『すべてのファイル』を選択して『保存』ボタンを押して保存します。

図15 VBScript の保存


Excel の開発タブの表示

※ 既に開発タブが表示されている人は次の『VBAの作成』までスクロールして下さい。

Excel を開きます。

図16 Excel 画面


ホームボタンから『Excelのオプション』をクリックします。

図17 Excel のオプション


『基本設定』の『開発タブをリボンに表示する』にチェックを付けます。

図18 開発タブの表示設定


開発タブが表示されました。

図19 開発タブの表示設定


VBAの作成

開発タブを選択します。

図20 開発タブ


Visual Basic ボタンをクリックします。

図21 Visual Basic ボタン


Visual Basic Editor が起動します。

図22 VBE 画面


VBAソースコードを書き入れる場所を追加します。
『挿入』→『標準モジュール』

図23 標準モジュール追加


VBAソースコードを書き入れる場所が追加されました。

図24 VBA 入力画面


VBA ソースコード

VBA は使用環境を整えるために使います。
シート上にインストールボタンを作成して、そのボタンを押すとデスクトップ画面に作成したアイコンでショートカットが作成されるVBAを書きます。

このソースコードは図24 のVBAソースコードを書き入れる場所にコピペして下さい。


Sub DeskTopShortcut()
   
    Dim WSH, sc
   
    Set WSH = CreateObject("WScript.Shell")
   
    ' ショートカットの名前設定
    フォルダ名 = ThisWorkbook.Path
    pos = InStrRev(フォルダ名, "\")
    フォルダ名 = Mid(フォルダ名, pos + 1)
    ショートカット名 = フォルダ名
    myPath = WSH.SpecialFolders("Desktop") & "\" & ショートカット名 & "-ショートカット.lnk"
   
    ' ショートカット作成
    Set sc = WSH.CreateShortcut(myPath)
   
    ' フォルダ内に保存されているファイルが1つであることを確認する
    プログラムフォルダ = ThisWorkbook.Path & "\" & "Program"
    CountFile = フォルダ内ファイルカウント(プログラムフォルダ)
    If CountFile > 1 Then
        MsgBox "プログラムフォルダ内にプログラムが複数確認されました。" & vbNewLine & _
               "1つだけにして再度インストールして下さい。"
        Exit Sub
    ElseIf CountFile = 0 Then
        MsgBox "プログラムフォルダ内にプログラムが確認出来ませんでした。" & vbNewLine & _
               "プログラムフォルダに1つだけプログラムを保存して再度インストールして下さい。"
        Exit Sub
    End If
   
    ' フォルダ内に保存されているファイルが1つであることを確認する
    アイコンフォルダ = ThisWorkbook.Path & "\" & "Icon"
    CountFile = フォルダ内ファイルカウント(アイコンフォルダ)
    If CountFile > 1 Then
        MsgBox "アイコンフォルダ内にアイコンが複数確認されました。" & vbNewLine & _
               "1つだけにして再度インストールして下さい。"
        Exit Sub
    ElseIf CountFile = 0 Then
        MsgBox "アイコンフォルダ内にアイコンが確認出来ませんでした。" & vbNewLine & _
               "アイコンフォルダに1つだけプログラムを保存して再度インストールして下さい。"
        Exit Sub
    End If
   
    ' ターゲットパスの設定
    ファイル名 = フォルダ内ファイル取得(プログラムフォルダ)
    sc.TargetPath = プログラムフォルダ & "\" & ファイル名(0)
   
    ' アイコンの設定
    ファイル名 = フォルダ内ファイル取得(アイコンフォルダ)
    sc.IconLocation = アイコンフォルダ & "\" & ファイル名(0)
   
    ' 設定保存
    sc.Save
   
    Set sc = Nothing
    Set WSH = Nothing
   
End Sub
 
 
 
Function フォルダ内ファイルカウント(folderPath)
   
    ' カウント用変数
    cnt = 0
   
    ' フォルダ内ファイル取得
    buf = Dir(folderPath & "\" & "*.*")
   
    ' ファイルが無くなるまでループ
    Do While buf <> ""
       
        ' ファイルカウント
        cnt = cnt + 1
       
        ' フォルダ内ファイル更新
        buf = Dir()
       
    Loop
   
    ' 戻り値
    フォルダ内ファイルカウント = cnt
   
End Function
 
 
 
Function フォルダ内ファイル取得(folderPath)
   
    ' ファイル名取得用変数
    ファイル名 = ""
   
    ' フォルダ内ファイル取得
    buf = Dir(folderPath & "\" & "*.*")
   
    ' ファイルが無くなるまでループ
    Do While buf <> ""
       
        ' ファイル名の記憶
        If ファイル名 = "" Then
            ファイル名 = buf
        Else
            ファイル名 = ファイル名 & "@" & buf
        End If
       
        ' フォルダ内ファイル更新
        buf = Dir()
       
    Loop
   
    ' ファイル名の配列化
    ファイル名 = Split(ファイル名, "@")
   
    ' 戻り値
    フォルダ内ファイル取得 = ファイル名
   
End Function


シート上にボタンを作る

『開発』タブの『デザインモード』ボタンを押します。

図25 デザインモード


『挿入』ボタンを押して『ActiveXコントロール』の『コマンドボタン』を押す。

図26 ボタン作成


シート上でドラッグしてボタンを作成する。

図27 ボタン作成


ボタンとVBAをリンクする

作成したボタンをダブルクリックします。
ボタンのVBAソースコードを書き入れる場所(シートモジュール)にボタンが押された時に実行される中身が空っぽのプログラムが自動で書き込まれます。

図28 シートモジュール


ボタンが押された時に実行される中身が空っぽのプログラムで、上のVBAソースコードを呼び出す命令を書き入れます。

そして、上書き保存して、Visual Basic Editor を閉じます。

図29 シートモジュール


ボタンの作り込み

作成したボタンの上で右クリックする。
右クリックメニューの『プロパティ』をクリックします。

図30 ボタンの設定


プロパティウィンドウの『Accelerator』と『Caption』を変更する。

図31 プロパティウィンドウ


『Accelerator』はアルファベットを1文字入力します。
仮にアルファベットの『 A 』を入力したとすると、『 Alt + A 』でボタンが押せる様になります。

『Caption』はボタンに表示される文字列を入力します。
『Accelerator』に入力したアルファベットが入力されると自動で下線が着きます。

図32 プロパティウィンドウ


ボタンが完成しました。
あとはデザインモードボタンを押して、デザインモードを解除します。

図33 ボタン完成



結果

インストーラ.xlsm を起動して、インストールボタンを押すと、デスクトップ画面にアイコンが出来ました。


図34 作成されたアプリケーション



コメント

Cドライブに『自作アプリ』などのフォルダを作成しておいて、作成したアプリケーションを『自作アプリ』フォルダに入れて、インストールしましょう。

自作アプリは『自作アプリ』フォルダの中に集約され、VBScript で作成したプログラムは簡単にドラッグ&ドロップ機能を組み込めるので、わずらわしい操作を排除できます。

また、アイコンもアプリケーション毎に付けられるので、デスクトップ画面でもなんのアプリがどこにあるのかが分かりやすくなります。

今回作成した印刷アプリでは無くて Excel 操作の必要なアプリケーションだとしても、VBScript から Excel VBA を呼び出す事も出来ます。もちろん他の exe ファイルなんかも VBScript から呼び出せます。
VBScript から呼び出さなくてもショートカットさえ作れるならプログラムを作る言語は何でも良いです。

社内配布などした時にもわりと受け入れられやすそうなアプリケーションになったのでは無いでしょうか。



以上

使う道具で効率化する〜デスクを2倍広く使い倒す〜


こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


今の日本ではパソコンで仕事をする事はもはや変わったことではありません。

パソコンで仕事をする人も紙を使用したりします。

ペーパーレスと言っても、ゼロとはいかないのではないでしょうか?
個人ではゼロの人もいるでしょうが、会社単位で考えると本当にゼロな会社があるとは思えません。

自分のデスクにパソコンモニター、キーボード、マウス、ファイルを置いていると紙を使った作業スペースに困ります。

そこで、パソコンモニターを台の上に乗せてキーボードとマウスの収納スペースを作りました。



パソコンモニターの台


私は黒色のものを購入しましたが、モニターを2つおけてキーボードを下にしまえば作業スペースが大きく確保できます。

このパソコンモニターの台を私が設置してから会社の同僚も購入していました。





コメント

安いかどうかは微妙ですが、これで長期的に作業スペースに困らず、作業スピードが上げられるなら!と思い購入しました。

そうそう壊れませんからね。

USB ポート付きのものがあったり、種類も色々あるので是非探してみてください。



以上

使う道具で効率化する〜省スペースでもパソコン操作をより速く〜


こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


パソコン操作は基本的にキーボードとマウスで行います。

しかし、ゲームコントローラの様なもので操作するやつもあります。
なので、『基本的に』キーボードとマウスと書きました。

仕事ともなればかなりの時間をキーボードとマウスと過ごします。
であれば、キーボードとマウスは効率重視で選ぶべきです。



キーボード・マウス機能付き


常日頃からマウスを操作してキーボードに手を移動する事がものすごくめんどくさく感じていました。

手をマウスからキーボードに移動させてる間はだいたいパソコンには何も入力出来てません。

そのため、キーボードにマウス機能が付いているものを購入しました。





コメント

最初はマウス操作にやりづらさを感じると思います。

慣れれば全く気になりません。

圧倒的なタイピング量で仕事を片付けてしまいましょう。



以上

使う道具で効率化する



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


効率よく仕事をする為には使う道具も効率で選ぶべきです。

道具を変えるだけで効率が得られるならやらない手はありません。

やはり仕事で長時間使うものは少しでも効率が良くなる道具を使うべきです。



こだわるべき道具


こだわるべきは『長時間使うもの』です。

長時間使うものを並べてみました。

・椅子
       座り仕事をしている人は恐らく椅子を1番長く
       使うのではないでしょうか?

       使ってる意識があんまり無いですが、姿勢は
       集中力、体力、全てに影響します。

・モニター
       見るという行為は実はとんでも無く体力を
       使っています。

       人間の情報の8割は目からの情報です。

・キーボード・マウス
       パソコンへの入力は基本的にはキーボードと
       マウスで行われます。

       マウスとキーボードの持ち替え(手の移動)に
       日々イライラしています。

・筆記用具
       筆記用具は『何を使うか』より、『どこに置くか』
       がとても重要な気がします。



コメント

これらの道具を自前で揃えるにはなかなかのコストがかかる為、長期的に1個ずつ揃えていきたいところです。



以上

水平改ページでエラー『インデックスが有効範囲にありません。』が出た![VBA]



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


VBAで大量ファイルの印刷設定を行っていたら、水平の改ページでエラーが出てハマったのでまとめておきます。



動作環境


Windows 7
Excel 2007



エラーが出たプログラム

Excel

Excelで『 1 』をA列〜I列、1行〜144行の範囲全てに入力し、改ページプレビュー設定にしました。

図1 Excelの中身

ソースコード

図1 のExcelに下のソースコードを標準モジュールに追加しました。

Sub 改ページテスト()
   
    ' このブックのインデックス 1 のシート上で
    With ThisWorkbook.Worksheets(1)
        
        ' 水平改ページ数を表示
        水平改ページ数 = .HPageBreaks.Count
        Debug.Print "水平改ページ数 = " & 水平改ページ数
       
        ' 1 番下の水平改ページの行を表示
        水平改ページ行 = .HPageBreaks.Item(水平改ページ数).Location.Row
        Debug.Print "水平改ページ行 = " & 水平改ページ行
       
    End With
   
End Sub

エラー内容

実行すると図2 の様なエラーメッセージが表示され、『デバッグ』ボタンを押すと図3 のソースコードが問題であったことが分かりました。

図2 エラーメッセージ

図3 問題のソースコード

VBAの出力状況

出力内容を確認すると、ページ数は 2 ページなので水平の改ページ数は『 1 』になるはずですが、水平改ページ数が『 2 』になっています。

図4 イミディエイトウィンドウ



原因究明と試行錯誤

改ページを 1 行ズラすと 3 ページ目が現れました。

たまたま改ページが外枠の印刷範囲の線と同じ位置にあったようです。

改ページが印刷範囲の 1 番下の行と同じ位置なら何もしない様に VBA を書き換えたいのですが、印刷範囲は簡単に VBA から取得出来ますが、そもそも上のエラーが出てしまうため、改ページの位置が取得出来ません。

そこで、とりあえず印刷範囲を取得してみることにしました。

ちなみに、 3 ページ目が存在する状態で VBA を実行するとエラーは出ませんでした。

図5 改ページをズラす


図6 3 ページ目が出現



修正したプログラム

ソースコード

図1 のExcelに下のソースコードを標準モジュールに追加しました。

Sub 改ページテスト()
   
    ' このブックのインデックス 1 のシート上で
    With ThisWorkbook.Worksheets(1)
       
        ' 印刷設定が無い場合は
        If .PageSetup.PrintArea = vbNullString Then
           
            ' 表示
            Debug.Print "印刷設定がありません"
           
            印刷範囲1 = .Cells(1, 1).Address(0, 0)
            印刷範囲2 = .Cells(1, 1).SpecialCells(xlLastCell).Address(0, 0)
            印刷範囲 = 印刷範囲1 & ":" & 印刷範囲2
           
            .PageSetup.PrintArea = 印刷範囲
           
            Debug.Print "印刷範囲が無いので設定しました。"
           
        ' 印刷設定がある場合は
        Else
           
            ' 印刷範囲の最後の行を表示
            startRow = .Range(.PageSetup.PrintArea).Rows.Row
            endRow = startRow + .Range(.PageSetup.PrintArea).Rows.Count - 1
            Debug.Print "印刷範囲の最終行は " & endRow
           
        End If
       
        ' 水平改ページ数を表示
        水平改ページ数 = .HPageBreaks.Count
        Debug.Print "水平改ページ数 = " & 水平改ページ数
       
        ' 1 番下の水平改ページの行を表示
        水平改ページ行 = .HPageBreaks.Item(水平改ページ数).Location.Row
        Debug.Print "水平改ページ行 = " & 水平改ページ行
       
    End With
   
End Sub

VBAの出力状況

出力内容を確認すると、最初は印刷範囲は未設定だったので、入力範囲を印刷範囲に設定しました。

すると、ページ数は 2 ページで水平の改ページ数は『 1 』になっています。

また、エラーが出なくなりました。

図7 イミディエイトウィンドウ



コメント

たまたま解決策が発見できてしまいました。

VBAのシートオブジェクトの『HPageBreaks』プロパティは印刷範囲の設定が無いと印刷範囲の1番下と改ページがたまたま同じ位置の時に来た時にインデックスエラーが発生します。

改ページをVBAから操作する時は印刷範囲の設定をきちんとしましょう。



以上