情報と工夫で何とかやってみる(妥協点を見出す)ブログ

情報と工夫で何とかやってきた備忘録です。同じ悩みを抱えている人がいると思い、情報共有しようと思った次第です(尤も、このブログに辿り着いた時点でもう解決していると思いますが…)

情報と工夫で何とかやってきた備忘録です。同じ悩みを抱えている人がいると思い、情報共有しようと思った次第です。(尤も、このブログに辿り着いた時点では、もう解決されていると思いますが…)

ご挨拶

突然ですが、この投稿をもって、本ブログを閉じさせていただくこととなりました。閲覧くださいました皆さま、閲覧してくださりありがとうございました。

特に、hiro_chinnさま、titiroboさま、いつも★をつけてくださり、本当にありがとうございました。お二方のおかげでモチベーションを維持でき、なんとか、昨年末の一念発起から約半年、このブログを続けることができました。本当に、本当にありがとうございました。

皆さまの今後の活躍を祈念いたしまして、結びの挨拶とさせていただきます。

短い間でしたが、本当にありがとうございました。

 

PS

ガッキーロスではありません(^^)

 

追記(5/22)

忘備録として、ブログそのものは残しておくこととなりました。

また、購読は引き続きさせてください(大変勉強になるので。感謝しております)

。よろしくお願いします。 

 

ExcelVBA⑦(excelファイルをコピーする)

ExcelVBAシリーズ最後になります。
これまでに、このシリーズで「異なるファイルを添付して、異なる人にメールすること」、「ファイル名を一度に変更すること」を紹介させていただきました。
となると、「100人にExcelで作った申請書をメールして、それを返送してもらって、いちいちファイル名を変更して保存するのは面倒」と思うようになります、「最初からファイル名をつけておけばいいではないか(例えば人の名前)」と。ということで、Excelファイルを複数回コピーするコードが以下。専用のフォルダを用意しておいて、そこに保存すると、番号のついたファイルがコピーされます。それを、「ファイル名変更」で一気に人の名前のファイルに変更し、それをそれぞれメールすれば、申請者がファイル名を変更しない限りは、保存が楽になります。

Sub ファイルをコピーする()
Dim num As Variant, ans As Integer, i As Integer
Dim fold_dlg As FileDialog, file_dlg As FileDialog 'フォルダやファイルを参照するにはAs FileDialogを使う
Dim fold_path As String, file_path As String

num = Application.InputBox( _
Prompt:="コピーする回数を入力してください", _
Title:="ファイルをコピー", _
Type:=1)
If TypeName(num) <> "Boolean" Then
ans = MsgBox(num & "回コピーします", vbYesNo)
End If

If ans = 7 Then 'MsgboxでYesNOが表示される場合、Noは「7」が入る。なので7の時はSubプロシージャから抜ける
Exit Sub
End If

MsgBox "コピーするExcelファイルを選択してください"
Set file_dlg = Application.FileDialog(msoFileDialogFilePicker) 'file_dlgはオブジェクト関数なのでSetする
If file_dlg.Show = 0 Then 'キャンセルされた場合は0もしくはFalseが入るので、それが入ったらSubプロシージャから抜ける
Exit Sub
End If
file_path = file_dlg.SelectedItems(1) '1つしか選択できないが、selectedItemオブジェクトとして返されるので1つ目を取得する
MsgBox "コピーするファイルは" & file_path & "です"
Set file_dlg = Nothing 'setを開放する

MsgBox "ファイルの保存先を選択してください"
Set fold_dlg = Application.FileDialog(msoFileDialogFolderPicker) 'file_dlgはオブジェクト関数なのでSetする
If fold_dlg.Show = False Then 'キャンセルされた場合は0もしくはFalseが入るので、それが入ったらSubプロシージャから抜ける
Exit Sub
End If
fold_path = fold_dlg.SelectedItems(1) '1つしか選択できないが、selectedItemオブジェクトとして返されるので1つ目を取得する
MsgBox "コピーするファイルの保存先は" & fold_path & "です"
Set fold_dlg = Nothing 'setを開放する

If ans = 6 Then 'MsgboxでYesNOが表示される場合、Yesは「6」が入る。
For i = 1 To num
FileCopy file_path, fold_path & "\" & i & ".xlsx"
Next i
End If

MsgBox (num & "回コピーしました")

End Sub

 

そして、再掲ですがファイル名変更は以下。

https://excel-macro.com/change_filename/

メール送信は以下になります。

https://zangyou-macro.com/macro-outlook2/

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11230424026

 

仕事につかえる「かもしれない」ExcelVBAでした。

ExcelVBA⑥(フォルダのファイル名を取得)

このGW中に、ExcelVBAを勉強しました。その成果物をいくつか。
凄くレアな話で申し訳ないのですが、ある業務でいろいろ資料を作成していて、最後に資料一覧の目次を作ることがあります。その際、その資料を一つのフォルダ内にいれておくと、そのファイル名を以下のコードで取得できます。ファイル名は一覧表示され、別のexcelファイルに作成されます。リンクも付きます。
 

Sub フォルダ一覧を書き出す()

Dim SelectFolder As String '選択したフォルダ名を格納する変数
Dim myFile As Variant, r As Long

With Application.FileDialog(msoFileDialogFolderPicker)

'ダイアログボックスを表示
If .Show = True Then

'OKボタンが押された場合、フォルダ名を取得する
SelectFolder = .SelectedItems(1)

'メッセージを表示
MsgBox SelectFolder & "を選択しました。"

End If

End With

myFile = Dir(SelectFolder & "\" & "*.*") 'Dirでファイルがあるかどうかを調べる。あれば、ファイル名が取得される

Workbooks.Add

r = 0
Do While myFile <> ""
Range("A1").Offset(r).Value = myFile
myFile = Dir()
r = r + 1
Loop

r = 1
myFile = Dir(SelectFolder & "\" & "*.*")

Do While myFile <> ""
ActiveSheet.Hyperlinks.Add Anchor:=Range("A" & r), Address:=SelectFolder & "\" & myFile 'Anchor:=でリンクを貼るセルを、Address:=でリンク先アドレスを設定する
myFile = Dir()
r = r + 1
Loop



End Sub

仕事につかえる「かもしれない」ExcelVBAでした。

Boxのセキュリティ

前回、オンラインストレージの利用規約について紹介しました。それなりに注意が必要のようでした。
一方で、セキュリティで評価の高いBoxというものがあります。こちらは、重大な障害対応や法令に基づく開示命令を除いては、Box社が内容を確認したりすることはないとのことです。また、法令に基づくデータ開示の場合であっても、ISO27018に定義された手順に従って開示され、必ず連絡がくるそうです。これまで大きなセキュリティ事故を起こしたことがないため、全世界で66万以上の会社で利用されているとのこと。ボックスに関するいろいろな記事は以下に掲載されています。
https://ascii.jp/elem/000/001/609/1609078/#eid1609059
https://www.itc.keio.ac.jp/ja/box_user_manual_about.html
https://www.waseda.jp/navi/services/box/index.html

また、Boxの利用規約は以下。
https://www.box.com/ja-jp/legal/termsofservice1

Teamsでのファイル共有の規約

 Web会議をする機会が増え「ファイルを共有したい」という相談が寄せられます。ということで、Teamsについて調べました。
 その方法は以下のサイトで丁寧に説明されております。
https://dekiru.net/article/20045/
https://blanche-toile.com/tools/microsoft-teams-file-management

 ただ気になるのが、オンライン上に保存した情報の管理の在り方。Microsoft社提供なので、当然にセキュリティは担保されているかと思いますが、気になるのは以下の利用規約

 

お客様は、マイクロソフトに対し、本サービスをお客様および他のユーザーに提供するため、お客様および本サービスを保護するため、ならびにマイクロソフトの製品およびサービスを改善するために必要な範囲で、お客様のコンテンツを使用する (たとえば、本サービス上のお客様のコンテンツを複製する、保持する、送信する、再フォーマットする、表示する、コミュニケーション ツールを介して頒布するなど) ための世界全域における知的財産のライセンスを無償で許諾するものとします。

 

 条件付きですが、Microsoft社が、保存されたコンテンツを自由に使えることになっております。その条件も自由に解釈できそう…。それなりに注意が必要なのかもしれません。なお、オンラインストレージの利用規約についてまとめたものが以下に紹介されています。ご参考ください。
https://blog.shosato.jp/2020/11/09/comparison-of-online-storage-tos/

ExcelVBA⑤(画面を作成)

ExcelVBAでできるようになると、「見栄え良くしたいなぁー」という欲が出てきてしまうことがあります。「自前のソフトのようなメニュー画面が作れたらいいなぁ」と。それ、出来ます。詳細が以下に丁寧に説明されています。感謝です。ソフトっぽいメニュー画面が作れると、私はなんか頑張れます。
https://www.sejuku.net/blog/94367
https://whiteleia.com/%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB-vba-%E8%B5%B7%E5%8B%95%E6%99%82-%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%AE%E3%81%BF%E8%A1%A8%E7%A4%BA/

ExcelVBA④(シートをコピー)

日々の商品の売上を一覧表にした「雛形」というタイトルのシートがあったとします。一番左にあります。この右隣に「この雛形をコピーして、シート名を「1月分、2月分・・・」としたいなぁ」と思ったときは、以下です(コードはちょっと格好悪いかもしれませんが、結果は上記のようになります)。

Sub 一年分コピー()

Dim i As Integer, ws As Worksheet
For i = 1 To 12
Worksheets("雛形").Copy After:=Worksheets("雛形")
Next

i = 1
For Each ws In Worksheets(Array(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13))
ws.Name = i & "月分"
i = i + 1
Next
Worksheets(1).Activate
End Sub
仕事につかえる「かもしれない」ExcelVBAでした。

ExcelVBA③(計算式のあるセルに色を付ける)

 「この資料、間違いないか確認してもらえますか?」と頼まれて、大量の数字が入ったExcel表を渡されることがあります。そして、「うーん…、どの数字を確認すればいいのか…。せめて計算式の入っているセルだけでも色付けしてくれていれば、計算式は計算式を確認し、数字はその数字が正しいかどうかを確認して、仕事がはかどるんだけど…」と思うことがあるかもしれません。そこで以下です。はじめに、選択する表を尋ねられるので、ドラッグして範囲を選択します。そしてOKを押すと、計算式の入ったセルが黄色く表示されます。なお、初めにバックアップを作っておくことを忘れずに!

Sub 計算式のあるセルに色を付ける()

Dim rng As Range, cr As Range
  On Error GoTo errHandler

Set rng = Application.InputBox( _
Prompt:="表を選択(ドラッグ)してください", _
Title:="表を選択", _
Type:=8)

Set cr = rng.SpecialCells(xlCellTypeFormulas, xlNumbers)
cr.Interior.color = rgbLightYellow

MsgBox "計算式の入っている値を色付けしました"

Set rng = Nothing
Set cr = Nothing
Exit Sub

errHandler:
MsgBox Err.Description

End Sub

 仕事につかえる「かもしれない」ExcelVBAでした。

ExcelVBA②(ファイルを開いたら自動でバックアップ)

 昨日紹介したバックアップの作成ですが、「自動で作ってくれないかな?」と思うことがあります。例えば、ファイルを開いて作業を始めようとした時にバックアップファイルを自動で作成しておくとか。そうすれば、何か困ったことが起きたとき、バックアップファイルを開けば、やり直すことができます。ということで以下。ファイルを開くと自動実行してくれる方法が紹介されています。感謝です。
https://www.helpforest.com/excel/emv_sample/ex100002.htm

なお、記述する内容は、昨日のものと同じですが、既に、最初と最後の1行は自動で書かれているので、これを除いた以下になります。

Dim name As String, path As String

name = Left(ActiveWorkbook.name, Len(ActiveWorkbook.name) - 5)
path = ActiveWorkbook.path
ActiveWorkbook.SaveCopyAs _
Filename:=path & "\" & name & Format(Now, "yyyymmddhhMM") & ".xlsm"

 なお、私は問題なく作業が終了したら、日付の入ったバックアップファイルは適宜削除しています。

ExcelVBA①(バックアップを作る)

 ExcelVBAを始める前に注意を1つ。「VBAで実行したことを元に戻せるかどうか?」です。WordやExcelには画面上部に「元に戻す」ボタンがあって戻せますが、VBAで実行したものについては、このボタンがグレーアウトしていて使えません。どうやら戻せないようです。(以下参照)
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1256843822?__ysp=RXhjZWwgVkJBIOaIu%2BOBmQ%3D%3D

 となると、こまめにバックアップを取る必要があるということになります。ということで例えば以下。昨日紹介したサイトの「VBEからマクロ作成を始める」まで進んだら、以下をペーストします。そして画面上部の「▷」をクリックすると、そのファイルのある場所と同じところに、ファイル名の後に本日の日付(年月日時秒)の数字を追加したファイルがバックアップされます。なお、ExcelVBAを使うには、拡張子が通常の[xlsx」ではなく、「xlsm」である必要があります。なので、バックアップするファイルの拡張子も「xlsm」にしてあります。

Sub Backupファイルを作る()

Dim name As String, path As String
name = Left(ActiveWorkbook.name, Len(ActiveWorkbook.name) - 5) 
path = ActiveWorkbook.path 
ActiveWorkbook.SaveCopyAs _
Filename:=path & "\" & name & Format(Now, "yyyymmddhhMM") & ".xlsm"

End Sub

いかがでしょうか? 私が勝手に、仕事につかえる「かもしれない」と思ったものなので、完全に、自分の忘備録的内容になっておりますが、「なるほど、ExcelVBAって、こういうことができるんだ」と興味を持っていただけたら幸いです。

ExcelVBA(初期設定)

 補助金シリーズはその都度紹介させていただくとして、今回からは仕事で使える「かもしれない」ExcelVBAシリーズです。仕事で、そんなに複雑な表を作ったりすることがないので、Excelのコマンドボタンや関数で十分だったのですが、以前、200件近い相手に、別々のPDFファイルを添付してメールを送るという作業が求められたとき、ExcelVBAが助けてくれたので、やはり「いいな」ということで、仕事で使える「かもしれない」と思うものを厳選して、紹介していきたいと思います。
 まずは初めに、そもそも「ExcelVBAって、どうやってやるの?」というところです。以下に丁寧に紹介されています。サイト管理者さま、感謝です!
https://www.atmarkit.co.jp/ait/articles/2009/07/news021.html

HYPERLINK関数

昨日で3回シリーズが終了しましたが、忘れないため、使用したExcelのHYPERLINK関数の説明を追加させてください。HYPERLINK(リンク先, 別名)と記載します。詳細は以下。
https://dekiru.net/article/4480/

前回までの例だと、例えば、以下を追加します。
(H1のセル)リンク先アドレスの名前
(I1のセル)リンク先
そしてH1のセルには、「=G1&"\"&F1」としてリンク先名を作ります。そして、I1のセルで、「=HYPERLINK(HI,B1)」と記載すれば、会社名をクリックして、添付ファイルに飛ぶことになります。

マクロを使って、それぞれのアドレスにそれぞれの請求書を添付して送る

最終回はいよいよ、「マクロを使って、それぞれのアドレスにそれぞれの請求書を添付して送る」方法です。


前回までで会社名の入った請求書のPDFファイルが作成されました。その数200。で、これらの請求書が例えばデスクトップ上の請求書フォルダに入っていたとします。
ではここで、Excelファイルにもう1つデータを追加します。前回までで、Excelファイルは、以下になっているかと思います。
(A1のセル)番号
(B1のセル)請求先団体名
(C1のセル)請求先メールアドレス
(D1のセル)請求金額
(E1のセル)請求日(督促する場合があるので、請求日はデータで管理している)
(F1のセル)請求書ファイル名
そこで、以下を追加します。
(G1のセル)請求書ファイルの保存先フォルダ
ここには、デスクトップ上の請求書フォルダのフルパスを記述します。例えば「C:\Users\ユーザー名\Desktop\請求書」という感じでしょうか。フォルダを右クリックしてプロパティを表示させれば、「場所」というのがあるので、それをコピーして、最後に「\請求書」と付ければいいかと思います。
これを全行にコピーします。すると、各行の請求先団体に添付するファイルは、「G1のセルに記載されたフォルダ内のF1のファイル名」ということになるかと思います。そして前回までで、この請求先団体名と請求書のファイル名は一致しているかと思います。
さあ準備は整いました。いよいよ、マクロを使って、複数の宛先ごとに違うファイルを添付してメール送信する方法です。メールソフトにはOutlookを使います。方法は以下です。
https://zangyou-macro.com/macro-outlook2/
サイト作成者の方、素晴らしいマクロと説明をありがとうございます。
サイトの説明に従って、先ずはExcelの1列目にメール送信有無の欄を追加します。6列目のCC欄はなくても構いません。7列目と8列目は定型のものがあれば、この列もいりません。こうしてExcelの表を微修正したら、上記サイトのコードをコピーしてメモ帳なんかに張り付けます。そして、説明のとおりに、コードを修正していきます(決して難しくありません)。そして、CC欄を使わなければ、CCを入れる以下の部分、
Wm_ITEM.CC = ThisWorkbook.Sheets(shname).Cells(row, 6)
を次のようにします。
Wm_ITEM.CC = ""
メールのタイトルを入れる以下の部分
Wm_ITEM.Subject = ThisWorkbook.Sheets(shname).Cells(row, 7)
が規定の文字だったら、次のようにします。
Wm_ITEM.Subject = "〇〇です。請求書を送付させていただきます"
同様に本文を指す
Wm_ITEM.Body = Wm_ITEM.Body _
& vbCrLf _
& ThisWorkbook.Sheets(shname).Cells(row, 8)
の最後の行を、
& "いつもお世話になっています。"
というような規定のものにしてはどうでしょうか。ここら辺の書き方は、以下のサイトの中の本文あたりを参考にしてみてください。
https://www.helpforest.com/excel/emv_sample/ex100008.htm
こちらのサイト作成者さまも大変ありがとうございます。

で一通り修正が終了したら、いよいよマクロの実行です。Outlookを開いた状態にしておいて、例えば、Excelの方で「表示」→「マクロ」→「マクロの記録」→「OK」、もう一度、「マクロ」→「記録終了」、そしてもう一度、「マクロ」→「マクロの表示」をクリックすると、「Macro1」というマクロ名が選択されているかと思います。この状態で「編集」をクリックして、修正したコードをコピー&ペーストして、マクロの画面を閉じます。そして、「マクロ」→「マクロの表示」→「実行」をクリックすれば、自動で、Excelの各行の送付先アドレスに、各行の請求書ファイル名に記載されたファイルが貼り付けられたメールが作成されます。あとは、これを「送信」すればいいわけです。

いかがだったでしょうか? 上記サイトに記載のとおり、初期設定では自動で送信されずに手作業で行うようになっておりますが、問題なく動いているようであれば自動送信できます。私は小心者なので、手作業でやりますが、それでも、200回、メールアドレスをコピペして、それぞれにPDFファイルを添付するよりかは、すばらしく作業が早いです。サイト作成者の皆さま、本当に感謝です。

なお、「もっと便利な方法あるよ」と意見のある方。すみません、私のリサーチは上記のとおりでした。というか、上記で満足したので、さらに調べていません。どうかお許しください。ほか、サイトに記載のあるとおり、マクロの使用は自己責任でお願いいたします。

請求書をPDFにして、一気に名前を付ける

前回で、Excelから金額と日付をWordに差し込み印刷しても、ちゃんと、金額にはカンマが、日付は和暦が入るようになりました。そこで第2回目は、「請求書をPDFにして、一気に名前を付ける」方法です。


おそらくPDFにするソフトはあると思うので、Wordの差し込み印刷で、印刷するプリンタにPDFを選択して、200件分の請求書を一気にPDFで出力します。するとExcelの行の順番どおりに請求書が作成されているかと思います。そしてPDFソフトを使って、このPDFを1枚ごとに分割します。すると、おそらく、分割されたPDFファイルは「〇〇0001」「〇〇0002」、「〇〇0003」~「〇〇0200」というファイル名で分割されるかと思います。そして、この「〇〇0001」「〇〇0002」は、当然、Excelの請求書の上からの順番と一致していると思います。

では、ここで、Excelファイルに1つデータを追加します。最初のExcelファイルは、
(A1のセル)番号
(B1のセル)請求先団体名
(C1のセル)請求先メールアドレス
(D1のセル)請求金額
(E1のセル)請求日(督促する場合があるので、請求日はデータで管理している)
でしたが、ここに6番目として
(F1のセル)請求書ファイル名
という列を追加します。そして、その列には、例えば「=A1&"_"&B1&".pdf"」と数式を入れます。すると、「番号_会社名.pdf」というファイル名を作成されるかと思います。これを全200件の行に張り付ければ、それぞれの会社名の入ったファイル名が作成されるかと思います。
ではいよいよ、「〇〇0001」「〇〇0002」……となっていたファイル名を一気に、会社名のあるファイル名に変換します。その方法が以下。
https://excel-macro.com/change_filename/
サイト作成者の方、素晴らしいマクロをありがとうございます。これでメールに請求書を添付する際、誤って違う請求書を添付するリスクが格段に減ります。本当にありがとうございます。
では、次回の最終回、いよいよ、「マクロを使って、それぞれのアドレスにそれぞれの請求書を添付して送る」方法を報告させていただきます。

先ずは、Wordの差し込み印刷で、金額にカンマを入れる方法

今回はこんな例です。
会社に勤めつつ、とある団体に加盟していて、その加盟団体に参加する各団体に会費を請求する作業をやって欲しいという依頼。その数おおよそ200。会社に請求書を発行するシステムはあるけれど、もちろん利用することはできない。かといって、その団体の幹事は年ごとに持ち回りなので、請求書発行システムらしきものなどない。あるのは請求先の一覧表のExcelと請求書のWord文書(と義務感)。そして、請求金額は団体ごとに異なり、それぞれにメールで請求書を添付して送って欲しいとのこと。

200回も、メールアドレス入力して、それぞれに、それぞれの請求書に添付しなくてはいけないのか……。せめて請求額が同じであってくれたなら……。

と言いたくなりますが、やむをえません。なので、なんとか楽してやりましょう。ということで、3回シリーズの第1回目は、「先ずは、Wordの差し込み印刷で、金額にカンマを入れる」です。

おそらく、請求先の一覧表のExcelと請求書のWord文書ということで、「差し込み印刷を使えばいいんだな」と想像されるかと思います。その通りです。そして今回、請求書一覧表には、次のデータが入っています。
1.番号
2.請求先団体名
3.請求先メールアドレス
4.請求金額
5.請求日(督促する場合があるので、請求日はデータで管理している)

で、上記のメールアドレスを除いたものを、Wordの請求書に差し込み印刷するのですが、ここで、Excel上では請求金額が「40,000」となっていても、Wordに差し込むとカンマが抜けて「40000」に、Excel上では請求日が「2021/3/1」となっているのに、Wordに差し込むと「3/1/2021」となってしまうかと思います。そこで、請求金額にカンマを入れ、日付を「令和〇年〇月〇日」にする方法が以下です。
https://office-doctor.jp/word/insert-print-comma
https://office-doctor.jp/word/insert-print-date

サイト作成者の方、素晴らしい説明ありがとうございます。
次回は、「請求書をPDFにして、一気に名前を付ける」方法を報告させていただきます。