Quantcast
Channel: いつも隣にITのお仕事
Viewing all 2098 articles
Browse latest View live

【エクセルVBA】FileDialogプロパティで任意のフォルダの画像をまとめてシートに貼り付ける方法

$
0
0

excel,vba,dialog,任意,フォルダ,指定,eyecatch皆様こんにちは、ノグチです。

前回は、ShapesコレクションのAddPictureメソッドとFileSystemオブジェクトを使って、フォルダにある画像ファイルを一括でシートに貼り付ける方法をご紹介しました。

しかし前回ご紹介したコードでは、コードの中に操作対象のフォルダパスが直接書き込まれていましたから、他のフォルダ構成になってしまうと、このコードは使えなくなってしまいます…

ならば折角のコードがその場限りになってしまわないよう、汎用化してしまおう!

ということで、今回はFileDialogプロパティで、任意フォルダの画像をシートにまとめて貼り付ける方法をご紹介します!

コードの使いまわしができるようにすることのメリット

まず、汎用化と言っても特に難しいことをするわけではありません。

作ったコードを、他の対象ファイルであったり、フォルダ階層であったりした場合にも使えるように、コードを見直して『使いまわし』ができるようにするだけです。

汎用化をすることによって、ぱっと思い浮かぶメリットとしてはこちら。

  • フォルダやファイル名が変わっても、コードを修正することなくツールを利用できる
  • 修正が必要になった場合、影響範囲が分かりやすい
  • コードが短文になることが多く、読みやすい
  • 他のツールにもコードを使いまわしやすい

他にもメリットはありますが、こんなところでしょうか。

前回のおさらいと見直すコードの例

では、前回の記事で使用したコードのフォルダ指定部分を、FileDialogプロパティを使って汎用化していきましょう。

前回のコードはこちら。

Sub 画像貼り付け()
Dim lngTop As Long
Dim objFile As Object
Dim objFldr As FileSystemObject
 
    Set objFldr = CreateObject("Scripting.FileSystemObject")
 
    lngTop = 20
    
    For Each objFile In objFldr.GetFolder(ThisWorkbook.Path & "\images").Files
        ActiveSheet.Shapes.AddPicture _
                Filename:=objFile, _
                LinkToFile:=False, _
                SaveWithDocument:=True, _
                Left:=20, _
                Top:=lngTop, _
                Width:=300, _
                Height:=200
        
        lngTop = lngTop + 200 + 20
    
    Next
 
End Sub

エクセルブックと同じ階層にある、「images」フォルダに格納されているファイルを、順番にシートに貼り付けるという内容のコードでした。

画像ファイルをシートに貼り付けるという動作は問題ないのですが、このままでは画像を格納したフォルダの名前や階層が限られてしまいます。

FileDialogプロパティで任意のフォルダを操作対象にしてしまいます。

ダイアログで任意のフォルダを指定する方法

FileDialogプロパティでフォルダ選択ダイアログを表示させる

ここで使うのは、ApplicationオブジェクトのFileDialogプロパティです。

FileDialogという名前の響きから、ファイルしか選べないのでは?とお思いでしょうか。

ご安心あれ、FileDialogプロパティのパラメーターにmsoFileDialogFilePickerをセットすれば、ちゃんとフォルダも選択できるのです。

 このFileDialogプロパティについては下記記事で説明されていますので、併せてご覧ください。

エクセルVBAでFileDialogオブジェクトを使ってファイル選択ダイアログを開く
エクセルVBAでファイルを開く作業を自動化する方法についてシリーズでお伝えしています。今回は、エクセルVBAでFileDialogオブジェクトを使ってファイル選択ダイアログを表示させる方法です。

Showメソッドでフォルダ選択ダイアログを表示させる 

まずはFileDialogオブジェクトのShowメソッドで、フォルダ選択のダイアログを表示させるようにします。

Application.FileDialog(msoFileDialogFolderPicker).Show

すると、こんなダイアログが表示されるようになります。

excel,vba,dialog,フォルダ選択画面

用意した変数に取得したフォルダパスをセットする

次にApplicationオブジェクトのFileDialogプロパティを使って、FileDialogオブジェクトを取得しましょう。

FileDialogオブジェクトで取得したフォルダパスを格納するための変数を宣言しておいて…

Dim strPath as String

FileDialogオブジェクトのSelectedItemsプロパティには、ユーザーがフォルダ選択のダイアログで選択したフォルダパスが格納されているので、これを定義しておいた変数にセットします。

StrPath = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1)

コード内のフォルダパス部分を変数に置き換える

ついでに、Withを使って、コードをくくってしまいましょう。

With Application.FileDialog(msoFileDialogFolderPicker)
        .Show
        StrPath = .SelectedItems(1)
    End With

あとはこの変数を、For Each ~.GetFolder().Filesの()内と置き換えるだけ

するとこんなコードになります。
Sub シェイプ貼り付け()
Dim lngTop As Long
Dim objFile As Object
Dim objFldr As FileSystemObject
Dim StrPath As String

    Set objFldr = CreateObject("Scripting.FileSystemObject")
    lngTop = 20

    With Application.FileDialog(msoFileDialogFolderPicker)
         .Show
         StrPath = .SelectedItems(1)
    End With

    For Each objFile In objFldr.GetFolder(StrPath).Files
            ActiveSheet.Shapes.AddPicture _
                    Filename:=objFile, _
                    LinkToFile:=False, _
                    SaveWithDocument:=True, _
                    Left:=20, _
                    Top:=lngTop, _
                    Width:=150, _
                    Height:=100

            lngTop = lngTop + 100 + 10
    Next

End Sub

これで、ユーザーが任意に選択したフォルダ内の画像を、シートにまとめて貼り付けることができるようになりました。

これなら画像ファイルの名前を変更したり、フォルダの階層を変更する必要もありません

まとめ

今回は、任意フォルダの画像をシートにまとめて貼り付ける方法をご紹介しました。

はじめの方で言ったような汎用化、といっても、ご覧の通りコードの一部を足したり置き換えたのみで、ただ『使いまわし』ができるようにしただけ。

でも折角作ったコードなら、使いまわせるようにしてしまいたいですよね。

この機会に、お手元のコードの見直しをしてみてはいかがでしょうか。

それでは、最後までお読みいただきありがとうございました!


Pythonでフォルダ内の古いファイルを削除するスクリプトを作る方法

$
0
0

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

プログラミング初心者向け、Windowsユーザー向けにPythonでフォルダ内の古いファイルを自動で削除するツールの作成方法についてお伝えしています。

前回の記事はこちら。

Pythonでリストに要素を追加をする方法、リストの要素を並び替えをする方法
プログラミング初心者&Windowsユーザー向け、Pythonでフォルダ内の古いファイルを自動削除するツールの作り方をお伝えしています。今回はリストに要素を追加をする方法、リストの要素を並び替えをする方法です。

リストの要素を追加する方法、リストの要素を並び替えする方法をお伝えしました。

つまり、以下手順でいうと2までできたというところですね。

  1. フォルダ内のファイルを全てについてループする
  2. その中でZIPファイルがあれば作成日時とファイル名をリスト化する
  3. リストの数が3を超えていたら、作成日時が古いファイルを削除する

今回はいよいよ、os.remove関数を使いつつ、フォルダ内の古いファイルを自動で削除するスクリプトを完成させます。

では、行ってみましょう!

前回のおさらい

では、まず前回のおさらいから。

作成したスクリプトはこちらでした。

import os
from operator import itemgetter
filelists = []
for file in os.listdir():
    base, ext = os.path.splitext(file)
    if ext == '.zip':
        filelists.append([file, os.path.getctime(file)])
filelists.sort(key=itemgetter(1), reverse=True)
print(filelists)

作業フォルダ内のファイルで、splitext関数で拡張子を取り出します。

それで、拡張子が「.zip」のものについて、appendメソッドを使って

  • ファイル名
  • ファイルの作成日時(エポック秒)

というセットでリスト化、そしてsortメソッドでファイル作成日時の降順で並び替えるというものです。

古いZIPファイルを削除するということは

古いZIPファイルをどのように判別するか、解説をしていきます。

まず。前述のスクリプトで作られたリストがどのようなものか、確認しておきましょう。

今回用意したZIPファイルについて、前述のスクリプトを実行すると、以下のような出力が得られました。

[
     ['test_20170915.zip', 1505220570.226773],
     ['test_20170914.zip', 1505220557.8220537],
     ['test_20170912.zip', 1505220473.88305],
     ['test_20170910.zip', 1505220473.867423],
     ['test_20170911.zip', 1505220473.867423],
     ['test_20170913.zip', 1505220473.8517387]
]

例えば、フォルダ内のZIPファイル数を3つまでに制限をするのであれば、インデックス3~5に該当するZIPファイルを削除すれば良いということになります。

削除対象となるファイルを洗い出すスクリプト

指定のファイル数を「MAX_CNT」という変数に設定して、その数を超えている場合に、削除対象となる古いZIPファイルかどうかを判定するスクリプトを作ってみました。

こちらのスクリプトです。

import os
from operator import itemgetter
filelists = []
for file in os.listdir():
    base, ext = os.path.splitext(file)
    if ext == '.zip':
        filelists.append([file, os.path.getctime(file)])
filelists.sort(key=itemgetter(1), reverse=True)
MAX_CNT = 3
for i,file in enumerate(filelists):
    if i > MAX_CNT - 1:
        print('{}は削除します'.format(file[0]))

9行目で、変数MAX_CNTに最大のファイル数を指定しています。

そして、8行目はリストfilelistsについてループを回す箇所ですが、enumerate関数を使っていますので、変数とインデックスを両方取り出せます。

Pythonでリストのforループでインデックスと要素の両方を取り出して繰り返す方法
Pythonで初心者でも簡単にできるクリックボードを使ったツールの作り方をお伝えしています。今回はPythonのリストのforループで要素とともにインデックス番号も取り出す方法についてお伝えします。

さらに、そのループ内のif文で、インデックスが、ファイル数-1(インデックスは0始まりですので-1をしています)より大きければ、そのファイルは削除対象ということになります。

実行結果はコチラです。削除対象となる3つのファイルが洗い出されました。

Pythonでフォルダ内の古いファイルを洗い出す

remove関数でファイルを削除する

さあ、あとはファイルを削除するだけです。os.remove関数を使います。

os.remove(path)

pathはフルパスでも良いですし、今回の場合は作業フォルダなので、ファイル名だけになります。

なお、remove関数はゴミ箱移動ではなく、完全削除です。使うときは慎重にどうぞ。

指定数を超えたら古いファイルを削除するスクリプト

これを使ってフォルダ内の指定数を超えた分、古いファイルを削除するスクリプトを作りました。

コチラです。

import os
from operator import itemgetter
filelists = []
for file in os.listdir():
    base, ext = os.path.splitext(file)
    if ext == '.zip':
        filelists.append([file, os.path.getctime(file)])
filelists.sort(key=itemgetter(1), reverse=True)
MAX_CNT = 3
for i,file in enumerate(filelists):
    if i > MAX_CNT - 1:
        os.remove(file[0])

実行すると、先ほどprintで出力したファイルたちが削除されました。

Pythonでフォルダ内の古いファイルを削除した

まとめ

以上、Pythonでフォルダ内の古いファイルを削除するスクリプトを作成しました。

このスクリプトをタスクマネージャ等に仕込めば、自動で古いファイルを削除してくれますよね。

本シリーズは以上になりますが、また便利なツールを紹介していきますね。

どうぞお楽しみに!

連載目次:Pythonでフォルダ内の古いファイルを自動削除するプログラム

フォルダの中にどんどんたまっていくファイルたち…。Pythonでツールを作って、ファイルの数が一定数を超えたら古い削除から自動で削除するようにしちゃいましょう。

  1. Pythonでファイルの作成日時・更新日時・アクセス日時を取得する方法
  2. Pythonでフォルダ内の特定の拡張子のファイルだけ抽出する方法
  3. Pythonでリストに要素を追加をする方法、リストの要素を並び替えをする方法
  4. Pythonでフォルダ内の古いファイルを削除するスクリプトを作る方法

【エクセルVBA】表が変更されても、表全体の範囲を簡単に取得する方法

$
0
0

timetable-2467247_1920

みなさん、こんにちは。

なかじ(@nakaji098)です。

エクセルを実務で使っていると、表を作成したり、表に処理を行うことがあると思います。

表の範囲をRangeプロパティで直接指定することでも表に処理を行うことは可能です。
しかし、データは日々更新され、表の範囲も変わっていきます。そうなると、Rangeプロパティでは追加された範囲が含まれなかったり、逆に削除された行が範囲に含まれてしまったりします。

表の範囲に変化があったとしても、目的の表の範囲を取得したいですね。
そんな問題を解決してくれるのがCurrentRegionプロパティです。

今回は、CurrentRegionプロパティを使って、表の範囲が変わったとしても目的の表全体の範囲を取得する方法をご紹介したいと思います。

Rangeプロパティを使って表を指定する方法

まずは参考に、Rangeプロパティで表を指定する方法を説明から始めたいと思います。

Rangeプロパティの引数に範囲のアドレスを直接指定する

Rangeプロパティの引数に範囲のアドレスを直接指定することで、表全体の範囲を選択できます。

Worksheetオブジェクト.Range(アドレス)

Sub 複数セルの選択()
Worksheets(1).Range("A1:C5").Select
End Sub

セル選択
このようにRangeプロパティの引数に範囲のアドレスを直接指定することで、表の範囲を指定することもできます。

表に変更が加えられた場合

しかし、この方法で表の範囲を指定すると、表に変更が加えられたときに問題が起こります。

表にデータを追加して同じように実行してみます。(6行目とD列に追加)

Sub 複数セルの選択()
Worksheets(1).Range("A1:C5").Select
End Sub

セル選択2
このように追加された範囲(6行目とD列)が含まれなくなってしまいます。

これでは正確に表の範囲を指定することができませんね。

実際に実務でエクセルを使用していると、表の範囲が決まっていることは少なく、データが増えたりしますね。そうなるとRangeプロパティの引数に範囲のアドレスを直接指定することで表の範囲を直接指定する方法では対応できません。

CurrentRegionプロパティを使って表の範囲を取得する方法

そんな時に使えるのが、CurrentRegionプロパティになります。

Rangeオブジェクト.CurrentRegion

このプロパティを使用することで、指定したRangeオブジェクトのアクティブセル(=空白行と空白列で囲まれたセル範囲)を取得することができます。

少しわかりづらいと思いますので例を挙げます。
アクティブセル
この表ですと、水色に着色された空白行と空白列に囲まれた、A1セル~C3セルがアクティブセルになります。

CurrentRegionプロパティを使って表の範囲を取得

それでは、実際にCurrentプロパティを使ってみましょう。

Sub 表の範囲を選択()
Worksheets(1).Range("A1").CurrentRegion.Select
End Sub

表範囲選択

A1セル~C5セルが選択されました。
とても簡単で便利な機能です!

このプロパティで取得できる表の範囲は、ExcelでCtrlShiftキーを押すのと同じ範囲です。なので、プログラムを作っていて、表の範囲がCurrentRegionプロパティで取得できるかを確認したいときは、表の範囲内のセルを指定してCtrlShiftキーを押すことで確認することもできます

表に変更が加えられた場合

表にデータを追加して実行してみましょう。(6行目とD列に追加)

Sub 表の範囲を選択()
Worksheets(1).Range("A1").CurrentRegion.Select
End Sub

広範囲の表選択
表を広げた範囲(A1セル~D6セル)まで自動的に選択されました!

ここではA1セルを指定しましたが、ここで指定するセルは、表の範囲に含まれているセルであればどのセルでも大丈夫です。

Sub 表の範囲を選択()
Worksheets(1).Range("C1").CurrentRegion.Select
End Sub

このように表の範囲に含まれるセルであれば、正しく表の範囲を取得することができます。

1行目と1列目が空白の場合

表の中には、1行目と1列目が空白で作られている表もあると思います。
そのときにCurrentRegionプロパティを使うと、どのように範囲を取得するかを見てみましょう。

Sub 表の範囲を選択A1セル()
Worksheets(1).Range("A1").CurrentRegion.Select
End Sub

広範囲の表選択

A1セルをオブジェクトに指定し実行すると、このようにA1セル~D6セルが選択されてしまいます。

なので、ここで指定するRangeオブジェクトは表の範囲に含まれているセル(B2セル~D6セル)にする必要があります。

Sub 表の範囲を選択B2セル()
Worksheets(1).Range("B2").CurrentRegion.Select
End Sub

空白あり表選択2
このようにすることで、正しく表の範囲が選択できます。

空白行がある場合

それでは、表の中に空白行がある場合も見ていきましょう。

先ほども説明しましたが、CurrentRegionプロパティで取得できる範囲は、Rangeオブジェクトのアクティブセル(=空白行と空白列で囲まれたセル範囲)です。

ということは、空白行が入っていると、取得できる表の範囲が空白行の前までとなってしまいます。

Sub 表の範囲を選択()
Worksheets(1).Range("A1").CurrentRegion.Select
End Sub

空白行
このように選択されたのはA1セル~D4セルです。
CurrentRegionプロパティで表を取得するときは、表に空白の行がないかに気をつける必要があります。

まとめ

エクセルVBAで表の範囲を自動的に取得する方法を紹介しました。

まずはじめに、Rangeプロパティの引数に範囲のアドレスを直接指定し表全体の範囲を選択する方法から説明しました。

しかし、表は変更されることもあります。そこでCurrentRegionプロパティを使うことで、表の範囲が変更されても表全体の範囲を自動的に取得することができます。

また、空白行や空白列が入っていた場合の注意点なども説明しました。

表全体の範囲を取得するときは、このCurrentRegionプロパティを使ってみてください!

エクセルVBAでWordを操作して文書を操作する準備と最も簡単なプログラム

$
0
0
word

photo credit: Dr John2005 Road via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

当ブログでは、初心者向けのWord VBAに関してのテクニックもお伝えしています。

以下のページにドドンとまとまっています。

【保存版】実務でWord VBAを使いこなすための初心者向け完全マニュアル
Microsoftの超定番文書作成ソフトであるWord。実はVBAでマクロを作ることができます。このページは「これを見れば初心者でもWord VBAを実務で使えるようになる」ためのまとめページです。

ですが、エクセルからWord文書を操作したいときってありますよね。

例えば、フォルダ内のWord文書全てについて、そのページ数や文字数などを調べて、エクセルシートに書き出したいというようなニーズです。

ボタン一つでできたら便利です。

ということで、本シリーズではエクセルVBAでWord文書を操作する方法について、最初の一歩からお伝えしていきます。

まず今回は、初回ですのでエクセルVBAでWord文書を操作するために必要な準備と、最も簡単なプログラムについてお伝えします。

では、行ってみましょう!

Wordを操作するためのライブラリを追加する

まず、事前準備として、エクセルVBAからWordを操作するためには、「Microsoft Word XX.X Object Library 」という名前のライブラリの追加が必要です。

では、その方法をお伝えしていきます。

まず、VBEのメニューから「ツール」→「参照設定」とたどります。

VBEの参照設定を開く

続いて「参照設定」ウィンドウが開きますので、リストの中から「Microsoft Word Xx.X Object Library 」というライブラリを探しましょう。

見つけたらチェックをして、OKです。

VBEでWordオブジェクトライブラリを追加する

これで、ライブラリの追加は完了です。

ちなみに、ライブラリの追加はブックごとに行う必要がありますので、別ブックでWordを操作する場合は、これと同様の作業をする必要があります。

既にライブラリを追加したブックをコピーすれば、ライブラリの追加は不要ですのでおすすめです。

Wordアプリケーションを開く最も簡単なプログラム

では、Wordアプリケーションを開く最も簡単なプログラムを作っていきましょう。

こちらです。

Sub Wordを立ち上げる()

Dim wdApp As Word.Application
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True

MsgBox "Wordが立ち上がりました"

wdApp.Visible = False
Set wdApp = Nothing

End Sub

このプログラムを実行すると…

エクセルVBAでWordアプリケーションを開いた

このように何にも文書は開いていませんが、Wordアプリケーションが起動します。

では、上記プログラムを解説していきましょう。

Wordアプリケーションオブジェクトの生成とセット

まず、3行目と4行目は、Wordアプリケーションオブジェクトを生成して変数にセットする命令です。

Dim 変数名 As Word.Application
Set 変数名= CreateObject(“Word.Application”)

Wordアプリケーションのオブジェクト型はWord.Applicationです。

これで、指定した変数名(例ではwdApp)で、Wordアプリケーションを操作できるようになります。

Wordアプリケーションを表示

続いて、Wordアプリケーションを表示します。

というのも、オブジェクトを生成しただけでは、画面には何にも表示されないのです。

そのために、WordアプリケーションオブジェクトのVisibleプロパティを操作します。

Wordアプリケーションオブジェクト.Visible = True/False

Trueにすると表示し、Falseにすると非表示にします。

例では5行目で表示、9行目で非表示としていますね。

Wordアプリケーションオブジェクトの破棄

何らかの処理を終えて、Wordアプリケーションオブジェクトが用無しになった暁には、オブジェクトの破棄をします。

破棄をしないと、Wordアプリケーションオブジェクトに使っていたメモリが解放されません。

Set Wordアプリケーションオブジェクト = Nothing

今回の例では10行目のところです。

まとめ

以上、エクセルVBAでWordアプリケーションを操作する最も簡単なプログラムを作成しました。

まあ、生成して、開いて、閉じて、破棄しただけで、本質的なことは何にもしていませんけどね。

ご安心下さい。

次回以降、ちゃんとWord文書を開いていこうと思います。

どうぞお楽しみに!

エクセルVBAでWord文書を開いてページ数や文字数などのいろんな情報を取得する

$
0
0

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAでWord文書を操作する方法についてシリーズでお伝えしております。

前回はこちらの記事。

エクセルVBAでWordを操作して文書を操作する準備と最も簡単なプログラム
エクセルVBAでWord文書を操作する方法について、最初の一歩からお伝えするということで、まずはエクセルVBAでWord文書を操作するために必要な準備と、最も簡単なプログラムについてお伝えします。

エクセルVBAでWordアプリケーションを起動する準備とその方法についてお伝えしました。

今回は、起動したWordアプリケーション上にWord文書を開いて、ページ数や文字数などのいろいろな情報を取得してみたいと思います。

では、行ってみましょう!

前回のおさらい

前回作成したプログラムはこちら。

Sub Wordを立ち上げる()

Dim wdApp As Word.Application
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True

MsgBox "Wordが立ち上がりました"

wdApp.Visible = False
Set wdApp = Nothing

End Sub

Wordアプリケーションのオブジェクトを生成して、表示して、閉じて、破棄するというだけのプログラムです。

これだけでは何の意味もありませんが、このプログラムをベースとして、7行目のMsgBox関数の代わりに、いろいろな処理を入れていけばよろしいということになります。

エクセルVBAでWord文書を開く

では、Word文書を開いていきましょう。

Word文書を開くには、DocumentsコレクションのOpenメソッドを使います。

それで、開いたWord文書を変数にセットして扱いたいので、以下のようにSetステートメントでセットします。

Set 変数 = Documentsコレクション.Open(ファイル名)

ファイル名はフルパスで指定する必要があります。

で、Documentsコレクションはどうやって取得するかというと、Word.ApplicationオブジェクトのDocumentsプロパティで取得できます。

Wordアプリケーションオブジェクト.Documentsプロパティ

Word文書を開くプログラム

例えば、現在のエクセルマクロを記述しているファイルと同階層の、「原稿(1章).docx」というWord文書を開くのであれば、以下プログラムで開くことができます。

Sub Word文書を開く()

Dim wdApp As Word.Application
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True

Dim wdDoc As Word.Document
Set wdDoc = wdApp.Documents.Open(ThisWorkbook.Path & "\原稿(1章).docx")

Stop

wdApp.Visible = False
Set wdApp = Nothing

End Sub

7~10行目が今回追加した部分ですね。

実行すると、Stopステートメントで中断しているところで、以下のようにWord文書が開きます。

エクセルVBAでWord文書を開く

Word文書の情報を取得する

では、Word文書のいろいろな情報を取得してみましょう。

以下の情報を取得してみたいと思います。

  • ページ数
  • 段落数
  • 文数
  • 単語数
  • 文字数

プログラムはこちら!

Sub Word文書の情報を取得する()

Dim wdApp As Word.Application
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True

Dim wdDoc As Word.Document
Set wdDoc = wdApp.Documents.Open(ThisWorkbook.Path & "\原稿(1章).docx")

With wdDoc
    Debug.Print "ページ数:" & .Content.Information(wdNumberOfPagesInDocument)
    Debug.Print "段落数:" & .Paragraphs.Count
    Debug.Print "文数:" & .Sentences.Count
    Debug.Print "単語数:" & .Words.Count
    Debug.Print "文字数:" & .Characters.Count
End With

wdApp.Visible = False
Set wdApp = Nothing

End Sub

実行すると、以下のように各情報を取得することができます。

エクセルVBAでWord文書の情報を取得

以下、解説をしていきますね。

Word文書のページ数を取得する

まず、ページ数ですが、これは実はちょっとわかりづらいです。

Word文書のページ数を取得するには、WordのRangeオブジェクト(またはSelectionオブジェクト)のInformationプロパティという、指定した範囲の情報を取得するプロパティを使います。

Rangeオブジェクト.Information(Type)

Typeに指定する定数で色々な情報を取得できるのですが、今回は文書のページ数なので「wdNumberOfPagesInDocument」を指定すればOKです。

総ページ数は、RangeオブジェクトよりもDocumentオブジェクトから取得できるのが自然かなぁと思うのですが、そうはなっていないみたいですね。

Word文書の段落数、文数、単語数、文字数を調べる

続いて、Word文書の段落数、文数、単語数、文字数を調べます。

Wordでは、これらの要素は全てオブジェクトとして存在していまして、Documentオブジェクトから、それぞれ対応したコレクションを取得するプロパティがあります。

Documentオブジェクト.Paragraphsプロパティ
Documentオブジェクト.Sentencesプロパティ
Documentオブジェクト.Wordsプロパティ
Documentオブジェクト.Charactersプロパティ

これらのコレクションを取得して、その要素数をCountプロパティでカウントすればOKということになりますね。

ちなみに、日本語の文書の場合、単語数はあまり正確ではないようですので、参考としてどうぞ。

まとめ

以上、エクセルVBAでWord文書を開いて、ページ数、段落数、文数、単語数、文字数を調べる方法をお伝えしました。

今回は一つのWord文書だけでしたが、大量のWord文書について繰り返しを回せば一気に「文書リスト」ができますよね。

次回、その文書リストを作成していきますよ。

どうぞお楽しみに!

連載目次:エクセルVBAでWord文書を操作する方法

Word文書についての情報を集めてリストを作りたい、そんなときはエクセルVBAでWord文書を開いたり、情報を取得したりしたいものです。シリーズでは初心者でもできる、エクセルVBAからのWord文書の操作の仕方をお伝えします。
  1. エクセルVBAでWordを操作して文書を操作する準備と最も簡単なプログラム
  2. エクセルVBAでWord文書を開いてページ数や文字数などのいろんな情報を取得する

エクセルVBAでフォルダ内のWord文書のページ数・文字数などをリスト化する

$
0
0

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

エクセルVBAでWord文書の操作をする方法についてお伝えしています。

前回の記事はコチラ。

エクセルVBAでWord文書を開いてページ数や文字数などのいろんな情報を取得する
エクセルVBAでWord文書を操作する方法についてシリーズでお伝えしております。今回は、起動したWordアプリケーション上にWord文書を開いて、ページ数や文字数などのいろいろな情報を取得します。

エクセルVBAでWord文書を開いてページ数や文字数などの色々な情報を取得する方法をお伝えしました。

今回は、このプログラムを応用して、エクセルVBAでフォルダ内のWord文書の各種情報を取得してリスト化するプログラムを作っていきます。

では、行ってみましょう

前回のおさらい

前回作成したプログラムはこちらです。

Sub Word文書の情報を取得する()

Dim wdApp As Word.Application
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True

Dim wdDoc As Word.Document
Set wdDoc = wdApp.Documents.Open(ThisWorkbook.Path & "\原稿(1章).docx")

With wdDoc
    Debug.Print "ページ数:" & .Content.Information(wdNumberOfPagesInDocument)
    Debug.Print "段落数:" & .Paragraphs.Count
    Debug.Print "文数:" & .Sentences.Count
    Debug.Print "単語数:" & .Words.Count
    Debug.Print "文字数:" & .Characters.Count
End With

wdApp.Visible = False
Set wdApp = Nothing

End Sub

「原稿(1章).docx」というファイルのページ数や段落数など色々な情報を取得するプログラムでした。

7行目~16行目までの処理を、フォルダ内のWord文書について繰り返すように改良をしていきたいと思います。

今回やりたいこと:フォルダ内のWord文書の情報をリスト化

まず、対象となるWord文書を以下フォルダに用意しています。

エクセルVBAで開くWord文書が保存されているフォルダ

現在マクロを記述しているエクセルファイルが「Book1.xlsm」で、情報を取得したいWord文書ファイルが「原稿」というフォルダ内にゴソっと入っているという前提です。

取得した情報について記載するシートは以下の通りです。

エクセルVBAでWord文書の情報を書き出すシート

2行目にSUM関数を仕込んでいて、合計値を算出できるようにしています。なお、このシートのオブジェクト名は「Sheet1」としています。

フォルダ内のWord文書の情報をリスト化するプログラム

では、実際のプログラムを紹介しましょう、

こちらです。

Sub フォルダ内のWord文書の情報を取得する()

Dim wdApp As Word.Application
Set wdApp = CreateObject("Word.Application")
wdApp.Visible = True

Dim objFso As Object
Set objFso = CreateObject("Scripting.FileSystemObject")

Dim path As String
path = ThisWorkbook.path & "\原稿"

Dim objFolder As Object
Set objFolder = objFso.GetFolder(path)

Dim i As Long
i = 3

Dim f As Object
For Each f In objFolder.Files
    With wdApp.Documents.Open(path & "\" & f.Name)
        Sheet1.Range(Sheet1.Cells(i, 1), Sheet1.Cells(i, 6)).Value = Array( _
            f.Name, _
            .Content.Information(wdNumberOfPagesInDocument), _
            .Paragraphs.Count, _
            .Sentences.Count, _
            .Words.Count, _
            .Characters.Count)
        i = i + 1
        .Close
    End With
Next f

wdApp.Visible = False
Set wdApp = Nothing

End Sub

これを実行すると、以下のようにフォルダ内に存在するすべてのWord文書についての情報をリスト化することができます。

エクセルVBAでWord文書の情報を取得

フォルダ内のファイル全てについて処理をする

まず、フォルダ内のファイルについて繰り返し処理をするには、FileSystemオブジェクトとFor Each~Next文を使うのが便利です。

プログラムでいうと

  • 7行目~8行目:objFsoとしてFileSystemオブジェクトの生成
  • 10行目~11行目:対象となるフォルダのパスを変数pathに取得
  • 13行目~14行目:対象となるフォルダをフォルダオブジェクトobjFolderとして取得
  • 20行目~32行目:For Each文でobjFolder内のファイル全てについて繰り返し

という部分です。

それぞれの命令について詳細は以下の記事をご覧ください。

【エクセルVBA】FileSystemオブジェクトとFor Each文でファイル一覧を取得する方法
エクセルVBAでFileSystemオブジェクトを使ってファイルやフォルダの操作をする方法についてお伝えしています。今回は、FilesコレクションとそのFor Each文を使ってファイル一覧を出力する方法です。

WithステートメントとOpenメソッドの組み合わせ

21行目で、現在繰り返しの対象となっているWord文書を開き、それをWithステートメントの対象としてます。

WithステートメントとOpenメソッドの組み合わせの記述です。

With Documentsコレクション.Open(ファイル名)
 ’処理
End With

これにより、Withブロック内では開いたWord文書について、オブジェクト名を省略して記述できるようになります。

便利です。

Word文書の情報を取得

24行目~28行目は前回紹介した部分で、Word文書の各種情報を取得しています。

23行目は、見てわかりますが、Nameプロパティでファイル名を取得している部分です。上から順に、ページ数、段落数、文数、単語数、文字数を取得しています。

Fileオブジェクト.Name

まとめ

以上、エクセルVBAでフォルダ内のWord文書のページ数、文字数などをリスト化するプログラムを紹介しました。

Word文書がたくさんあったとしても、いちいち開いて確認する必要はありませんね。

どうぞご活用ください。

さて、次回はまた別の情報の取得の仕方について、紹介をしていきます。

どうぞお楽しみに!

連載目次:エクセルVBAでWord文書を操作する方法

Word文書についての情報を集めてリストを作りたい、そんなときはエクセルVBAでWord文書を開いたり、情報を取得したりしたいものです。シリーズでは初心者でもできる、エクセルVBAからのWord文書の操作の仕方をお伝えします。
  1. エクセルVBAでWordを操作して文書を操作する準備と最も簡単なプログラム
  2. エクセルVBAでWord文書を開いてページ数や文字数などのいろんな情報を取得する
  3. エクセルVBAでフォルダ内のWord文書のページ数・文字数などをリスト化する

【エクセルVBA】シートで使用されているセルの範囲全てを取得する方法

$
0
0

UsedRange画像

みなさん、こんにちは。
なかじ(@nakaji098)です。

前回は、CurrentRegionプロパティを使って、目的の表の範囲を取得する方法をご紹介しました。

【エクセルVBA】表が変更されても、表全体の範囲を簡単に取得する方法
表の範囲をRangeプロパティで直接指定することでも表に処理を行うことは可能です。しかし、データは日々更新され、表の範囲も変わっていきます。そんな問題を解決してくれるのがCurrentRegionプロパティです。

CurrentRegionプロパティを使用することで、指定したRangeオブジェクトのアクティブセル(=空白行と空白列で囲まれたセル範囲)を取得することができます。

ただ、CurrentRegionプロパティを使用すると、表に空白行がある場合は、取得できる表の範囲が空白行の前までとなってしまいます。

そこで今回は、UsedRangeプロパティを使ってシートで使用されているセルの範囲全てを取得する方法についてご紹介していきたいと思います。
このUsedRangeプロパティを使うことで、表に空白行がある場合でも表全体の範囲を取得することができます。

CurrentRegionプロパティを使って表の範囲を取得する方法

まず、前回のおさらいとしてCurrentRegionプロパティを使って表の範囲を取得する方法を説明します。

Rangeオブジェクト.CurrentRegion

CurrentRegionプロパティを使って表の範囲を取得

Sub 表の範囲を選択()
Worksheets(1).Range("A1").CurrentRegion.Select
End Sub

表範囲選択
A1セル~C5セルが選択されました。

このようにCurrentRegionプロパティを使うことで簡単に表全体の範囲を取得することができます。

表に空白行がある場合

しかし、CurrentRegionプロパティを使って表を取得する場合に気をつけなければならない点があります。

それが表に空白行がある場合です。

Sub 表の範囲を選択()
Worksheets(1).Range("A1").CurrentRegion.Select
End Sub

空白行
選択されたのはA1セル~D4セルで、E行以降は選択されません。
このように表に空白行があると、選択されるのは空白行の前までになります。

CurrentRegionプロパティで表を取得するときは、表に空白行がないかに気をつける必要があります。

UsedRangeプロパティを使ってシートで使用されているセルの範囲全てを取得する方法

表の範囲を取得する方法として、別の方法もあります。
そのひとつがUsedRangeプロパティになります。

Worksheetオブジェクト.UsedRange

UsedRangeプロパティは、指定されたワークシートで使用されているセル範囲を返します。

具体例を挙げてみます。
まず、C4セルにのみデータが入力されて状態で実行してみます。
C4セル

Sub UsedRange例()
Worksheets(1).UsedRange.Select
End Sub

C4セル選択
C4セルが選択されました。

次は、A1セルにもデータを入力して実行します。
A1C4セル

Sub UsedRange例()
Worksheets(1).UsedRange.Select
End Sub

A1C4セル選択

A1セル~C4セルが選択されました。

最後の例として、B2セルとD5セルにデータが入力された状態で実行します。
B2D5セル

Sub UsedRange例()
Worksheets(1).UsedRange.Select
End Sub

B2D5セル選択

B2セルD5セルが選択されました。

このように、UsedRangeプロパティを使うと、使用されている「最初のセルから最後のセル」のセル範囲が取得されます。

UsedRangeプロパティを使って表の範囲を取得

それでは、UsedRangeプロパティを使った表の取得方法をご紹介します。

実際にどのような動きをするか見てみましょう。
表
このような表にUsedRangeプロパティを実行してみます。

Sub 表の範囲を選択()
Worksheets(1).UsedRange.Select
End Sub

UsedRange表

表全体の範囲が取得されました!
このように、ワークシートを指定してUsedRangeプロパティを使うだけで、表全体の範囲が取得できます。
とても便利ですね!

表に空白行がある場合

それではCurrentRegionプロパティではうまく取得することができなかった、空白行がある表の場合を見てみましょう。
表空白あり

Sub 表の範囲を選択()
Worksheets(1).UsedRange.Select
End Sub

UsedRange表2

CurrentRegionプロパティではうまく取得することができませんでしたが、UsedRangeプロパティでは空白行があっても表全体の範囲を取得することができました!

1行目と1列目が空白の場合

1行目と1列目が空白の場合でもUsedRangeプロパティを使えば、簡単に取得することができます。
表空白行列ある

Sub 表の範囲を選択()
Worksheets(1).UsedRange.Select
End Sub

UsedRange表3
B2セルD6セルが選択されました。
使用されている最初のセルから最後のセルのセル範囲が取得されるため、このように1行目と1列目が空白が入っていても、正しく取得することができます。

罫線が引かれている表の場合

このように大変便利なUsedRangeプロパティですが、気をつけなければいけない点もあります。

表罫線
このように、あらかじめ表に罫線が引かれている場合もあると思います。

そのような場合に、UsedRangeプロパティを使うと、どのセル範囲を取得するかを見てみましょう。

Sub 表の範囲を選択()
Worksheets(1).UsedRange.Select
End Sub

UsedRange表4

このように、罫線が引かれている範囲すべてが選択されました。
これは「罫線が引かれている=使用されている」セルということです。
そのため、罫線が引かれている最後のセルが、UsedRangeプロパティのセル範囲の対象となってしまうのです。

また、表に関数が入力されているセルも同様に使用されているセルとなりますので、気をつけてください。

まとめ

今回は、シートで使用しているセル範囲全てをUsedRangeプロパティを使って取得する方法についてご紹介しました。

はじめに、前回ご紹介したCurrentRegionプロパティの使い方を説明しました。

CurrentRegionプロパティで取得できる表の範囲は、Rangeオブジェクトのアクティブセル(=空白行と空白列で囲まれたセル範囲)なので、空白行と空白列がある場合はうまく取得することができませんでした

しかし、UsedRangeプロパティでは指定されたワークシートで使用されているセル範囲を取得できるため、CurrentRegionプロパティでは取得できなかった空白行がある表も取得することができました

ただ、UsedRangeプロパティでは罫線が引かれているセルや関数が入力されているセルを取得してしまうため、その点には気をつける必要があります。

簡単Git入門!ファイル変更時のSourceTreeの動きとコミットを利用したリセット操作

$
0
0

Git入門ロゴ04

ローカル&お一人様ではじめるSourceTreeによるGit入門。

連載3回めの前回では「指定したリポジトリ(ローカルファイル)の状態をSourceTreeに保存(コミット)する」までをご説明しました。

4回目の今回は、リポジトリ内のファイルを編集し、その状態がどのようにGitに記録されるか確認してみたいと思います。

また、コミットのログを利用して、コミットを前の段階までリセットしたり、SourceTreeからリポジトリ内のファイルまで操作してみます。

※作業内容が消えてしまうので、実際の業務ファイルでお試しはやめてください。

前回の状態の確認

前回はリポジトリに指定したフォルダの初期状態をコミットしてGitに覚えてもらいました。

まだフォルダ内の「memo.txt」は白紙の状態です。

Gitの画面は、現状このようになっています。

★ファイルステータス画面

初期状態をコミット済み

★ログ画面

ログ画面

それではひきつづき作業をしていきます。

リポジトリ内のファイルを編集してみよう

リポジトリに指定したフォルダの中に入っている唯一のファイル「memo.txt」を編集してみましょう。

通常通り「Gitテスト」フォルダを開き、「memo.txt」ファイルをダブルクリックしてメモ帳などで開きます。なにかしらテキストを打ち込んで保存してください。

テキスト打ち込み

SourceTreeに戻り、「ファイルステータス」タブを確認すると、一瞬のタイムラグはありますが、「memo.txt」の変更がSourceTreeに読み込まれます。

memo.txtの変更がSourceTreeに反映

左側のエリアには、打ち込んだテキストの内容が表示されていますね。

この段階で再びコミットしてみましょう。

変更作業をコミットしよう

前回と同じ手順ですが、おさらいを兼ねてやってみます。

memoをステージングエリアに送る

「memo.txt」を選択し、「全てインデックスに追加」もしくは「選択をインデックスに追加」ボタンで、ステージングエリアに送ります。

その状態で、コミットのためのコメントを記入しましょう。記入内容は自由ですが、あとからどのような状態を記録しているのか、見て分かる内容にすることが大事でしたね。

コメントを記入してコミット

コミットしたら、ログのタブを開いてみましょう。
コミットされ、作業履歴が保存されているのがわかります。

コミットの確認

これで、変更作業をGitに保存することができました!

現在Gitには、「何も作業してない初期状態」のコミットと、「memo.txtに文章を追加した状態」のコミットが作成されています。

文章を追加してSourceTreeのコミットの範囲を確認

ここでもう少し詳しくSourceTreeの操作を見ていくために、さらにmemo.txtに手を加えてみます。もっと多くの文章を追加してみましょう。

ログ画面でファイルを選択し、ダブルクリックすると該当ファイルを開くことができます。

ダブルクリックで開く

memo.txtに文章を追加してみました。追加した文章には「ダミーテキストジェネレーター」の坊っちゃんを使用させていただきました。

坊っちゃんを追加

memo.txtを保存してから、SourceTreeのログ画面を見てみましょう。変更部分が反映されています。

memo.txtの変更が反映

もし変更内容が反映されていなかったら、SourceTree内のどこかをクリックすると新しい情報を読込んでくれます

SourceTreeにおけるファイルの更新の認識について

SourceTreeでは、リポジトリ(監視下にあるフォルダ)の中のファイルが保存されるとファイルが変更された!と認識してくれます。

保存前の編集作業段階は察知してくれません。つまり保存するまではコミットができません。

ファイル保存 → SourceTreeに反映 → コミットできる!

とおぼえてください。

また初心者な私は、リポジトリ設定さえすれば保存したごとにファイル履歴を自動で取っておいてくれるのかなーと期待していましたが、そんなこともありませんでした。

履歴はコミット操作した分しか残りません。

では、追加分を「坊っちゃんを追加」というコメントと共にコミットしておきましょう。

コミットをリセットしてみる

コミットに慣れたところで、コミットの履歴や、リポジトリ内のファイルをリセット(前の状態に戻す)という作業を行ってみたいと思います。

現在ログ画面では、このようにコミットが連なっています。

坊っちゃんまでのコミット

リセットしたい状態で保存しておいたコミットを選択

今回は一つ前の「最初のテキスト入力」状態まで、リセットしてみましょう。

まず戻したい状態のコミットを選択します。

コミットを選択

その状態で右クリックし、「現在のブランチをこのコミットまでリセット」を選択します。

右クリックでメニュー表示

ウィンドウが開き、Soft・Mixed・Hardの選択を迫られます。説明を見ても意味がさっぱりです。

Softモードを選択

Soft・Mixedはコミットだけを打ち消してくれる

Soft・Mixedを選択すると、コミットのログは「最初のテキスト入力」の状態まで戻ります。

コミットが戻った

画像をよく見ると、ログから「坊っちゃんを追加」のコミットが消えています。最新のコミット情報は、選択した「最初のテキスト入力」時点に戻っています。

が、ここで実際のファイルを見てみると、追加した坊っちゃんの文章自体はmemo.txtに残っています。

Soft・Mixedモードではコミットの記録だけが指定時点に戻り、リポジトリ内のファイル本体に影響はありません。

SoftモードとMixedモードの違い

コミットが指定時点に戻るだけのSoftモードとMixedモード。この2つの違いは、リセットしたコミット時点以降のファイル変更を、インデックスに追加した状態にするか否か、それだけです。

ややこしいですね、実際の画面を見て確認してみましょう。

Softモードの場合

softモード

「Soft - ローカルの変更を全てそのままにする」モードを選ぶと、ログ画面は次のようになります。

Softログ画面

ファイルステータス画面に切り替えると、インデックスにmemo.txtが追加されている状態です。

Softファイルステータス画面

Mixedモードの場合

「Mixed - 作業コピーの変更はそのままにするが、インデックスの状態はリセットする」モードを選ぶと、ログ画面はSoftモード時と同じになります。

Softログ画面

ファイルステータス画面では、Softモードと違いインデックスにはmemo.txtが追加されていません。

Mixedファイルステータス画面

このように、Soft・MixedモードではSourceTree(Git)のコミットの記録だけがリセットされます。

ファイルの状態までリセットしたいならHardモード

リポジトリの中まで綺麗さっぱり戻したいのよ!という衝動に駆られたときに使用するのが、Hardモードです。

Hardモードを選択

Hardモードを選択すると、破壊的なメッセージが表示されます。

破壊的なメッセージ

怯まずYesをクリックしてみました。

コミットがhardに戻った

Soft・Mixedモードでは残っていた「コミットされていない変更があります」が、ありません。

リポジトリ内のmemo.txt本体を確認してみましょう。

失った坊っちゃん

追加した坊っちゃんのテキスト部分が消えています。

コミット履歴及びリポジトリ内のファイルの中身まで、完全に「最初のテキスト入力」でコミットした時の保存状態に戻りました。

まとめ

今回は、リポジトリ内のファイルを編集した時のSourceTree側の動きチェックと、コミットをリセットしたり、ファイル本体も前の状態に戻す作業をやってみました。

ファイルは綺麗に戻せましたが、戻す前の作業(坊っちゃん部分)は永久に失われてしまいました。

このような単純な操作ではなく、「ファイルを一旦もとに戻しつつ、坊っちゃん部分も別で保存」しておけたら大変便利ですよね。

その為に、Git(SourceTree)ではブランチという機能があります。

次回はGitの目玉機能である、ブランチに触れてみようと思いますので、宜しくお願いします。

連載目次:ローカル&お一人様向けSourceTreeによるGit入門

ローカルかつお一人様でもとっても便利なバージョン管理ツール。本シリーズでは操作画面やインストール方法が新しくなったSourceTreeを使って、簡単にGitバージョン管理をする方法をお伝えしていきます。
  1. 簡単Git入門!SourceTreeではじめるローカルバージョン管理
  2. 簡単Git入門!SourceTreeでローカルファイルをリポジトリに指定する
  3. 簡単Git入門!はじめてのコミットでリポジトリ(フォルダ)の初期状態を保存しよう
  4. 簡単Git入門!ファイル変更時のSourceTreeの動きとコミットを利用したリセット操作

【エクセルVBA】Endプロパティを使って表の最終行番号を取得する方法

$
0
0

Endプロパティ画像

みなさん、こんにちは。
なかじ(@nakaji098)です。

前回は、UsedRangeプロパティを使ってシートで使用されているセルの範囲全てを取得する方法をご紹介しました

【エクセルVBA】シートで使用されているセルの範囲全てを取得する方法
今回は、UsedRangeプロパティを使ってシートで使用されているセルの範囲全てを取得する方法についてご紹介していきたいと思います。 このUsedRangeプロパティを使うことで、表に空白行がある場合でも表全体の範囲を取得することもできます。

UsedRangeプロパティでは指定されたワークシートで使用されているセル範囲を取得できるため、CurrentRegionプロパティでは取得できなかった空白行がある表も取得することができました。

今回は、Endプロパティを使って表の最終行番号を取得する方法をご紹介したいと思います。 今回ご紹介するEndプロパティを使用することで、簡単に表の最終行を取得することができます

罫線を引かれている表など、UsedRangeプロパティを使ってもうまく範囲を取得できない場合などに、このEndプロパティを使用することで、表の最終行を取得することができます。

UsedRangeプロパティの説明

まず、前回のおさらいからです。

UsedRangeプロパティは、指定されたワークシートで使用されているセル範囲を返します。

Worksheetオブジェクト.UsedRange

使用されているセルの範囲全てを取得する方法

実際にどのような動きをするか見てみましょう。
表
このような表にUsedRangeプロパティを実行してみます。

Sub 表の範囲を選択()
Worksheets(1).UsedRange.Select
End Sub

UsedRange表

このように、UsedRangeプロパティを使うと、使用されている「最初のセルから最後のセル」のセル範囲が取得されます。

ワークシートを指定してUsedRangeプロパティを使うだけで、表全体の範囲が取得できます。

罫線が引かれている表の範囲を取得する場合

表全体の範囲が簡単に取得できる、大変便利なUsedRangeプロパティですが、気をつけなければいけない点もあります。
表罫線
このように、あらかじめ表に罫線が引かれている場合もあると思います。

そのような場合に、UsedRangeプロパティを使うと、どのセル範囲を取得するかを見てみましょう。

Sub 表の範囲を選択()
Worksheets(1).UsedRange.Select
End Sub

UsedRange表4

罫線が引かれている範囲すべてが選択されました。

これは「罫線が引かれている=使用されている」セルということです。
そのため、罫線が引かれている最後のセルまでが、UsedRangeプロパティのセル範囲の対象となってしまうのです。

また、表に関数が入力されているセルも同様に使用されているセルとなりますので、気をつけてください。

Endプロパティを使って表の最終行番号を取得する方法

ここからは、Endプロパティを使って表の最終行番号を取得する方法をご紹介します。

Rangeオブジェクト.End(Direction)

Endプロパティを使うことで、データが入力されている範囲の終端セルを取得することできます。

Endプロパティの説明

このEndプロパティは引数(Direction)を指定する必要があります。
引数を指定することで、任意のセルから、どの方向の終端セルを取得するかを決めることができるのです。

引数 方向
xlDown
xlUp
xlToLeft
xlToRight

Endプロパティの実行例言葉での説明だけでは、少し難しいと思うので実際の動きを見てみましょう。
表罫線

このような表で実行してみます。

Sub Endプロパティの実行例()
Worksheets(1).Range("A1").End(xlDown).Select
End Sub

Endプロパティ例
ここで指定した引数[xlDown]は、下端のセルを取得する引数です。
指定したA1セルからデータが入力されている範囲の下端のセル、A6セルが指定されました。

これは、Excelのショートカット機能にある、Ctrlと同じです。Excel上で任意のセルを選択し、Ctrl+方向キーを押すことで、データが入力されている範囲の終端セルまで移動することができます。Excelを操作する上でも、大変便利なショートカットキーです。

それではもうひとつ実行してみます。

Sub Endプロパティの実行例()
Worksheets(1).Range("A1").End(xlToRight).Select
End Sub

Endプロパティ例2

ここで指定した引数[xlToRight]は、右端のセルを取得する引数です。

指定したA1セルから右端のセル、D1セルが指定されました。
この他にも、引数には[xlUp][xlToLeft]の2つがあり、上下左右4つの引数を指定することができます。

表の最終行番号を取得する方法

Endプロパティで表の最終行番号を取得する方法Endプロパティを使って表の最終行番号を取得する方法には、大きく分けて2つあります。

ひとつは、先ほど説明した表の最初のセル(ここではA1セル)から下端セルを取得する方法です。

もうひとつの方法が、エクセルシートの最後のセルから上端セルを取得する方法です。

上に挙げた例では、表の最終行セルをSelectメソッドで指定していましたが、行番号はRowプロパティで取得することができます。

Rangeオブジェクト.Row

実際の例で説明します。

下の例はA2セルの行番号を取得しメッセージ画面で表示するコードです。

Sub 行番号取得()
Msgbox Worksheets(1).Range("A2").Row
End Sub

行番号表示

行番号「2」が取得されました。

最初のセル(A1セル)から表の最終行番号を取得する方法

それでは、最初のセル(A1セル)から表の最終行番号を取得する方法です。

それがこちらのコードです。

Sub Endプロパティの実行例()
Msgbox Worksheets(1).Range("A1").End(xlDown).Row
End Sub

行番号表示2

表の最終行番号を取得することができました!

最後のセルから表の最終行番号を取得する方法

それでは次に、エクセルシートの最後のセルから表の最終行番号を取得する方法です。

Sub Endプロパティの実行例()
Msgbox Worksheets(1).Range("A"& rows.count).end(xlup).Row
End Sub

または

Sub Endプロパティの実行例()
Msgbox Worksheets(1).cells(rows.count,1).end(xlup).Row
End Sub

行番号表示2

これで、表の最終行番号できました。

ここで使った、Rows.Countはシートの行数を取得します。
シートの行数はExcel2007以降なら1048576、2003以前なら65536です。
シートの最終行から、上方向に進んでいき、最初にデータが入力されているセルを指定します。

この方法ならば、空白行がある表でも、データが入力されている最終行番号を取得することができます。

まとめ

今回は、Endプロパティを使って表の最終行番号を取得する方法についてご紹介しました。

はじめに、前回ご紹介したUsedRangeプロパティの使い方を説明しました。

UsedRangeプロパティでは指定されたワークシートで使用されているセル範囲を取得できます。ただ、UsedRangeプロパティでは罫線が引かれているセルや関数が入力されているセルを取得してしまうため、その点には気をつける必要があります。

また、Endプロパティを使うことで、簡単に表の最終行を取得することができました。罫線を引かれている表など、UsedRangeプロパティを使ってもうまく範囲を取得できない場合などに、このEndプロパティを使用することで、表の最終行を取得することができます。

連載目次:エクセルVBAでシートのセル範囲を簡単に取得する方法

エクセルVBAでシート上のセル範囲を取得。いつも必要になるのですが、これが意外と難しいと思われませんか? 本シリーズではシート上のデータがあるセル範囲を簡単に、そして上手に取得する方法をお伝えしていきます。
  1. 【エクセルVBA】表が変更されても、表全体の範囲を簡単に取得する方法
  2. 【エクセルVBA】シートで使用されているセルの範囲全てを取得する方法
  3. 【エクセルVBA】Endプロパティを使って表の最終行番号を取得する方法

VBScriptでドラッグアンドドロップで複数ファイルのフルパスをCSVに書き出す

$
0
0

こんにちは!あつもり(@atumori17)です。

前回は「ドラッグアンドドロップしてファイル名とフルパスを取得する方法」を紹介しましたが、今回はその内容をさらに便利にしてお伝えしていこうと思います。

VBScriptでドラッグアンドドロップしてファイルのフルパスを取得する方法
日常業務の中でファイル名のフルパスが知りたいっていうケースがあると思います。そんな時にすぐにファイルのパスがわかると便利ですよね。WScriptオブジェクトのArgumentsプロパティを使うことで、ドラッグアンドドロップしたファイルのフルパスをコレクションとして取得することができます。

前回はドラッグアンドドロップしたファイルのフルパスとファイル名をInputBoxを使って表示させました。

この方法だとファイルが1つの場合は良いのですが、複数ファイルの場合ちょっと不便に感じることがあるかもしれません。例えばエクセルを使ってファイル名とフルパスの一覧表を作成する場合などです。

ファイルの数ぶんコピー&ペーストを繰り返さなければいけませんよね。う~ん。ちょっと何とかならないかな?ってことで今回は「ドラッグアンドドロップで複数ファイルのフルパスをCSVに書き出す方法」を紹介していきます。

 

CSVファイルとはデータをカンマで区切ったテキストファイル

スクリプトの解説に入る前にCSVファイルとは何か?という説明をさせてください。

ひとことで言うと「カンマで区切られた値が入ったテキストファイル」です。CSVはComma Separated Valueの略になります。

CSVファイルはデータベースからデータをエクスポートしてエクセルで加工したり、逆にエクセルで作ったデータをデータベースにインポートしたりなんて時に使います。

このようにCSVファイルはさまざまなソフトと互換性があるので、データのやりとりをするのに使われることが多いファイル形式なんです。

下の画像はデータベースからエクスポートした「商品マスタ.csv」をエクセルで開いた例です。カンマで区切られたデータをセルごと分けて開いてくれます。CSVファイルはエクセルと相性がいいんですね。

ファイルパスをCSVファイルに書き出すスクリプト

CSVとは何かの説明が終わったところで、スクリプトの全文を紹介します。テキストエディタを開き、下記のコードを入力します。

全て入力し終わったら「ファイルのフルパスをCSVに書き出す.vbs」などのファイル名でデスクトップに保存します。

Option Explicit

    'ドラッグアンドドロップで取得したファイルパスを変数に入れる
    Dim GetPathArray
    Set GetPathArray = WScript.Arguments

    Dim objFSO
    Set objFSO = CreateObject("Scripting.FileSystemObject")

    Dim pt

    '配列の内容を出力
    For Each pt in GetPathArray

        '取得したファイル名
        Dim FileName
        FileName = objFSO.GetFileName(pt)

        '取得したフォルダパス
        Dim FolderPath
        FolderPath = objFSO.GetParentFolderName(pt)

        'カンマで連結させてテキストファイルに出力
        OutputText pt & "," & FolderPath & "," & FileName
    Next

    Set objFSO = Nothing

    MsgBox "CSVファイルの書き出しが終わりました"

'テキストファイルへ出力
Function OutputText(ByVal strMsg)

    Dim objFSO
    Dim objText

    Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
    Set objText = objFSO.OpenTextFile("C:\work\ファイルパス.csv", 8, True)

    objText.write strMsg
    objText.write vbCrLf

    objText.close

    Set objFSO = Nothing
    Set objText = Nothing

End Function

プログラムコードの解説

GetParentFolderNameメソッドで親フォルダのパスを取得する

今回はCSVファイルに書き出すということで、せっかくですので親フォルダのパスも取得しようと思います。親フォルダとは指定したファイルが入っているフォルダを指します。

以下の画像を見てください。「マニュアル1.xls」を基準に考えると、親フォルダは「勉強会資料」、親フォルダのパスは「C:\work\勉強会資料」となります。

親フォルダのパスを取得するにはファイルシステムオブジェクトのGetParentFolderNameメソッドを使います。

ファイルシステムオブジェクト.GetParentFolderName(ファイルパス)

ファイルパスには対象ファイルのフルパスを指定します。

自作関数に引数を渡してCSVファイルとして書き出す

OutputText関数は自作した関数です。この関数は引数で渡した値をテキストファイルに書き出すというものです。上記のプログラムコードの31行目から48行目になります。

自作関数のOutputText関数については過去の記事で詳しく紹介していますので参考にしてみてください。

VBScriptでWEBスクレイピング!ファイルシステムオブジェクトでテキストに書き出す
VBScriptでファイルシステムオブジェクトを使ってシンプルにテキストファイルに保存するテクニックの紹介です。せっかくWEBスクレイピングでWEBサイトから必要な情報を取得しても、保存する場所がなければ取得したデータを使うことはできないからです。

今回のアプリケーションではCSVファイルに書き出すので、OutputText関数に渡すデータはカンマで連結させたデータになります。ここではファイルのフルパス、親フォルダのパス、ファイル名をカンマで連結させています。

上記のプログラムコードの23、24行目になります。

'カンマで連結させてテキストファイルに出力
  OutputText pt & "," & FolderPath & "," & FileName

気をつけなければいけないのが、過去の記事で紹介しているOutputText関数は拡張子を.txtとて書き出していましたが、今回はCSVファイルですので拡張子を.csvにします。上記のプログラムコードの38行目になります。

Set objText = objFSO.OpenTextFile("C:\work\ファイルパス.csv", 8, True)

 

プログラムの説明は以上になります。

ドラッグアンドドロップでのCSV書き出しを実行してみる

テスト用のファイルを作成してドラッグアンドドロップする

まずはテスト用のファイルを作ります。今回は「C:\work」フォルダの下に「勉強会資料」フォルダを作り、マニュアル1~5.xlsを作りました。

では実際に起動してみます。デスクトップにある「ファイルのフルパスをCSVに書き出す.vbs」にテスト用に作成したエクセルファイルをドラッグアンドドロップします。

メッセージボックスが表示されたらOKボタンを押します。

「C:\work」フォルダの下にファイルパス.csvファイルができました。

書き出されたCSVファイル開いてみる

それでは書き出されたCSVファイルをテキストエディタで開いてみましょう。開いたファイルを見てみると、ドラッグアンドドロップしたファイルの

  • フルパス
  • 親フォルダのパス
  • ファイル名

カンマで区切られて書き出されていますね。

せっかくなのでエクセルでも開いてみましょう。おお~!いい感じにセルごとにデータが分かれましたっ

まとめ

いかかでしたか?今回の内容をまとめると以下のようになります。

  • CSVファイルはカンマで区切られた値が入ったテキストファイルでエクセルと相性がいい
  • GetParentFolderNameメソッドで親フォルダのパスを取得できる

以上になりますっ。お疲れ様でした~。

連載目次:初心者でも簡単!VBScriptでWindows効率化

Windowsを操作できるプログラミング言語「VBScript」を使って、日々の業務効率化! テキストエディタで簡単にできますので初心者にもおすすめです。
  1. 初心者でも簡単プログラムでWindowsの効率化!VBScriptをやってみよう
  2. VBScriptで複数のファイル・フォルダ・アプリケーションをダブルクリック一発で開く方法
  3. VBScriptで曜日ごとに起動するファイルやフォルダ、アプリケーションを変える
  4. VBScriptでドラッグアンドドロップしてファイルのフルパスを取得する方法
  5. VBScriptでドラッグアンドドロップで複数ファイルのフルパスをCSVに書き出す

Google Apps ScriptでスプレッドシートのグラフをGoogleドライブに保存する

$
0
0

こんにちは!
タダケン(@tadaken3)です。

今回はGoogle Apps Scriptを使って、スプレッドシートに作成されたグラフを画像として、Googleドライブに保存する方法をお伝えいたします。

作成したグラフを保存しておくと、あとでスライド資料を作る際に便利です。とくにグラフが大量にある場合には効果的です。

スプレッドシートにあるグラフを取得する

今回はスプレッドシートにすでにグラフが作成されている状態からスタートします。
こんな感じで折れ線グラフが作成されているとします。

シートに存在しているグラフを取得するにはgetChartsメソッドを使います。getChartsメソッドを使うと、すべてのグラフを配列として取得できます。

書き方は

sheetオブジェクト.getCharts()

です。

実際のコードはこのようになります。

function main() {
  //シート名をして指定してシートを取得します。今回の場合は「graph」シート
  var mySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("graph");

  //getChartsメソッドでシート内のチャートを取得します。配列で取得されます。
  var charts  = mySheet.getCharts();

  //charts配列に格納されたデータから0番目のグラフを画像として取得
  var imageBlob = charts[0].getBlob().getAs('image/png').setName("chart_image.png");
}

上記のサンプルコードでは、getChartsメソッドでチャート取得した後にgetBlobメソッドを使って、グラフを画像として取得しています。

getBlobメソッドについてはこちらの記事で解説していますので、こちらもご覧になってみてください。

【GAS】レポート共有も効率よく!作成したグラフをGmailで送る方法
Google Apps Scriptを使って、作成したグラフをメールで送付するテクニックを紹介します。初心者の方でもグラフ作成から、メールでの共有まで、自動化することができるようになります。

Googleドライブに保存する

フォルダを取得する

Google Apps ScriptでGoogleドライブのフォルダを取得する場合は、DriveAppのgetFolderByIdメソッドを使います。

DriveApp.getFolderById(フォルダID)

これでフォルダをオブジェクトとして取得することができます。

IDをどのように知るかと言うと、フォルダであればGoogleドライブでそのフォルダを開いている際のURLの

https://drive.google.com/drive/folders/{フォルダID}

の部分です。

Googleドライブでフォルダを操作する方法については以下の記事もご参考にしてみてくださいね。

Google Apps ScriptでGoogleドライブを操作する最も簡単なスクリプト
Google Apps ScriptでGoogleドライブを操作する最も簡単なスクリプトとしてGoogleドライブのフォルダとファイルをIDで取得してログ出力するスクリプトついてお伝えします。

フォルダにファイルを作成する

フォルダにファイルを追加するには、createFileメソッドを使います。

このように書きます。

folderオブジェクト.createFile(作成するファイル)

先程シートから取得したグラフ画像をcreateFileメソッドに渡してあげればオッケーです。

function main() {
  //シート名をして指定してシートを取得します。今回の場合は「graph」シート
  var mySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("graph");

  //getChartsメソッドでシート内のチャートを取得します。配列で取得されます。
  var charts  = mySheet.getCharts();

  //charts配列に格納されたデータから0番目のグラフを画像として取得
  var imageBlob = charts[0].getBlob().getAs('image/png').setName("chart_image.png");

  //フォルダIDを指定して、フォルダを取得
  var folder = DriveApp.getFolderById('フォルダID');

  //フォルダにcreateFileメソッドを実行して、ファイルを作成
  folder.createFile(imageBlob);
}

スクリプトを実行して、グラフ画像がGoogleドライブに保存されたら成功です。

まとめ

今回は

  • getChartsメソッドを使って、スプレッドシートからグラフを取得する方法
  • createFileメソッドで、Googleドライブにファイルを作成する方法

をお伝えしました。グラフを大量に保存したい場合や、グラフ作成を自動化していてグラフの保存も自動化したい場合に活用できるテクニックです。

次回もGoogle Apps Scriptのテクニックをご紹介していきすね。

どうぞ、お楽しみに!

Twiiterで仕事効率化やプログラミングに関することを情報を発信しています。「いつも隣にITのお仕事」の裏話をお伝えしたり、読者の方と交流したりしています。こちらからTwitterアカウントのフォローをお願い致します。

連載目次:GASでデータ分析!グラフを作成してデータの可視化

スプレッドシートを使う業務の中で多いのがデータの集計・分析作業です。データからインサイトを引き出すコツは「可視化」してデータを見えるようにすること。このシリーズではGoogleスプレッドシートでの集計・分析作業の効率を上げるための、Google Apps Scriptのテクニックを紹介します。
  1. Google Apps Scriptでグラフを作成する方法の最初の一歩
  2. 【グラフで説得力をあげる】Google Apps Scriptでグラフの種類を変更する方法
  3. 【複数の要素もひと目で分かる】Google Apps Scriptで積み上げ棒グラフを作成する方法
  4. 【意図を明確に】Google Apps ScriptのsetOptionメソッドでグラフタイトル・凡例を編集する方法
  5. Google Apps ScriptのsetColorsメソッドでグラフの色を設定する方法
  6. 【GAS】レポート共有も効率よく!作成したグラフをGmailで送る方法
  7. 【GAS】スプレッドシートをPDFにしてGmailで送付する方法

【エクセルVBA】Endプロパティで表全体の範囲を取得する方法

$
0
0

paper-2095674_1920
みなさん、こんにちは。
なかじ(@nakaji098)です。

前回は、Endプロパティを使用して表の最終行を取得する方法をご紹介しました。

【エクセルVBA】Endプロパティを使って表の最終行番号を取得する方法
今回は、Endプロパティを使って表の最終行番号を取得する方法をご紹介したいと思います。 今回ご紹介するEndプロパティを使用することで、簡単に表の最終行を取得することができます。

空白行がある表や罫線を引かれている表など、CurrentRegionやUsedRangeプロパティを使ってもうまく範囲を取得できない場合などに、このEndプロパティを使用することで、表の最終行を取得することができました。

今回は、前回から発展させて、Endプロパティで表全体の範囲を取得する方法をご紹介していきたいと思います。

Endプロパティを使えば、簡単に表の最終行を取得することができるので、それを少し応用して、Endプロパティを使って表全体の範囲を取得する方法をご紹介します。

Endプロパティで表の最終行を取得する方法

まずは、前回のおさらいからしていきたいと思います。

Endプロパティは、データが入力されている範囲の終端セルを取得することできます。

Rangeオブジェクト.End(Direction)

引数(Direction)を指定することで、任意のセルから、どの方向の終端セルを取得するかを決めることができるのです。

引数 方向
xlDown
xlUp
xlToLeft
xlToRight

最後のセルから表の最終行番号を取得する方法

表の最終行を取得する方法を説明していきます。

まず、行番号の取得はRowプロパティを使います。

Rangeオブジェクト.Row

それでは、最後のセルから表の最終行番号を取得する方法です。

この表を使って説明します。
表罫線

それでは実際のコードです。

Sub Endプロパティの実行例()
Msgbox Worksheets(1).Range("A"& rows.count).end(xlup).Row
End Sub

または

Sub Endプロパティの実行例()
Msgbox Worksheets(1).cells(rows.count,1).end(xlup).Row
End Sub

行番号表示2
これで、表の最終行番号できました。

ここで使ったRows.Countは、シートの行数を取得します。
シートの行数はExcel2007以降なら1048576、2003以前なら65536です。
シートの最終行から、上方向に進んでいき、最初にデータが入力されているセルを指定します。

この方法ならば、空白行がある表でも、データが入力されている最終行番号を取得することができます。

前回は、最初の行(A1セル)から表の最終行を取得する方法も説明しましたが、今回はより実務でも使い勝手のよい、最後のセルから表の最終行番号を取得する方法を使って、この後の表全体の範囲を取得する方法を説明していきます。

Endプロパティで表全体の範囲を取得する方法

それでは、ここから今回のテーマである、Endプロパティで表全体の範囲を取得する方法について説明していきたいと思います。

表の右下端のセルを取得する方法

Endプロパティを使って表全体の範囲を取得するためには、表の右下端のセルを取得する必要があります。

表の右下端のセルを取得するにはこのようなコードになります。

Sub Endプロパティの実行例()
Worksheets(1).Cells(Rows.Count,1).End(xlup).End(xlToRight).Select
End Sub

Endプロパティ例2

D6セルを取得することができました。

解説しますと、表のA列最終セル(A6セル)を取得し、そこから右方向の終端セルを取得しました。
見てわかるように、Endプロパティは1つのコードの中で2回使えます。

表全体の範囲を取得する方法

それでは実際に表全体の範囲を取得します。

Sub 表の範囲取得()
Worksheets(1).Range("A1", Worksheets(1).Cells(Rows.Count,1).End(xlup).End(xlToRight)).Select
End Sub

Endプロパティ例12

表全体の範囲が取得されました!

でも、よくわかりませんね。。
ということで、すこし解説したいと思います。

まず、Rangeオブジェクトで表の範囲を直接指定する方法です。

Worksheetオブジェクト.Range(アドレス)

Rangeプロパティの引数に表の範囲のアドレスを直接指定することで、表全体の範囲を選択できます。

今回の場合ですと、こうなります。

Sub Rangeオブジェクト表範囲()
Worksheets(1).Range("A1","D6").select
End Sub

Endプロパティ例12

このアドレスに指定するセルに、Endプロパティで取得セルを指定したものが今回の方法です。この場合ですと、D6セルに指定していたところを、Endプロパティを使ってセルを指定しました。

この方法ならば、空白行がある表や、罫線が引かれている表であっても、データが入力されている表全体の範囲を取得することができます。

コードの簡素化

このコードでも問題はありませんが、やはり見にくいので、少しすっきりさせたコードに変えてみます。

Withステートメント

Withステートメントを使って読みやすくしてみます。

Sub 表の範囲取得()

With Worksheets(1)
    .Range("A1", .Cells(Rows.Count, 1).End(xlUp).End(xlToRight)).Select
End With

End Sub

これで少し見やすくなりましたね。

変数に格納

少し難しくなりますが、もっと見やすくすることもできます。

取得した右下端のセルをRangeオブジェクト変数に格納する方法です。

Sub 表の範囲取得()

Dim lastCell As Range
Set lastCell = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).End(xlToRight)

Worksheets(1).Range("A1", lastCell).Select

End Sub

解説しますと、変数lastCellに右下端のセルを格納します。
そして、変数lastCellを表の範囲のアドレスに指定します。

このとき、オブジェクトを変数に格納するので、Setステートメント使う必要があります。

まとめ

今回は、Endプロパティで表全体の範囲を取得する方法についてご紹介しました。

はじめに、前回ご紹介したEndプロパティを使用して表の最終行を取得する方法を説明しました。
Endプロパティを使うことで、データが入力されている表の最終行を簡単に取得することができました。

そして今回は、前回ご紹介した内容を発展させて、Endプロパティで表全体の範囲を取得する方法についてご紹介しました。
この方法を使うことで、空白行がある表や罫線が引かれている表であっても、データが入力されている表全体の範囲を取得することができます。

そして、コードが複雑になり読みにくい場合は、Withステートメント変数を使うことで、より見やすいコードに変えることもできます。

連載目次:エクセルVBAでシートのセル範囲を簡単に取得する方法

エクセルVBAでシート上のセル範囲を取得。いつも必要になるのですが、これが意外と難しいと思われませんか? 本シリーズではシート上のデータがあるセル範囲を簡単に、そして上手に取得する方法をお伝えしていきます。
  1. 【エクセルVBA】表が変更されても、表全体の範囲を簡単に取得する方法
  2. 【エクセルVBA】シートで使用されているセルの範囲全てを取得する方法
  3. 【エクセルVBA】Endプロパティを使って表の最終行番号を取得する方法
  4. 【エクセルVBA】Endプロパティで表全体の範囲を取得する方法

これからは蓄積すべきコンテンツとして音声や動画の重要性が高まると思ってます

$
0
0
voice

photo credit: haru__q DSC02317c2 via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

久しぶりにブログを書いています。

前回書いた記事が9/23ですから、まるっと2週間。

その間、寄稿チームの皆さんが支えてくださいました、感謝です。

この2週間、何をしていたかというと、引きこもっておりました。詳しくは現段階ではまだお話できませんが、とある作業を集中的に行っていました。

それが無事に終わり、ようやく下界(?)をしてきまして、今にいたるということです。

さて、価値があり、かつ蓄積があることに、限られた自分の時間を使うべきということを意識して日々活動をしているわけで、そういう記事も何度か書いています。

人生は選択の連続、いかにして多くの選択肢を用意し価値のある選択をするか
人生は選択の連続である、有名な言葉です。当然仕事においてももちろん分岐点はたくさんありますが、あるルールを持って選択をすると良いと思っていることがありまして、今回はそれをこっそりお伝えします。

さて、ビジネスパーソンにとって、ブログをはじめテキストコンテンツを蓄積していくことは大きな武器になるのですが、「蓄積するコンテンツ」という視点では大きな変化のときを迎えているのではないかと感じています。

つまり、これから音声と動画の時代が本格的になるのではないかと…!

今回は、それについて書いておきたいと思います。

テキスト検索の功績とは何か

1998年にGoogleが誕生しました。

それまで情報を得るための手段は、伝聞、書籍に加えて新聞、ラジオ、テレビなどのマスメディアが中心だったわけですが、Googleのおかげで、それに加えてWeb検索という手法が追加されました。

Web検索が画期的なのは、情報が欲しい人のニーズにマッチしたものを、大量のデータベースの中から、素早く取り出せる、という点です。

伝聞だと詳しい人を捕まえる必要がありますし、マスメディアからは一方的な情報しか得られません。

唯一、書籍は書店や図書館などである程度の分類がなされて、探し出すことができたのですが、それをさらに「検索」という手法を用いて細分化&大量化そして手軽化したのがGoogleの大功績なのではないかと思っています。

発信側のほうがメリットがある?

さて、ここで一点、確認をしておくべきことがあります。

情報というのは、受け取る方にメリットがあるというのは当然なのですが、実は受け取ってもらったほうには、場合によってはそれ以上の価値があったりします。

マスメディアにせよ、ネットメディアにせよ、広告の閲覧が増えればその分収益になります。

このブログはどちらかというと直接的な収益を狙っているわけではありませんが、マーケティングやブランディングの価値を想定しながら運営を開始しました。今となっては、それ以上の価値もたくさんあります。

出版のお話とか、そういうのはブログをやっていなければ、まずなかった話なのです。

ブログ開設からたった2年で私が出版のチャンスを得た理由
この度「ExcelVBAを実務で使い倒す技術」という本を書きました。オファーを頂けたのは、ブログのおかげ…開始から2年という短さでチャンスを得られたのには、いくつかのポイントがあったと思います。

あと、重要な点として、情報の発信力が強いと、群衆をコントロールできるという側面もあります。

例えば、先日の小泉進次郎氏のコメントは非常に痛快でした。

「新聞の軽減税率、おかしいですよね。なんで新聞だけ(消費税率が)10%になっても8%のままなんですか。新聞は全部、消費増税に賛成なのに、自分たちには課されないんですよ。おかしくないですか。どこも報じませんよね?」

記者たちも茫然目の前にいる女性記者の手は小刻みに震えていた。「なんで万歳するんですか?」彼女から「なぜ解散の瞬間に万歳をしなかったのか」と訊かれた小泉進次郎は、とっさにそう返した。衆院解散の直後、進次

発信力がある人たちは、知って欲しいことを余計に発信し、知って欲しくないことを言わない、そういうコントロールができるということの一つの例だと思います。

テキストを書きなぐることで入手できる発信力

さて、話を戻しますと、Googleのおかげで、そういうマスメディアだけではなくて、我々のような小市民が発信力を手に入れることができるようになりました。

これは、とても大きなことです。

超大変ですが、毎日頑張ってテキストを書きなぐって、きちんとユーザーに届く発信をし続ければ、

  • 収益を上げ
  • マーケティングやブランディングをし
  • スキルも磨きながら
  • チャンスに巡り合う確率も上げ
  • なおかつ人を動かせる発信力を手にできる

のです。

こんなに素晴らしいことはないのですが、多くの人は「習慣化の難しさ」や「手段の目的化」、または「短期的視点」という壁に阻まれ、そこまでのメリットを享受できずにいます。

音声がストック価値の高いコンテンツになる

ということで、企業も個人もどんどんブログをやればいいよ、っていつも思っていたのですが、それだけでは済まなくなってきたのでは?と思っています。

例えば、このようなニュースがありました。

聴衆の誰もが度肝を抜かれたのがリアルタイム翻訳機能だった。壇上の会話が英語からスウェーデン語へと滞りなく翻訳される。話者が話し終えてから1~2秒後に翻訳が始まる。発表者はこれを「まるで専任の通訳が横にいるようだ」と得意げに語った。

今日行われたGoogleのハードウェアイベントで驚かされたものの一つが、BluetoothイヤホンのPixel Budsだ。首の後ろでワイヤーが繋がってはいるが、あらゆる意味でApple AirPodsのライバルだ。

また、音声でいうと流行りのスマートスピーカーも話題です。

「最新のニュースを教えて」「今日の予定は?」「サザンオールスターズを再生して」「この曲名は?」「今日は何の日?」「リスの鳴き声は?」「リスって英語で何ていうの?」「卵をショッピングリストに登録して」「タイマーを10分に設定して」などと話しかけると、Google Homeが音声で対応する。当然ながら、「Googleカレンダー」「Googleマップ」などとは自動的に連動する。

グーグルは2017年10月5日、日本語に対応した同社のスマートスピーカー「Google Home」を、日本で販売すると発表した。販売されるのは、2016年11月から存在している機種「Google Home」と、本社が発表したばかりのコンパクトなAmazon Echo Dot対抗機種の「Google Home Mini」...

というか、既に音声入力対応のアプリケーションがたくさん登場しています。

音声が検索可能なデータになる

もう、おわかりだと思うのですが、これからは音声そのものが検索可能なデータとして圧倒的に活躍しそうな勢いがあります。

音声が認識されれば、データベース化ができるというわけで、データベース化ができれば検索が可能になるのは必然です。

さらに、音声には、感情や間、キャラクターなどといった情報も乗り、表現力が多彩です。

プラス、音声がOKなら、視覚情報を付与して動画もアリということになります。

何が言いたいかというと、YouTubeがGoogleと同様またはそれ以上のパワーを持つ強力な検索データベースになり得るということです。

だから、これからはテキストだけでなく、音声や動画のストックもできるようにしておくのがいいよ、と思っているのですが、皆さんどう思いますか?

まとめ

蓄積可能な価値として、Webや印刷物としての「テキスト」以外に「音声・動画」がこれから来るのでは!?ということをお話してきました。

最近では、資産として「スキル」や、リアルやSNSの「つながり」も価値を増しているように思います。

また、VALUやTimeBankのような「信用」が新たな価値として注目されるようになってきましたね。

今日という時間を単純にお金に換金するだけはなくて、何かしらかの価値を未来に蓄積するということ、さらにその方法も多様化していて見極めが必要だ、そんな局面になってきていると感じました。

VBScriptでWEBスクレイピング!テーブル要素を取得してCSVファイルで書き出す

$
0
0

こんにちは!あつもり(@atumori17)です。

VBScriptでIEを操作してWEBスクレイピング!の第8回目で~す。
前回は「ページ内にあるhタグを取得してHTMLとして書き出す」ところまでやりました。

VBScriptでWEBスクレイピング!hタグを取得してHTMLとして書き出す
ページ内にあるhタグの要素全体を抜き出してHTMLファイルとして書き出す方法を紹介します。getElementsByTagNameメソッドでh要素のコレクションを取得します。取得したコレクションFor Each文で一つ一つの要素にバラしてHTMLに書き出します。

今回は「ページ内にあるテーブル要素を取得してCSVファイルとして書き出す」方法を紹介します。

前回のhタグはHTMLファイルとして書き出しましたが、今回はCSVファイルに書き出していきます。

というのも取得した情報をCSVファイルで書き出しておけば、他のアプリケーションへの流用が効くので便利だからです。特にエクセルとの相性は抜群ですっ。

テーブル要素を取得してCSVファイルで書き出すスクリプト

ではまずスクリプトの全文を紹介します。テキストエディタを開き下記のコードを入力します。全て入力し終わったら「テーブル要素をCSVで書き出す.vbs」のファイル名でデスクトップに保存します。

Option Explicit

    Dim objIE
    Dim objLink

    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True

    'IEを開く
     objIE.navigate "http://elze.tanosii.net/d/kenmei.htm"

    'ページが読み込まれるまで待つ
    Do While objIE.Busy = True Or objIE.readyState <> 4
        WScript.Sleep 100
    Loop


    Dim objTr,objTh,objTd
    Dim el

    'tr要素をコレクションとして取得して変数にセット
    Set objTr = objIE.document.getElementsByTagName("tr")

    'テーブル要素をcsvファイルに書き出す
    For each el In objTr

        If instr(el.outerhtml,"<th>") > 0 then
            Set objTh = el.getElementsByTagName("th")
            OutputText objTh(0).innerText & "," & objTh(1).innerText & "," & objTh(2).innerText
        Else
            Set objTd = el.getElementsByTagName("td")
            OutputText objTd(0).innerText & "," & objTd(1).innerText & "," & objTd(2).innerText
        End If
    next

'テキストファイルへ出力
Function OutputText(ByVal strMsg)

    Dim objFSO
    Dim objText

    Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
    Set objText = objFSO.OpenTextFile("C:\work\テーブル要素の書き出し結果.csv", 8, True)

    objText.write strMsg
    objText.write vbCrLf

    objText.close

    Set objFSO = Nothing
    Set objText = Nothing

End Function

プログラムコードの解説

全体の流れは以下のようになります。

  1. IEでページを開く
  2. IEの読み込み待ちをする
  3. tr要素をコレクションとして取得する
  4. th、td要素をコレクションとして取得する
  5. 取得したth、td要素をCSVファイルに書き出す

今回はまずtr要素をコレクションとして取得してから、th、tdの要素内容をCSVファイルに書き出していきます。

HTMLのテーブル要素の仕組み

コードの説明に入る前にHTMLのテーブルの仕組みについて少しお話したいと思います。

HTMLで言うテーブルとは表のことです。テーブルは<table>、<tr>、<td>といったタグでできています。

今回テーブル要素を取得するのに下記のサイトを参考にさせていただきました。

エルゼの森というサイトで全国の県庁所在地の情報が載っています。

それではまずは下の画像を見て下さい。

大枠のテーブルはtable要素からできていて、その中に行を定義するtr要素が入っています。

さらにtr要素の中に見出しを定義するth要素、表のデータを定義するtd要素が入っています。

table要素→tr要素→th要素、td要素というように入れ子になっているんですね。

実際のHTMLコードと見比べてみると何となくイメージがつかめると思います。

tableタグの中にtrタグ、thタグ、tdタグが入れ子になっているのがわかると思います。

<table>
<tr>
<th></th>
<td></td>
</tr>
</table>

同じような名前のタグが並ぶので始めは理解しずらいかもしれませんね。しかしHTMLのテーブル構造はWEBスレイピングを行ううえでとても重要になりますので、しっかり覚えておきましょう。

getElementsByTagNameメソッドでテーブル内のデータを取得する

それでは早速テーブル要素を取得してみたいと思います。

まずはtr要素をコレクションとして取得し、For Each文を使って取得したtr要素ぶんだけ繰り返す処理を行います。上記プログラムコードの21~34行目になります。

'tr要素をコレクションとして取得して変数にセット
    Set objTr = objIE.document.getElementsByTagName("tr")

    'テーブル要素をcsvファイルに書き出す
    For each el In objTr
     'th、td要素を書き出す処理
    next

outerhtmlプロパティでtr要素をタグごと取得する

For Each文でtr要素ぶんだけ繰り返しますが、まずtr要素をouterhtmlプロパティを使ってタグごと抜き出します。

今回の場合、outerhtmlで抜き出したデータは

<th>県番号</th><th>都道府県名</th>th>都道府県名</th>

のようになります。

InStr関数を使ってタグ名ごとに処理を変える

続いてouterhtmlで抜き出したtr要素にthタグが含まれているかを調べます。そのためにInStr関数を使います。

instr(“検索対象の文字列”,”検索したい文字”)

InStr関数は検索対象の文字列に検索したい文字があった場合、その文字がある位置を返す関数です。今回のプログラムではthタグがあるか調べたいので、thを検索したい文字に指定しています。

検索したい文字がなかった場合は0を返します。反対に文字があった場合は整数を返すわけです。そのことを利用して0より大きい場合はIF以下の処理をするというようにしています。

If instr(el.outerhtml,"<th>") > 0 then
'th要素を書き出す処理

つまりInStr関数でtr要素にthタグが含まれているかどうかを調べ、

  • thタグだったら、innerTextでth要素内のテキストデータをCSVファイルで書き出す
  • thタグでなかったら、innerTextでtd要素内のテキストデータをCSVファイルで書き出す

というように処理を分けています。

なぜ処理を分けるのかというと、取得したtr要素にth要素がなかった場合エラーになるためです。

Set objTh = el.getElementsByTagName("th")
OutputText objTh(0).innerText & "," & objTh(1).innerText & "," &

ここでオブジェクト変数objThにth要素のコレクションを入れていますが、取得したコレクションの中にth要素がなかった場合、次の行でエラーになります。OutputText関数に渡す引数であるobjTh(0)が存在しないためです。

th要素をコレクションとして取得してCSVファイルに書き出す

続いてtr要素からth要素をコレクションとして取得します。今回の場合、th要素は表の一番上にある見出し部分だけです。つまり見出しセルに入っていて太字で表示されている、

県番号、都道府県名、県庁所在地

になります。この見出しデータを取り出すには

  1. tr要素からth要素をコレクションとして取得する
  2. 取得したコレクションの1~3番目のth要素のテキストをCSVに書き出す

という流れになります。

まずth要素として取得したコレクションをオブジェクト変数objThにをセットします。

取得したth要素のコレクションは配列として0番目から変数objThに格納されますので、0~2番目を指定しています。

CSVファイルに書き出すのはth要素内のテキストデータだけにしたいので、innerTextプロパティを使います。

Set objTh = el.getElementsByTagName("th")
OutputText objTh(0).innerText & "," & objTh(1).innerText & "," & objTh(2).innerText

これで表の見出しであるth要素をCSVファイルに書き出すことができました。

td要素をコレクションとして取得してCSVファイルに書き出す

続いてtr要素からtd要素をコレクションとして取得します。td要素は表の中のデータですね。

1、北海道(ほっかいどう)、札幌(さっぽろ)

などのデータになります。th要素と同じ手順で

  1. tr要素からtd要素をコレクションとして取得する
  2. 取得したコレクションの1~3番目のtd要素のテキストをCSVに書き出す

というような流れで行います。

さきほとと同じように、CSVファイルに書き出すのはtd要素内のテキストデータだけにしたいので、innerTextプロパティを使います

Set objTd = el.getElementsByTagName("td")
OutputText objTd(0).innerText & "," & objTd(1).innerText & "," & objTd(2).innerText

CSVにデータを書き出す方法については過去の記事で紹介していますので参考にしてみてください。

VBScriptでドラッグアンドドロップで複数ファイルのフルパスをCSVに書き出す
ドラッグアンドドロップした複数ファイルのフルパス、親フォルダのパス、ファイル名をCSVファイルに書き出す方法を紹介します。CSVファイルは色々なアプリケーションと互換性があるので便利だからです。特にエクセルで開いてデータを加工するときに役に立ちますよ。

プログラムコードの解説は以上です。

table要素をCSVファイルで書き出してみる

では実際にアプリケーションを起動してみます。デスクトップにある「table要素をCSVで書き出す.vbs」をダブルクリックします。

C:\workフォルダに「テーブル要素の書き出し結果.csv」ファイルができました。

テキストエディタで開くとテーブル要素が取得されたのがわかりますね。

さらにエクセルで開いてみるとこんな感じでセルごとにデータが分かれて表示されます。エクセルとの相性がいいところが、CSVファイルの良いところですよね~。

まとめ

いかかでしたか?今回の内容をまとめると以下のようになります。

  • tableの仕組みを理解することはWEBスクレイピングをやる上で重要なポイントです
  • コレクションとして取得したtr要素から、さらにth、td要素をコレクションとして取得する
  • CSVファイルで書き出しておくとエクセルで開けるので便利

今回は以上です。それではお疲れさまでした~。

連載目次:VBScriptでお手軽WEBスクレイピング

Windowsを操作できるプログラミング言語「VBScript」を使えば、InternetExplorerを操作してWEBスクレイピングが可能です。 これで日々の情報収集はダブルクリック一発で完了させましょう!
  1. VBScriptでInternet Explorerを使って複数WEBサイトをダブルクリック一発で開く方法
  2. VBScriptでWEBスクレイピング!ファイルシステムオブジェクトでテキストに書き出す
  3. VBScriptでWEBスクレイピング!HTMLドキュメントとタイトルを取得する方法
  4. VBScriptでWEBスクレイピング!ブラウザの読み込み待ちをしてエラーを回避する
  5. VBScriptでWEBスクレイピング!aタグのリンクURLを全部取得する方法
  6. VBScriptでWEBスクレイピング!aタグのリンクURLをHTMLとして書き出す
  7. VBScriptでWEBスクレイピング!hタグを取得してHTMLとして書き出す
  8. VBScriptでWEBスクレイピング!テーブル要素を取得してCSVファイルで書き出す

動画配信でビジネスを加速させるために必要なことはブログと全く同じで驚いた話

$
0
0

self-cast

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

さて、これからビジネスの武器とするために蓄積すべきコンテンツとして、ブログ(つまりテキスト)以外に音声や動画が今後ますます重要になるよ、という記事を書きました。

以下の記事ですが、反響ありました。

これからは蓄積すべきコンテンツとして音声や動画の重要性が高まると思ってます
ブログをはじめテキストコンテンツを蓄積していくことは大きな武器になるのですが、「蓄積するコンテンツ」という視点では大きな変化のときを迎えています。つまり、これから音声と動画の時代が本格的になるということです。

それで、さっそく勉強だ!ということで、以下ツイートしたように書籍を買いまして、読みつくしました。

このセルフキャスト! ~ビジネスを加速させる動画配信を読んで驚きの連続だったので、紹介したいと思います。

ビジネスに有効な動画配信

動画配信というと、パっと思い浮かぶのはHIKAKINをはじめとするユーチューバーだったりとか、ピコ太郎だったりとか、どちらかというとエンターテイメント性の強いコンテンツを思い浮かべますが、本書が目標としているのは「ビジネスへの動画活用」です。

どちらかというと、動画の撮影や、編集などのテクニカルな内容はそんなに厚くなく

  • 動画配信の歴史と取り巻く環境
  • なぜ動画配信がビジネスの武器になるのか?
  • 成功するためには、どのような心持ちや体制で臨むべきか?

といった、どちらかというと動画配信をビジネスに活用する際の原理原則をまとめた本です。

そして、大山ハッピーロードやTBC受験研究会などの好例がこれでもか!…と紹介されています。

つまり、「はじめに」の言葉を借りると

主にビジネスパーソン向けに、「気軽に動画配信をしよう」と呼びかけるのがこの本である。

というわけです。

とはいっても動画配信って大変なんでしょ!?

しかし、読み進めるとその「動画配信しよう!」という軽いノリはぶち壊されることになります。

本書では、前で動画を制作し配信することを「セルフキャスト」と定義していますが、

セルフキャストを始めたばかりの頃は、労力をかけたわりにはあまり効果が出ないという結果になってしまう

とか

セルフキャストを立ち上げる時には、継続して取り組むという固い意志を持ったキーパーソンが不可欠

さらには

ビジネスで考えた時に、アクセスだけ稼げればお金が儲かるかというとそうではない

など、やる気がねえ奴は帰れ!的な厳しい言葉が、ご丁寧に太字で投げかけられます。

これはつらい…。

動画とブログの類似点

ただ、私は思いました。これはチャンスだと。しめしめ、と。

なぜなら、そのポイントがブログ運営にとても似ているからです。

蓄積配信

まず「蓄積配信」があります。

セルフキャストでは、配信された動画はYouTube内に蓄積されていく。そして動画が蓄積されていくごとに、どんどん視聴数が伸びていく

著者の千種伸彰さんは元報道番組のディレクターさんということで、いわゆるテレビの「ブロードキャスト」と「セルフキャスト」を対比されて語られているのですが、放映時間に限界があるテレビと最も異なる点としてこの蓄積を挙げられていて、蓄積が増えると検索されやすくなる、と。

何かと似ていますよね?

そうなんです、ブログと同じです。

人生は選択の連続、いかにして多くの選択肢を用意し価値のある選択をするか
人生は選択の連続である、有名な言葉です。当然仕事においてももちろん分岐点はたくさんありますが、あるルールを持って選択をすると良いと思っていることがありまして、今回はそれをこっそりお伝えします。

そして、今後は動画コンテンツ内の音声も構造化されて、検索対象になる可能性が高いと踏んでいます。

長期的に継続的に

制作コストがかけられないので、大衆の多くを取り込むような王道コンテンツは勝負が厳しいです。

そうなると、セルフキャストのねらい目は「ロングテール」となります。

たまにしか売れないような本であっても、長い時間をかけてでもたくさんのアイテムが売れてくれれば、結果的にベストセラー並みの売上が見込める。

ですから、長期的な視点で評価をする必要があります。

ちなみに、これをドでかいサイズで実現しているのがAmazonですよね。

ビジネスを考えると「今月の売上ガー利益ガー」なんて言っている企業はまず手を付けられません。これもブログとおんなじ。

近視眼的な目標に縛られずに、長期的な視点で体制を作って習慣化できるビジネスパーソンまたはチームが有利な領域なのです。

継続は力なり!その真髄と始める前に考えるべきたった1つのこと
皆さんよくご存知の「継続は力なり」。うまく実践するとお仕事はもちろん、日々を生き生きとすることができますよね。今回はこの言葉について、調べたこと体験したこと、あとはちょっとしたポイントについてお伝えします。

何かととっても似ていませんか?

そう、ブログと一緒です。

棚卸効果

本書では「棚卸効果」とワーディングされているのですが、動画配信の活動には、自分自身や自分の商品、ウリ、魅力などを棚卸する効果があるんですって。

自分の動画を取る際には当然、自分のことを改めて調べ、どこが魅力なのかをチェックすることになるだろう。そうなれば、自分の「棚卸」をすることになる。その作業自体が自分の魅力を再発見することにつながるはずだ。

これもブログと同じですね!

マネタイズポイントの設計

動画配信は無料での配信が前提になりますから

どこでマネタイズをするのかをしっかりと設計していくことが必要

になってきます。

ちょっと耳が痛いですね。

いっくらチャンネル登録が増えたって、視聴数が増えたって、うまくマネタイズできないと継続性が担保できません。

なにせ、成果が出るのには時間がかかりますから、きちんとマネタイズができないと辛い日々が…もっと続くと…。

祝ブログ2周年!これまでのPV・広告収益・受注件数を晒します
めでたいことに、当ブログ「いつも隣にITのお仕事」は2周年を迎えることができました!ブログを2年続けるとPVはどうなるのか?儲かるのか?何かの役に立ったのか?ということを振り返ってみたいと思います。

ブログと動画の両立はどうすればよいのか

これは、頭が痛い部分なのですが、ブログをストップするわけにはいきません。

でも、弊社には自分一人しかいませんし、その時間は限られています。

ブログだけでなく、当然お仕事もありますし、書籍やWebの執筆もあります。

しかし、習慣化できる体制を組まないでの取り組みはあり得ないので、絶対に時間の使い方の計算は合わせておかないといけません。

んー、普通に考えたら、ブログと動画が半分半分になるんですかね。

悩ましいですが、そこはうまい着地を考えてみたいところです。

まとめ

いずれにしても、これからはテキストコンテンツを蓄積するブログに加えて、動画や音声の蓄積が重要になっていくことは間違いありません。

そして、提供する内容によっては、動画のほうが価値が高いことが当然ながらあります。

  • 文字では表現しづらいけど、動きで表現したらあっという間
  • スピードや簡単さを表現したい
  • 感情やニュアンス、性格やキャラクターを伝えたい

一方で、テキストのほうが有利なときももちろんあります。

  • 読者のそれぞれのペースで進めてもらえる
  • オフィスなど音が出せない環境でもOK
  • コピペできる
  • 全体ではなく一部だけをちょっと確認できる

とうことで、テキストと動画を両方をうまく使い分けていくのが良いと思います。

少し先に進めてみますので、進捗あれば報告しますね。どうぞお楽しみに!


Google Homeへの音声入力した内容をスプレッドシートに蓄積する方法

$
0
0

google-home

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

いよいよ買っちゃいました、Google Home。

OK,Google。今日の天気を教えて

OK,Google。今日の予定を教えて

をはじめ、色々なことを音声入力を使って問い合わせることができるのは、改めて画期的です。

しかも、音声認識の精度の高いこと…

ただ、ときどき「お役に立てそうにありません」みたいな返事もあるので、使いどころが難しい…というところも感じられているかも知れません。

そんな方に朗報。

Google Home。IFTTTと連携できます。

つまり、IFTTT経由でスプレッドシートをはじめ色々なアプリケーションと連携をすることができるのです。

そしてスプレッドシートに書きこめるということは、さらにその先。GASを使って色々な動作をさせることができるようになるのです…!

夢が広がりますね~。

ということで、IFTTTを使ってGoogle Homeで入力した内容をスプレッドシートに書き出す方法をお伝えします。

では、行ってみましょう!

IFTTTでAppletを作る

IFTTTは二つのサービスを連携させることができるハブサービスです。

IFTTT helps you do more with the services you love. Connect Amazon Alexa, Facebook, Twitter, Instagram, Fitbit, Slack, Skype, and hundreds more.

例えば、Twitterでつぶやいた内容をFacebookに投稿したり、WordPressの投稿をした記事をEvernoteに保存したり、何かのアプリケーションの動作をトリガーに、別のアプリケーションの動作をさせることができるというものです。

そのような様々な連携を、数あるアプリケーション同士の中から独自に作成をすることができます。

その独自に作成した「連携」をAppletと言います。

ということで、まだIFTTTに登録をされていない場合は登録をしておいてください。

Google Assistantをthisとして選択

さて、ではIFTTTにログインをして、Appletを作っていきます。

まず、トップページのメニューから「My Applets」をクリックします。

IFTTTのログイン画面でMy Appletsをクリック

「My Applets」の画面が開きますが、新しいAppletを作りたいので「New Applet」をクリックです。

IFTTTのMy AppletsからNew Appletをクリック

続いて「+this」をクリックします。

IFTTTで+thisをクリック

今回、起動トリガーは「Google Homeでの音声入力」になるわけですが、IFTTTでそのAppletを作る場合、トリガーとしては「Google Assistant」を使うことができます。

「google」と入れると「Google Assistant」が登場するのでクリックします。

IFTTTでトリガーとしてGoogle Assistantを選択

次の画面で「Connect」とすると、Googleアカウントの選択画面が表示されますので、Google Homeを登録しているアカウントを選択し、認証しましょう。

IFTTTでGoogle AssistantをConnect

Google Assistantのトリガーの設定

続いて、Google Assistantのトリガーの設定をしていきます。

画面は以下のようなものが表示されていると思います。

IFTTTでGoogle Assistantのトリガーを選択

特定の数字を含むもの、特定のキーワードを含むもの、いろいろなフレーズをトリガーに設定できますね。

中から特定のキーワードを含むフレーズを認識する「Say a phrase with a text ingredient」を選択しました。

次の画面で、トリガーの細かい設定をしていきます。

IFTTTでGoogle Assistantのトリガー設定をする

今回は以下のように設定をしました。

  1. 「What do you want to say?」に「スプレッドシートに $ と入力して」
  2. 「What do you want the Assistant to say in response?」に「スプレッドシートに $ と入力しました」
  3. 「Language」に「Japanese」
  4. 「Create trigger」

「What do you want to say?」の枠は、Google Homeへのどんなフレーズを入力トリガーとするか、という設定です。自由テキストの部分を「$」としておきますが、その前後には半角スペースを入れる必要があります。

また、この欄は「Option」を含めて3つまで設定できるので、バリエーションが必要な場合は入力しておくとよいですね。

これで、トリガーの設定は完了です。

Googleドライブをthatとして選択

続いて、トリガーを受けてのアクションとしてGoogleドライブを選択してきます。

まず、「+that」をクリックします。

IFTTTで+thatをクリック

「google」と入力すると「Google Drive」が登場するのでクリックします。

ちなみに、Google Calendarがありますね…後日試してみたいところです。

IFTTTでactionとしてGoogle Driveを選択

なお、Google DriveとIFTTTを連携していない場合は、ここでまだアカウントの選択と認証が入ります。

Googleドライブのアクションを設定

続く画面で、Googleドライブのどのアクションを行うかを設定します。

ここでは「Add row to spreadsheet」を選択します。

IFTTTのアクションとしてスプレッドシートの行追加を選択

これは特定のスプレッドシートの最終行にレコードを追加するというものです。

ちなみに、「Append to a document」も使えそうですね…!

各設定項目は以下のようにしました。

IFTTTのアクションとしてスプレッドシートの設定

  1. 「Spreadsheet name」はデフォルト
  2. 「Formatted row」もひとまずデフォルト
  3. 「Drive folder path」もひとまずデフォルトで
  4. 「Create action」

「Spreadsheet name」は存在しないスプレッドシートであれば初回のトリガー発動時に自動で作成してくれますよ。

次の画面の「Receive notifications when this Applet runs」をOnにしておくと、Appletの起動時に通知が来ます。

それで、最後に「Finish」とすればAppletの完成です。
IFTTTでAppletを作成した

Google Homeで音声入力する

では、早速Google Homeに話しかけてみて、動作を試してみましょう。

OK,Google。スプレッドシートにこれはテストですと入力して

スプレッドシートにこれはテストですと入力しました

と返ってきます。これで成功。その他

OK,Google。スプレッドシートに明日3時に外出と入力して

OK,Google。スプレッドシートに人参を買うことと入力して

などと話しかけてみました。

最初のほうは、自分が正しくフレーズを発音できない場合がありましたが、慣れてくると正しく発音できます。

すると、ほとんどの場合で想定通りに入力できました。Google Home…素晴らしい。

さて、Google Home経由でデータを蓄積したスプレッドシートはコチラです。

Google Homeでの音声入力データを蓄積したスプレッドシート

スペースが入っていますが、テキスト部分は確実に入力されています。「CreateAt」は入力日時が入るものと思っていましたが…空欄ですね。ちょっとこれは今のところ不明ですので、調べてみます。

マイアクティビティで入力状況を確認

Google Homeへの音声入力とその結果については、Google Homeアプリのマイアクティビティで確認することができます。

Google Homeのマイアクティビティ

知っておくと便利です。

まとめ

以上、IFTTTを使ってGoogle Homeで入力した内容をスプレッドシートに蓄積する方法でした。

Google Homeのサービスもこれからどんどん拡充したり、パワーアップしたりと期待できますが、IFTTTやGASを使って、様々な仕掛けを自分でも作っていけるのは、またそれも可能性を感じますよね。

色々と試してみて、便利な使い方を見つけたらまたレポートをさせて頂きます。

例えば、さっそくチャットワークにメッセージを送信してみたので、よろしければどうぞ。

Google Homeで音声入力した内容をGASとIFTTTを使ってチャットワークに送る
Google Homeで音声入力した内容をGoogle Apps ScriptとIFTTTを使ってチャットワークに送る方法を紹介します。ちょっとしたメモに便利です。スマートスピーカーで世界が一気に広がりますね。

なお、本記事はこちらの記事を参考にさせていただきました。ありがとうございます!

Google Homeで音声入力した内容をGASとIFTTTを使ってチャットワークに送る

$
0
0

google-home

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

すっかりGoogle Homeで楽しんでおります。

前回、Google Homeで音声入力した内容をスプレッドシートに書き出す方法をお伝えしました。

Google Homeへの音声入力した内容をスプレッドシートに蓄積する方法
いよいよ買っちゃいました、Google Home。音声入力を使って問い合わせることができるのは、改めて画期的です。今回はIFTTTを使ってGoogle Homeで音声入力した内容をスプレッドシートに書き出す方法です。

スプレッドシート…まあ、役に立つ局面もあるような気もしなくもないですが、いまいちバッチリ役立つ感がないな~ということで、もうちょっと工夫してみました。

それも、Google Homeで音声入力した内容をチャットワークに送るというものです。

スプレッドシートに書き込めれば、Google Apps Scriptで世界が一気に広がるのです。

では、その方法をお伝えしていきます。

IFTTTでAppletを作成する

まずは、IFTTTでAppletを作成していきます。

トリガーはGoogle Home(Google Assistant)での音声入力で、それに対するアクションはGoogle Driveのスプレッドシートの行追加となります。

Appletの作成方法は前回とほとんど一緒なので、前回記事もご参考ください。

Google Homeへの音声入力した内容をスプレッドシートに蓄積する方法
いよいよ買っちゃいました、Google Home。音声入力を使って問い合わせることができるのは、改めて画期的です。今回はIFTTTを使ってGoogle Homeで音声入力した内容をスプレッドシートに書き出す方法です。

Google Assistantのトリガー設定

Google Assistantのトリガーを設定します。

トリガーの種類は「Say a phrase with a text ingredient」で、詳細の設定は以下図の通りです。

IFTTTのGoogle Assistantのトリガー設定

今回のフレーズは「マイチャットに $ と送信して」です。anothor wayとして「マイチャットに $ と送って」も登録してみました。

Google Driveのアクション設定

続いてGoogle Driveのアクション設定です。

アクションはGoogle Driveの「Add row to spreadsheet」として、詳細は以下図の通りです。

IFTTTでGoogle Driveのアクション設定

今回出力するフィールドは{{Text Field}}のみとしました。

引き続き{{CreatedAt}}は出力されないということで、空の列があるとGASのスクリプト的にちょっと組みづらいので、なしとしました。

これでAppletは完成です。

スプレッドシートを作成

続いてスプレッドシートを作成しておきます。

スプレッドシートのほうは、IFTTTのアクションで設定したフォルダパスとスプレッドシート名にて作成し、見出し行を

  • A列:message
  • B列:send

などとしておきます。

(まあ、スプレッドシートが存在しない場合は、トリガー発生時にIFTTTの機能で自動で作成してくれますが)

そして、Google Homeへのテストで、以下のように話しかけて

OK,Google。マイチャットに これはテストです と送信して

マイチャットに これはテストです と送信しました

とかえってくればOKです。

以下のようにスプレッドシートに登録されているはずです。

Google Homeからの入力をスプレッドシートに蓄積

Google Apps Scriptでスクリプトを作成する

では、続いてスプレッドシートに入力された内容を元に、GASでチャットワークにメッセージを送信するスクリプトを作成します。

上記スプレッドシートのメニューから「ツール」→「スクリプトエディタ」を開くと、GASが入力できます。そこまで準備できれば次に進みましょう。

チャットワークのAPIを使用する準備

まずは、チャットワークのAPIを使用する準備です。

GASからチャットワークにメッセージを送信するために

  • 送信するルームID
  • チャットワークAPIトークン
  • ChatWorkClient for GASライブラリの追加

が必要になりますので、以下記事を参考に進めましょう。

Google Apps Scriptの第一歩、初心者でもチャットワークにメッセージを送れる
Google Apps Scriptの第一歩ですが、しょっぱなから真っ先にチャットワークを操作してしまいます。初回はGASのプロジェクトの作成、ライブラリの追加、スクリプトの記述と実行までです。

スクリプトを作成する

続いて、GASのスクリプトを作成していきます。

スクリプトはこちら。あ、ちなみに、ルームIDと、チャットワークAPIトークンは皆さんで取得したものを入力してくださいね。

var rid = XXXXXXXX; //マイチャットのルームID
var token = '--------------------------------'; //チャットワークAPIトークン

function main() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  for(var i = 0; i < data.length; i++){
    if(data[i][1] === ''){
      sendMessage(data[i][0]);
      data[i][1] = 'send';
    }
  }

  sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
}

function sendMessage(body) {
  var client = ChatWorkClient.factory({token: token}); //チャットワークAPI
  client.sendMessage(
    {
      room_id: rid, //ルームID
      body: body
    }
  );
}

mainは

  1. スプレッドシートのデータを配列として取得
  2. B列が空欄なら、A列の値を渡してsendMessageを呼んで、配列に「send」と入力
  3. 配列をスプレッドシートに書き込み

という処理です。

sendMessageは、受け取ったbodyを指定のルームIDのチャットルームに送信するというものです。

イベントトリガーの設定

最後に、イベントトリガーの設定をします。

スクリプトエディタのメニューの「編集」→「現在のプロジェクトのトリガー」で設定をすることができます。

タイマーを設定しておけば、定期的にスプレッドシートでB列が空欄の行を見つけて、チャットワークに送信してくれるということです。

GASでイベントトリガーの設定

Google Homeからチャットワークに送信するテスト

これで準備完了です。

テストとして、以下のようにGoogle Homeと会話をします。

OK,Google。マイチャットにこれはテストですと送信して

マイチャットにこれはテストですと送信しました。

OK,Google。マイチャットに明日の3時に外出と送って

マイチャットに明日の3時に外出と送信しました。

すると、スプレッドシートには以下のように蓄積され、トリガーが発動すると「send」が入力されます。

GASが動作したスプレッドシート

チャットワークのマイチャットには以下のようにメッセージが送信されます。

Google Homeの音声入力をチャットワークに送信

バッチリです。楽しい…!

まとめ

以上、Google Homeで音声入力した内容をIFTTTとGASを使ってチャットワークに送信する方法についてお伝えしました。

ちょっとしたメモ、備忘録としてマイチャットに送っておくのは便利そうですよね。

さて、次回はGoogle Homeからチャットワークにタスクを追加してみたいと思います。

Google Homeから音声入力でチャットワークにタスクを追加する方法
今回は、Google Homeからの音声入力でチャットワークにタスク追加する方法を紹介します。IFTTT経由でスプレッドシートにデータを蓄積し、Google Apps Scriptにてチャットワークにタスク追加をします。

どうぞお楽しみに!

Google Homeから音声入力でチャットワークにタスクを追加する方法

$
0
0

google-home

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Google Homeが我が家の生活を変えつつあります。

さて、前回の記事でGoogle Homeからの音声入力でマイチャットにメッセージを送信する方法をお伝えしました。

Google Homeで音声入力した内容をGASとIFTTTを使ってチャットワークに送る
Google Homeで音声入力した内容をGoogle Apps ScriptとIFTTTを使ってチャットワークに送る方法を紹介します。ちょっとしたメモに便利です。スマートスピーカーで世界が一気に広がりますね。

メッセージの送信ももちろん良いのですが、サッと音声入力で行いたい動作としては、「タスク追加」がありますよね。

ということで、今回はGoogle Homeからの音声入力でチャットワークにタスク追加する方法を紹介します。

とはいえ、基本は一緒。

  • Google Homeに音声入力した内容をIFTTTでスプレッドシートに蓄積
  • Google Apps Scriptを時限式で定期的に動作させる
  • まだタスク追加していないデータについてチャットワークにタスク追加

という流れです。

では、行ってみましょう!

IFTTTでAppletを作成する

では、もう定番の流れになりつつありますが、IFTTTでAppletを作成するところからはじめます。

トリガーはGoogle Assistantでの音声入力、アクションはGoogole Driveのスプレッドシートの行追加、ということで、ほとんど前回と一緒です。

Google Assistantのトリガー設定

では、Google Assistantのトリガー設定です。

トリガーの種類は「Say a phrase with a text ingredient」を選択して頂いて、詳細の設定は以下の通りです。

IFTTTでGoogle Homeのトリガー設定

今回のフレーズは「マイチャットに $ とタスク追加して」です。これぐらいの長さだと、若干訓練しないとカミますが…汗。

Google Driveのアクション設定

続いて、Google Driveのアクション設定

アクションも前回同様、Google Driveの「Add row to spreadsheet」です。詳細は以下の通りです。

IFTTTでGoogle Driveのアクション設定

これでAppletは完成しました。

スプレッドシートの作成

スプレッドシートも前回とまったく同様のものを作成しておきます。

見出し行を

  • A列:message
  • B列:send

としておきます。

それで、Google Homeに

OK,Google。マイチャットに これはテストです とタスク追加して

マイチャットに これはテストです とタスク追加しました

と返ってきまして、スプレッドシートにも「これ は テスト です」というデータが追加されるはずです。

Google Homeから入力したスプレッドシート

Google Apps Scriptでチャットワークにタスク追加するスクリプトを作成する

続いて、GASでチャットワークにタスク追加するスクリプトを作成します。

トリガーを乱立しないように、前回のスクリプトとドッキングすべく、以下前回のスクリプトをベースに進めていきます。

var rid = XXXXXXXX; //マイチャットのルームID
var token = '--------------------------------'; //チャットワークAPIトークン
function main() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  for(var i = 0; i < data.length; i++){
    if(data[i][1] === ''){
      sendMessage(data[i][0]);
      data[i][1] = 'send';
    }
  }

  sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
}
function sendMessage(body) {
  var client = ChatWorkClient.factory({token: token}); //チャットワークAPI
  client.sendMessage(
    {
      room_id: rid, //ルームID
      body: body
    }
  );
}

グローバル変数とメイン関数の変更

まず、グローバル領域と、main関数は以下のように変更しました。

前回、関数mainに含んでいたチャットワークにメッセージを送る処理は、関数sendMyChatに分離して呼び出すようにしました。

そして、mainにはaddTaskMyChatという今回新たに追加するタスク追加のための関数を呼び出すようにしています。

var rid = XXXXXXXX; //マイチャットのルームID
var aid = XXXXXX; //アカウントID
var token = '--------------------------------'; //チャットワークAPIトークン
var taskSSId = '--------------------------------'; //「Google Homeからタスク追加」スプレッドシートのID

function main() {
  sendMyChat();
  addTaskMyChat();
}

function sendMyChat() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  for(var i = 0; i < data.length; i++){
    if(data[i][1] === ''){
      sendMessage(data[i][0]);
      data[i][1] = 'send';
    }
  }

  sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
}

グローバル領域ですが、まずチャットワークへのタスク追加の際にアカウントIDが必要になります。変数aidとして取得している部分です。

これは、自分自身のアカウントIDですが以下記事で取得方法がわかりますので、ご覧下さい。

Google Apps Scriptでチャットワークにタスクを追加する最も簡単なプログラム
チャットワークの大きな特徴であるタスク機能がもAPIを使って操作することができます。今回はGoogle Apps Scriptでチャットワークにタスクを追加する最も簡単なプログラムを紹介します。

また、taskSSIdは、スプレッドシート「Google Homeからタスク追加」のスプレッドシートIDとなります。

以下、スプレッドシートを開いた際のURLの{ID}の部分です。

https://docs.google.com/spreadsheets/d/{ID}/edit#gid=0

このIDさえあれば、別のスプレッドシートにバインドされているスクリプトからでもアクセスできるようになっちゃうんです。

チャットワークにタスクを追加する

続いて、チャットワークにタスクを追加する処理です。

mainから呼び出される関数addTaskMyChatと、実際にチャットワークにタスク追加をする関数addTaskです。

function addTaskMyChat() {
  var sheet = SpreadsheetApp.openById(taskSSId).getSheets()[0];
  var data = sheet.getDataRange().getValues();
  for(var i = 0; i < data.length; i++){
    if(data[i][1] === ''){
      addTask(data[i][0]);
      data[i][1] = 'send';
    }
  }

  sheet.getRange(1, 1, data.length, data[0].length).setValues(data);
}

function addTask(body) {
  var params = {
    headers : {"X-ChatWorkToken" : token}, //APIトークン
    method : "post",
    payload : {
      body : body, //タスクの内容
      to_ids : aid //アカウントID
    }
  };
  var url = "https://api.chatwork.com/v2/rooms/"; + rid + "/tasks";
  UrlFetchApp.fetch(url, params);
}

複雑そうに見えるかも知れませんが、addTaskMyChatは前述のsendMyChatとほとんど同じです。

そして、addTaskについては以下記事を参考で。

Google Apps Scriptでチャットワークにタスクを追加する最も簡単なプログラム
チャットワークの大きな特徴であるタスク機能がもAPIを使って操作することができます。今回はGoogle Apps Scriptでチャットワークにタスクを追加する最も簡単なプログラムを紹介します。

(ライブラリを使いたかったのですが、ライブラリはタスク期限の指定が必須っぽかったので、今回は自前で用意しています。)

トリガーの設定

トリガーの設定は、前回のままでOKです。

mainを呼び出せば、sendMyChatもaddTaskMyChatも両方とも呼び出してくれますからね。

Google Homeからチャットワークにタスク追加するテスト

これで、準備完了ですので、以下のフレーズをGoogle Homeに入力してみます。

OK,Google。マイチャットにこれはテストですとタスク追加して

マイチャットにこれはテストですとタスク追加しました

OK,Google。マイチャットにミルクを買うとタスク追加して

マイチャットにミルクを買うとタスク追加しました

すると、スプレッドシートには以下のようにデータが蓄積されます。

Google Homeからスプレッドシートに入力したタスク情報

トリガーが発動すると、以下のようにチャットワークのマイチャットにタスクが追加されます。

Google Homeから追加したチャットワークのタスク

これで、忘れては困るタスクも音声で入力できるようになりました…!

まとめ

Google Homeの音声入力でチャットワークにタスクを追加する方法についてお伝えしました。

ここまでくると、かなりちゃんと実用的かなと思います。

もちろん、TrelloとかAPI連携が可能な他のタスクツールとの連携も可能ということになります。

そもそも、Google HomeがIFTTTと連携している時点で、GASとも連携できるわけで、そうなると本当に世界が広がります。

ということで、他のGoogle Homeの便利な使い方がありましたら、紹介していきたいと思います。

どうぞお楽しみに!

ディスク容量を大幅削減かつ同期不要!Google Drive File Streamの基本とその導入方法

$
0
0

google-drive-file-stream

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

先日2017/9/26にGoogle Drive File Streamが正式版ローンチされました。

以下の記事を書いてからまだかまだかと待ちわびていたのです。

その進化により企業向けクラウドストレージはGoogleドライブ一択になる
本記事ではGoogle Cloud Next Tokyoで発表された「Team Drivesを使ったファイルサーバのクラウド移行」からGoogleドライブの強みとこれからについてレポートします。

それが、いよいよ一般的に使えるようになりました。

さて、Drive File Streamは、Google ドライブのファイルをローカルのパソコンから直接ストリーミングにて利用できる機能です。

ローカルのフォルダやファイルを操作するのと全く変わらない操作で利用できるにも関わらず、実際のファイルはクラウド上にありますので、ローカルPCの保存領域はほとんど使用しなく済むという魔法のような機能です。

しかも、クラウドとローカルの同期も不要になります。

ということで、Google Drive File Streamについての基本とその導入方法について解説をしていきます!

Drive File Streamとは

再度、Drive File Streamとは何かおさらいしておきましょう。

Drive File StreamはGoogle ドライブのファイルをローカルのパソコンから直接ストリーミングにて利用できる機能です。

ファイルはGoogle ドライブ、つまりクラウド上にありますから

  • ローカルのディスク容量をほとんど使わない
  • 同期が不要(つまり同期の際のCPUやメモリ消費も不要)

という素晴らしい恩恵にあずかることができます。

これは、クラウドストレージの新境地です。

Drive File Streamは、G Suiteを使用する全てのユーザーが使用することができます。ですが、その最大の価値は、Businessプラン以上の場合に発揮されます。

というのも、G Suite Businessプラン以上であれば、Google ドライブの容量が「無制限」だからです。

つまり、ローカルPCの容量をほとんど使わずに、容量無制限のドライブを持つようなものです。

Drive File Streamの導入

ダウンロードとインストール

Drive File Streamのインストールの方法を簡単に説明しましょう。

まず、G Suiteの管理者にDrive File Streamを有効にしてもらう必要がありますので、確認をしましょう。

有効になっていれば、以下ページからWindowsまたはMacを選択してダウンロードおよびインストールします。

ドライブ ファイル ストリームを導入する

ダウンロードをしたら、インストーラを実行です。

途中にアカウントやパスワードの入力、認証の許可などが入りますが、指示通りに進めれば問題なく利用開始できるようになります。

Drive File Streamの使用感

完了すると、以下のように「Gドライブ」に「Google Drive File Stream」が割り当てられます。

Google Drvie File StreamはGドライブ

ダブルクリックすると、以下のようにチームドライブとマイドライブに分かれています。

Google Drive File StreamのGドライブを開いたところ

さらにそれらをクリックした後は、通常のフォルダやファイルを操作するのと同様に使用することができます。

Excelファイル(.xlsx)や、PowerPoint(.pptx)ファイルまたはPDFファイル(.pdf)など、ローカルのアプリケーションで開けるファイルであれば、これまで通り紐づいているローカルのアプリケーションにより開くことができます。

また、Google スプレッドシート(.gsheet)やGoogle ドキュメント(.gdoc)であれば、ブラウザでそれらのファイルを開きます。

Drive File Stream導入でどれほど容量が削減できるか

さて、これまで私は、クラウドストレージとしてOneDriveを使っていたんですね。なにせ、Office365に1TBが含まれていましたから。

ですが、Drive File Streamの登場で、そちらに全面移行することにしました。

OneDrive内で使用していた容量は…

One Driveのディスク使用量

20.4GB。たいして多くはありませんが…。

ごっそり、「Gドライブ」にコピーをしたところ、だいたい約1時間くらいでコピーが完了しました。もっと容量が多い方は、相当な時間を覚悟したほうがいいですね。

それで、Gドライブのプロパティを見てみると…

Google Drive File Streamのディスク使用量

7.52GB。

さすがに0とはいきませんが、かなり減りましたね。

そして、OneDriveで出現していた以下のメッセージ…

OneDriveのファイルをアップロードできませんのメッセージ

今後はこれにも悩まされなくて済むということです。

オフラインで使用可能にする設定方法

ちなみに、Drive File Streamの唯一の弱点は「ストリーミングである」ということです。

つまり、通信環境がないとファイルにアクセスできなくなっちゃうんですね。

ですが、ご安心ください。

そんなときのために、「オフラインで使用可能にする」機能があります。

まずは、オフラインで使いたいフォルダまたはファイルを右クリック。

開いたメニューから「ドライブ ファイル ストリーム」→「オフラインで使用可能にする」を設定すれば、そのフォルダまたはファイルについてはオフラインで使用できるようになります。

Google Drive File Streamでフォルダをオフラインで使用可能にする

Googleさん、万全です。

まとめ

以上、Google Drive File Streamについて、またその導入方法についてお伝えしました。

大事なことなのでもう一度言いますが、G SuiteのBusinessプラン(1アカウント1,200円)さえ登録していれば、無制限の容量を、ローカルPCからストリーミングで使用できるようになります。

この機能のおかげで、「クラウドストレージ戦争」にも終止符が打たれてしまうのではないかくらいのインパクトがあると、個人的には感じています。

さて、次回ですが、「ローカルにファイルがない」のが心配なので、いくつか検証してみたことについてお伝えします。

Google Drive File Streamを使ってもVBAマクロやGitはちゃんと動作するのか確認してみた
Google ドライブのファイルをストリーミングで操作できるGoogle Drive File Stream。VBAマクロやGitのバージョン管理が動くのか心配なことについて、検証をしてみました。

どうぞお楽しみに!

Google Drive File Streamを使ってもVBAマクロやGitはちゃんと動作するのか確認してみた

$
0
0

Drive File Stream

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Google ドライブのファイルをストリーミングで操作でき、ディスク容量を大幅に削減。そして同期の処理も不要にすることができる、Google Drive File Stream。

ディスク容量を大幅削減かつ同期不要!Google Drive File Streamの基本とその導入方法
この度、正式版ローンチされたGoogle Drive File Streamとは何か、またその特徴などの基本とその導入方法について解説をしていきます。ディスク容量削減と同期不要…クラウドストレージ一択になりますよ…!

いいことづくめに見えるDrive File Streamですが、「ローカルにファイルがない」って…

心配じゃありません?

例えば、VBAマクロがちゃんと動くのかとか、Gitのバージョン管理がちゃんとできるのかとか…

ということで、今回はGoogle Drive File Streamにしてみて心配なことについて、ちゃんと動くのかどうか検証をしてみました。

では、行ってみましょう

VBAマクロはちゃんと動くのか?

ストリーミングということは、ファイルそのものが物理的にドライブにはなくて、実際にはクラウド上から通信経由で引っ張ってきているということです。

そんな状態で本当にVBAマクロが動くのか…?

心配です。

ということで、検証してみます。

テスト用のマクロとファイルを準備

まず以下のtestプロシージャを書き込んだExcelマクロファイルを、Google Drive File StreamつまりGドライブに保存します。

Sub test()

Workbooks.Open ThisWorkbook.Path & "\Book2.xlsx"
Debug.Print ActiveWorkbook.Name

End Sub

また、適当なExcelファイルを作成して「Book2.xlsx」というファイル名で、マクロファイルと同じフォルダに保存します。

上記プログラムは、Workbooks.Openメソッドで、その「Book2.xlsx」を開いて、そのブック名をイミディエイトウィンドウに表示するというシンプルなものですが、「Book2.xlsx」は物理的にフォルダにはないはずですよね…ちゃんと開けるんでしょうか。

VBAマクロが実行できるか検証

ということで、実行をしてみます。

Gドライブ上のマクロで開いたGドライブ上のブック

はい、全く普通に「Book2.xlsx」が開きました、イミディエイトウィンドウの表示も以下の通り全く問題なし。

VBAによるイミディエイトウィンドウの出力

他に、複雑なものをアレコレ試すと何か問題が出てくるかも知れませんが、マクロの実行自体はできるし、Google ドライブ内の他のファイルの呼び出しもひとまず問題なさそうな感じです。

Gitでのバージョン管理はちゃんとできるのか?

続いて、Gitによるバージョン管理ができるのか検証してみたいと思います。

Source TreeでGドライブのフォルダをGitの監視対象にする

先ほど、VBAマクロの検証をしたフォルダ「G:\マイドライブ\test」をGitの管理対象とすべく、GitのGUIであるSource Treeでリポジトリの追加をします。

Source TreeでGドライブのフォルダをリポジトリとして追加

ひとまず、問題なくリポジトリの追加ができます。

そして、以下の記事を参考に、Module1をエクスポートしてコミットをしておきます。

vbacでエクセルVBAのソースコードをGitバージョン管理する方法
エクセルVBAのソースコードをコマンドラインでインポート、エクスポートができるvbacというツールの使い方を紹介します。これでエクセルVBAのGitバージョン管理が格段にパワーアップします。

ここまで全く問題なし。

コミットの差分を見てみる

続いて、先ほどのExceマクロファイル「Book1.xlsm」の内容を以下のように変更します。

Sub test()

Workbooks.Open ThisWorkbook.Path & "\Book2.xlsx"
Debug.Print ActiveWorkbook.Path

End Sub

実行すると、以下のように開いたブック「Book2.xlsx」のパスをイミディエイトウィンドウに出力します。

VBAマクロで出力したGドライブのファイルパス

これも全く問題なし。

続いて、現時点のものもVbacでModule1をエクスポートして、再度コミット。

すると以下のように、ちゃんと差分も確認できますね。

Gドライブ上のリポジトリで差分を確認

まとめ

Google Drive File Streamですが、動作が心配だった件を検証しました。

以下二点を中心に認しましたが、全く問題なく動作しました。

  • VBAマクロの実行とマクロからの他のファイルのアクセス
  • Gitバージョン管理

また、ついでにVbacなども使いましたが、これも問題なし。

他の業務もGドライブで行っていますが、今のところ気になる点はありません。

Google Drive File Stream、大丈夫そうです。

ということで、G Suiteユーザーの皆さん、Drive File Streamをぜひご堪能ください。

そうでない方も、無制限のドライブとDrive File Streamだけのために1アカウントあたり1,200円払っても全く損はないと思いますが…いかがでしょうか。

また便利機能を見つけたら共有しますね。

どうぞお楽しみに!

Viewing all 2098 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>