analytic-vba のすべての投稿

ガッツの日記 第7回 「エクセルとSharepointリスト」それぞれのいいとこどりをする方法

【今回の記事はデスクトップのエクセルの新たな活用方法の提案です】

ここ数年でSharePointリストなどのクラウドサービスを利用する人はかなり多くなってきています

クラウドはネットさえつながればどこでも使うことができ、特にSharepointリストは複数人でデータを共有して仕事するのに便利な機能が満載です

履歴の復元が行えたり、登録者や更新日時が確認できます

何より3000万行を蓄積できるのがいいです

エクセルはあくまで表計算ソフトであり、大量のデータを蓄積していくのには本来は向いてません

蓄積できる行数も1シート100万前後です

一方、使い慣れたデスクトップのエクセルをこれからも使用していきたいという方も多いと思います

特にVBAを使って業務を回してきたケースの場合は、そのままデスクトップのエクセルを継続的に使用せざる負えないです

ここからが本題です

実は、

Sharepointリストとデスクトップのエクセルを組み合わせて使用する方法があります

ADOという仕組みを使うと「Sharepointリストからエクセルへのデータ取得」「エクセルからSharepointリストへのデータ追加・更新」が自動で行えます

以前、私はこのADOを使用して「Accessとエクセル」を連携するシステムを開発したことがあります

この方法ならばAccessにデータを一元管理しながら、利用者各自のエクセルファイルにて作業を行うことができます

何が一番素晴らしいかというと、売上管理や商品管理などの各種エクセルにてマスタを共通利用できる点です

エクセルでデータ管理を行っていると、複数ファイルでのマスタの追加や更新などの処理が煩雑になりがちです

ADOを使用した仕組みの場合は、Accessにてマスタ管理を行えば、利用者の各種エクセルファイルにてマスタを自動でダウンロードして使いまわすことができます

今回の記事では、Accessの代わりにSharepointリストを使用するわけですが、クラウドで利用できる点なども含めてかなり効率的な仕組みができると考えています

VBAを使い込んでいた組織では、VBAを引き続き有効利用しながらクラウドを活用できるのも大きいです

以降の記事では、Sharepointリストの特徴なども交えながらデータ取得・追加・更新のサンプルコードを解説していきます

尚、今回の記事はVBA経験者を主な対象としていますのでその点は予めご了承ください

事前準備

ライブラリーの追加

ADOをVBAで使用する場合には、Visual Basicのツールタブ⇒参照設定からMicrosoft ActiveX Data Objectsライブラリを追加する必要があります

ここが抜けてしまうと、コードをいくら書いても動きませんので注意が必要です

サイトURL及びリストID

ADOを使用してSharepointリストをデータソースとして使用する場合は「サイトURL」と「リストID」を使用します

サイトURLについては分かりやすいと思います

上記画像の「sites」の後と「Lists」の前までがサイトURLです

リストIDは普段聞きなれないと思いますが、Sharepointリストの内部名のことです

今回の記事で使用するSharepointリストのリスト名は「Sales_Test」になりますが、別の名前/IDをADO内では使用します

リストIDの取得はこちらから行います

上の画像の「リストの設定」をクリックすると、次に開く画面でリストIDが取得できます

こちらの「%7B」と「%7D」の間がリストIDになります

共通構文

以下、サンプルコードを実際に解説していくわけですが、共通の部分があります

******

Dim objConnect As Object ‘ADODB.Connection
Dim recordSet As Object ‘ADODB.Recordset
Const Sharepointurl As String = ①”https://xxxx5.sharepoint.com/sites/TEST
Const listid As String = ②”b24faf63-1f23-xxxx-858e-278ead83f878

③Set objConnect = CreateObject(“ADODB.Connection”)
④objConnect.Open “Provider=Microsoft.ACE.OLEDB.16.0;WSS;IMEX=2;RetrieveIds=Yes;DATABASE=” & Sharepointurl & “;LIST=” & listid & “;”
⑤Set recordSet = CreateObject(“ADODB.Recordset”)

******

①②ではサイトURL、リストIDを設定します

③では、ADOとの接続を設定し、④で実際に①②のサイトURLとリストIDを通じて接続を行います

⑤では取得したレコード/行一式を格納する箱を設定します

Sharepointリストの列名を取得

本来であれば、早速データの取得のサンプルコードから紹介したいところなのですが、Sharepointリストの列名の取得から始めたいと思います

何故かと言うと、ここにSharepointリストの特徴の1つがあるからです

******

Sub getFields()
(共通)

With recordSet
①.Open “SELECT * FROM [Sales_TEST];”, objConnect
②.MoveFirst

Dim i As Long

③For i = 0 To recordSet.Fields.Count - 1

    ④Debug.Print recordSet.Fields(i).Name

⑤Next

   .Close

End With

objConnect.Close

End Sub

******

①にてレコードを該当Sharepointリストから取得し、②でレコードの最初に移動します

③~⑤でレコードの列名を繰り返し、イミディエイトウィンドウに表示します

取得した列名を見て頂くと、設定していない列が取得されます

ここがAccessと違うところです

一番上に出ているIDはレコードを追加すると「1,2,3・・・」と自動採番されます

このIDは今回もSharepointリストの更新で使用します

ちなみに、使用した接続やレコード一式は必ず閉じる/Closeするようにします

データの取得

Sharepointリストからデータを取得するには、2つの方法があり、列別に取得する方法とレコードセットを丸ごと取得する方法です。

列別

前述の列名で取得した「列名」をここで使用します

*太字の部分です

******

With recordSet
.Open “SELECT * FROM [Sales_TEST];”, objConnect
.MoveFirst

Dim i As Long

Do Until .EOF
  Debug.Print .Fields.Item("注文NO").Value
  .MoveNext
Loop

.Close

End With

objConnect.Close

******

一括

こちらは一括でSharepointリストからレコード一式をワークシートにコピーします

下のコードではSheet5のA2セルに一括でコピーしています

******

With recordSet
.Open “SELECT * FROM [Sales_TEST];”, objConnect

Worksheets("Sheet5").Range("A2").CopyFromRecordset recordSet

.Close

End With

objConnect.Close

******

もし、データが一行もない場合は「データが無かった旨」を表示できるようにすると便利です

.Open “SELECT * FROM [Sales_TEST];”, objConnect

If recordSet.BOF = True And recordSet.EOF = True Then
   recordSet.Close
   objConnect.Close
   MsgBox "該当するデータはありません。"
   Exit Sub
End If

データの追加

以下の①から⑧までを一式で使います

******

①recordSet.Open “[Sales_Test]”, objConnect, adOpenKeyset, adLockOptimistic

②objConnect.BeginTrans

③recordSet.AddNew
④recordSet.Fields("注文NO").Value = Worksheets("Sheet6").Cells(2, 1).Value
⑤recordSet.Fields("SalesAmount").Value = Worksheets("Sheet6").Cells(2, 2).Value

⑥recordSet.Update

⑦objConnect.CommitTrans

⑧recordSet.Close

******

①のadOpenKeysetadoLockOptimisticは他に指定する方法がありますが、こちらの方法であれば大概は問題ありません

④⑤で追加データをワークシートから読み込んでいます

追加データが複数行ある場合は「For ~ Next」内に③~⑥を入れてコードを書きます

そして最後に⑦を実行します

データの更新

前述のようにSharepointリストのIDを使用し、更新するレコードを指定するのがポイントです

ですので実際には、事前にレコードの取得をしておいてIDを特定できるようにする必要があります

******

objConnect.BeginTrans

①recordSet.Filter = "ID = " & Worksheets("Sheet7").Cells(2, 1).Value
recordSet.Fields("SalesAmount").Value = Worksheets("Sheet7").Cells(2, 2).Value
recordSet.Update

******

データの追加も同様ですが、接続が行えない場合は「ロールバック処理/もとに戻す」を行えるようようにしておくのがよいです

<まとめ>

今回はADOの仕組みにより、Sharepointリストからエクセルにデータ取得したり、エクセルからデータ追加・更新を行う方法を解説しました

今回紹介した内容は基本的な内容であり、実際には条件式を組み合わせるなど様々なパターンが考えられます

実はSharepointリストとADOにて接続する場合、1点厄介なことがあります

ADOで扱うSharepointリストに参照列が存在する場合です

上の画像の一番右、CustomerName列は参照列です

他のSharepointリストから参照しています

参照列をADOで取得すると、次の画像のように参照しているSharepointリストのIDに置き換わってしまいます

ですので、IDを変換する仕組みが必要になります

データ追加の時も、参照列がある場合には同様にIDを変換する仕組みが必要です

とにかくSharepointリストを扱う上では「ID」が非常に重要です

この点は強く意識しておきましょう!

にほんブログ村 資格ブログ ビジネススキルへ

にほんブログ村

にほんブログ村 IT技術ブログ VBAへ

Formsに回答数の上限に達したら、Power Automateからメールをする方法

【Sharepointリストを使用し、簡単いFormsに回答数の上限を設定する方法を解説します!】

回答を集めるのに便利なFormsですが、回答数の上限を設定することはできません

 今回の記事では、回答数が事前に設定した上限数を超えたら取り急ぎPower Automateにてメールを送る対応について解説を行いたいと思います

しかも、かなり簡単な方法で行えるようにしたいと思います

ポイント

Sharepointリスト

事前にSharepointリストを作成しておき、質問別に上限数を設定しておくのが最大のポイントです

回答数についてもこちらのSharepointリストで管理できるようにします

変数

上記のSharepointリストの項目については、Power Automateのフロー内では変数を通じて管理を行います

・質問別上限数

・質問別回答数

後、メール内で「どの質問」が上限数を超えたかを管理するための変数を設定しておきます

Formsデータの取得

Formsの回答情報を取得するには、次の画像にある2つのアクションを組み合わせて使います

返信先の取得

返信先の宛先を取得するには次のアクション/ユーザープロフィールの取得(V2)を使用します

このアクションを使用すると、Formsの回答者のメールアドレスを基にして回答者の様々な情報を取得できます

例えば、「姓」「名前」とかが取得できます。こちらは後で回答者にメールを送る際に使用します

上限数・回答数の取得及び更新

ポイントで前述したように、変数は回答別に設定しておきます

変数を通じて、Sharepointリストの回答数を取得・更新します

Sharepointリストから回答数を取得するには「複数の項目の取得」アクションを使用し、変数に反映します

これは上限数も同様です

そして、Formsで回答があった質問の回答数を更新するには条件アクションの中で「empty関数」を使用します

指定した質問に回答があった場合は「empty」でないので、falseになります

こちらの「empty関数」の中にはFormsで取得した動的コンテンツを設定します

この「false」の場合に、回答数を1つ増やしてSharepointリストに反映します

*「変数の値を増やす」アクションを使用

Sharepointリストへの反映には「項目の更新」アクションを使用します

そして、ポイントで前述したように「どの質問」が上限数を超えたかを変数に設定します

こちらは「条件」アクションで上限数と回答数を比較して条件式を設定します

「はい」の場合は「文字列変数に追加」アクションで該当の質問名を設定します

メールの送信

フローの最後には、回答数が上限数を超えた場合にはメールが送れるように「条件」と「メールの送信」アクションを組み合わせて設定します

画像に alt 属性が指定されていません。ファイル名: image-12-644x496.png

「条件」アクションは「OR」で設定します

「メールの送信」アクション内では前述の「ユーザープロフィールの取得(V2)」で取得した内容を使用します

これで回答数が上限を超えた場合に、回答者にメールが送信されます

<まとめ>

今回はSharepointリストに上限数と回答数を設定した上で、Formsの回答数が上限数を超えた場合にメールをする方法を解説しました

記事内では触れませんでしたが、各種設定は質問別に行うのもポイントになります

こちらは質問数が多いとかなり手間になるので「スコープ」アクションを使用することをオススメします

「スコープ」アクションを使用すると、複数のアクションを一括で扱えるようになります

「スコープ」アクションをコピーしながら使うと、フローの作成自体が楽になります

にほんブログ村 資格ブログ ビジネススキルへ

にほんブログ村

にほんブログ村 IT技術ブログ VBAへ

Power Automateのフローがもし失敗したら~エラー対策~

【フローが失敗しても、気づかないまま・そんなことがないように対策を打ちましょう!】

エラー対策はPower Automateのようなローコードの開発でも重要です

Power Automateの場合は、トリガーが「ボタンを押す」以外のケースがほとんどなのでエラーが起こったことに気づきにくいです

今回は簡単な方法でエラー発生時に通知が来るようにしましょう!

ポイント

アクションの右上の三点リーダをクリックすると「実行条件の構成」というのが選べるのをご存じでしょうか?

実行条件の構成では、前ステップがエラーの場合のみアクションを動かすように設定を行うことができます

1段階目⇒単独実行

まず最初に、敢えてエラーを出すアクションを作成しましょう

データ操作コネクターの「作成」アクションで1÷0を指定します

数式はdivを使用します

割り算した時に分母が0なので必ずエラーになります

ここでポイントで解説した「実行条件の構成」を調整したフローを追加します

ここでは「メール通知を受け取る」アクションを使用します

このアクションは該当フローを作成したアカウントにメールを送信します

こちらのアクションの実行の構成を調整し、一つ前の「作成」アクションがエラーになった場合はメールの通知を行うようにします

これで「作成」アクションがエラーになったら「メール通知を受け取る」アクションが実行されます

逆に作成アクションをエラーにならないように中身を変えたらどうなるでしょうか?

この場合は、そもそもアクションが実行されません

2段階目⇒並列実行

前述のフローだと、エラーが発生しなければアクションは実行されません

ただ大抵の場合は、エラーが発生しない場合は後続処理を実行する必要があるケースが大半のはずです

その場合は「並列分岐の追加」を行います

これで、エラーが発生しない場合の後続処理を続けることができます

3段階目ー対象を複数アクションに拡大

前述の内容は、特定のアクションにてエラーが発生した場合のみエラー対策が実行されます

実際のフローではどこのアクションでエラーが発生するか分かりません

エラー対策のアクションを拡大する場合は「スコープ」アクションを使用します

こちらのアクションでは複数のアクションをまとめて活用できます

このスコープアクションを「実行条件の構成」の対象にすれば、スコープの中のどれか一つがエラーになるとエラー対策として設定したアクションが実行されます

エラー内容を知りたい場合

通知内容の中に「エラー内容」を入れたい場合は「actions関数」を使用します

上の画像のように()の中にエラー検知対象のアクションの名前を設定することにより、エラーの中身が取得できます

こちらが「メール通知を受け取る」アクションで通知された中身です

こちらだと情報が多すぎるという場合には、下の画像の黄色の部分に絞ってエラーの中身を抽出することができます

前述のactions関数に?を2つ続けます

actions(‘スコープ’)?[‘error’]?[‘message’]

これによりエラーメッセージの中身を絞り込むことができます

<まとめ>

今回は「実行条件の構成」を軸にPower Automateにおけるエラー対策について解説を行いました

Power Automateはローコードとはいえ、システム開発にエラー対策はつきものです

常にエラー対策は意識しておきましょう

にほんブログ村 資格ブログ ビジネススキルへ

にほんブログ村

にほんブログ村 IT技術ブログ VBAへ

ガッツの日記 第6回 Power Apps内の地図で個人のフランス旅行の思い出を語る

Power Appsの登場により、地図を使ったアプリを簡単に作成できるようになりました

今回は個人的なフランス旅行の思い出を、Power Appsで作成した地図アプリを使用しながら一方的に語りたいと思います

フランスは楽しかったですね

コロナも一段落しましたし、なんとかまた一度行きたいものです

Bing MapsのAPIキーを取得

Power AppsでBing Mapsを使用するにはAPIキーが必要です

Bing Maps Dev Center にアクセスしてアカウントを作り、キーを取得しておきます

取得した「APIキー」はBingMapsをデータ追加する時に入力する必要があります

ピンデータの作成・反映

まず最初にエクセルで地図内で配置するピンデータを作成します

*必ずテーブル化が必要です

テーブル名:France

経度と緯度を事前に取得しておくのがポイントです

次にPower Appsのキャンバス内にマップを追加します

そして、作成してあるエクセルテーブルを場所/Itemsに設定します

後は詳細設定を行う必要があります

アプリ内に取得したテーブルの列名をそれぞれ以下のように配置します

・ItemsLabels ⇒件名

・ItemsLatitudes ⇒緯度

・ItemsLongitudes ⇒経度

これで地図上にピンが設定されます

モン・サン=ミッシェル

ここから私の個人的な旅行記です

モン・サン=ミッシェルはパリから何気に距離があります

私はパリから日帰りで行きました

なおかつ、最寄駅からバスの便があまりないのでじっくり見れなかったのが残念です

次回はぜひ現地に宿泊したいですね

https://www.youtube.com/watch?v=JzAaFVPajbo

モン・サン=ミッシェルはとにかく壮大で、本当に圧倒されます

周りの自然も豊かなので、日帰りの観光は本当にもったいなかったです

何かモン・サン=ミッシェルを見ていると、本当に人間て小さい存在なんだと思い知らされます

死ぬまでにぜひもう一度行きたいものです

スミュール=アン=オーソワ

この村は日本人で行ったことがある人は多くないのでないでしょうか?

2日ほど宿泊しましたが、日本人には一度もお会いしませんでした

https://www.youtube.com/watch?v=K4W9bDWBW2Q

交通の便もあまり良くなく、リヨンからバスで行くのですが、一日に1~2便だった記憶があります

私は友人に勧められて訪問したのですが、行って本当に良かったです

まるで中世に迷い込んだような感覚になります

後、ホテルの近くに小川が流れていたのですが、リスが歩く姿が本当にほほえましかったです

現代は便利な時代のはずですが、本当にそれが幸せなのか考えさせられます

2日間滞在した後、ホテルの人がわざわざリヨンまで送ってくれたのですが、途中の風景も、のどかでとても良かったです

本当にこんな感じでした

https://www.youtube.com/watch?v=VWe8aDnaxOc

アヌシー

アヌシーはスイス国境近くに位置するせいか、やはりフランスで訪問した他の街とは少し趣が違った街でした

とにかく湖がきれいだったのをよく覚えています

https://www.youtube.com/watch?v=GQ2If_HeWdc

後、このサムネの場所が夜になるとライトアップされていてとても奇麗でした

https://www.youtube.com/watch?v=ppxKxdkGSGA

夜、気持ちよくこの辺りを歩いていたのですが、少し酒が入っていたのもあり、水の中に落ちてしまいました

冬だったのでとても寒かったのと、ズボンも一着しかもっていなかったのでその後は大変でしたね

<まとめ>

今回はPower AppsでBingMapsを使用した地図を作成した上で、フランスでの思い出をこちらから一方的に楽しく語らせて頂きました

本当にもう一度フランスには行きたいものです

ところで、Power Appsは本当に便利ですね

地図用の機能が簡単に扱えるようになっています

上のGIF画像では、GetLocationByAddress関数により住所から緯度経度を自動算出しています

私は今、東京に住んでいますが現在地の表示も簡単です

こちらをオンにするだけです

これならあまりコードの知識がなくても、本格的な地図アプリが作成できますね!

個人が自分自身で業務に必要なアプリを作成する時代が、本当に近いのだととかんじさせられます!!

にほんブログ村 資格ブログ ビジネススキルへ

にほんブログ村

にほんブログ村 IT技術ブログ VBAへ

MicrosoftのFormsにアップロードされた画像をForms外で共有する

【Forms内の回答以外でも、画像を共有するには2つの方法があります】

MicrosoftのFormsは瞬時に多くの人の情報を集められるのでとても便利です。但し、アップロードされた画像をForms外で共有するにはどうしたらいいか?

意外と頭を悩ませている人も多いのではないでしょうか?

こちらは2つ方法があります

1.FormsからSharepointサイトのドキュメントに共有

2.Power Automateにてメールを添付する

1.FormsからSharepointサイトのドキュメントに共有

Formsの画面下に「マイグループ」という欄があります

こちらのマイグループにはSharepointサイトが並びます

1つ選んでクリックするとグループフォームが作成できます

このグループフォームで画像をアップロードするだけで、該当のShaerpointサイトのドキュメントに画像が直接アップロードされます

この時、Shaerpointサイトのドキュメント内にフォルダ内には該当フォーム専用のフォルダが作成されています

こちらのフォルダ内にも、Forms内にアップロードされた画像がアップロードされます

2.Power Automateにてメールを添付する

Formsにアップロードされた画像をメールにて添付するフローは少し複雑になります

ポイントとしては2つあります

①Forms内にアップロードされた画像はOneDrive内に保存される

②メールを添付するには、ファイルの名前とファイルコンテンツ(中身)が別々に必要

こちらの2つのポイントをまずは押さえておきましょう

Formsの回答を取得

「新しい応答が送信されるとき」と「応答の詳細を取得する」この2つのアクションでFormsの回答を取得します

添付ファイルの名前を取得

添付ファイルの名前を取得するには「データ操作」コネクタを使用します

データ操作コネクタ内の「JSONの解析」アクションを使用するのですが、こちらはコード/スキーマが必要になってきます

「コンテンツ」にFormsの画像での回答を動的コンテンツで設定後、スキーマの欄に一旦「””」を入力してフローを動かします

これでスキーマが取得できます

上記の画像の出力欄/本文の「name」の欄が一番欲しいファイル名です

こちらの本文の内容を前述のスキーマにコピーします

この「JSONの解析」アクションで取得した内容から、「作成」アクションを通じて前述の「name」を抽出します

関数を使用するのですが、関数の中身は以下となります

first(body(‘JSON_の解析’)).name

これでファイル名が抽出できます

メールの送信

これでファイル名が取得できました

今度はファイルの中身/ファイルコンテンツを取得します

ファイルコンテンツの取得には「パスによるファイルコンテンツの取得」アクションを使用します

こちらはOneDrive内の「アプリ/Microsoft Forms」フォルダから取得します

前述したようにOneDriveにFormsのアップロード画像が保存されているのがポイントです

一度、ファイルパスは実際にOneDriveに保存されているファイルを設定し、動的コンテンツの「作成」アクションから出力された内容で置き換えます

これでファイル名とファイルコンテンツが揃ったので、メール作成アクションを設定します

前述したように、ファイル名とファイルコンテンツを分けて設定するのがポイントです

これでFormsに画像がアップロードされたらメールが行われます

<まとめ>

今回はMicrosoftのForms内でアップロードされた画像をForms外で共有する方法を2つ解説しました

解説した2つの方法のうち、2つ目のメールする方法は中々小難しいです

ここで、画像のアップロードが複数ある場合はどうするか?

という疑問を持った方もいらっしゃると思います

この場合は、アレイ.配列を使用します

配列に「ファイル名」「ファイルコンテンツ」を複数格納します

使用するアクションも通常の「変数の設定」ではなく「配列変数に追加」を使用しますし、文法もなかなか間違いやすいので注意が必要です

そして、一番分かりにくいのがメールの添付です

こちらはモードを切り替える必要があります

この画像を複数添付したメールを送付する方法はなかなか難解です

機会があれば詳細に解説したいです

にほんブログ村 資格ブログ ビジネススキルへ

にほんブログ村

にほんブログ村 IT技術ブログ VBAへ

関数一つで複数表を垂直統合~VSTACK~

【便利な関数一つを覚えるだけで、面倒な転記作業から解放されます】

複数表の垂直統合はPower Queryでもできますが、ただ統合するというだけならVSTACKが便利ですね

この記事では単にVSTACK関数を解説するだけでなく、応用的な使い方も解説します

VSTACK

VSTACK関数内では、単に複数の範囲を指定すれば表が垂直に結合されます

=VSTACK(B3:E9,G4:J10)

この場合、見出しが重複しないように指定範囲を調整します

見出し付きのVSTACK関数

前述の方法では、見出しを範囲の指定の仕方にて調整しました

では、範囲の指定をテーブルで行う場合には見出しの調整はどう行うか?

単にテーブルを指定した場合には、次の画像のように「見出し」が無しになります

この場合には、見出し自体を関数内で指定します

見出しは波括弧内に指定します

=VSTACK({“客先コード”,”部門コード”,”出荷日”,”金額”},Table1,Table2)

更に並び替え

では、

VSTACK関数で結合した表を、更にSORT関数で並び変えてみます

=SORT(VSTACK({“客先コード”,”部門コード”,”出荷日”,”金額”},Table1,Table2),①4,②-1)

SORT関数の第二引数①では並び替えの基準となる列を指定します

第三引数②では並べ替え方(昇順:1、降順:-1)を指定します

複数シートの結合

下の画像のように複数シートに分かれる表を結合する場合は、指定範囲が同じであれば「簡単な」書き方ができます

シート名を「:」でつなぐだけで複数シートを一気に指定できます

=VSTACK(‘2020年1月:2020年3月’!A2:C4)

<まとめ>

今回は、VSTACK関数の使い方を応用編も加えて解説しました

複数の表を関数1つでまとめられるのはとても便利です

内容もとても簡単です

範囲を関数内で複数指定するだけです

ただ見出しの扱いだけは、重複しないように注意しましょう!

参考までに今回の記事で使用したファイルを添付します

にほんブログ村 資格ブログ ビジネススキルへ

にほんブログ村

にほんブログ村 IT技術ブログ VBAへ

TOCOL関数とTOROW関数で縦横を変換

【実は関数1つで複数データの並びを変えることができるようになりました】

エクセルで行列を入れ替える作業を伴う転記作業はなにより苦痛なものです

関数1つで複数の値の行列を入れ替えられるのはとてもありがたいです

内容もとても簡単なものです

第二引数や第三引数を指定するパターンがあるので、そこだけは複雑ですがぜひ押さえておきましょう!

*注意点

既にTRANSPOSE関数という行列入れ替え、縦横入れ替えるという関数があります
今回は幅広い意味で記事内で「行列入れ替え、縦横入れ替え」については表現させて頂いております。明確な違いとしては、今回紹介するTOCOL関数とTOROW関数は1列もしくは1行に入れ替えます。ご理解のほど何卒よろしくお願いします

TOCOL/列に変換

第二引数無

TOCOL関数の中に行列を入れ替えたい範囲を指定します

=TOCOL(D5:F8)

TOCOL関数により、指定した範囲が1列に変換されます

読込順番は1行目⇒2行目⇒となります

値が無いセルについては0が出力されます

指定範囲の最終行まで繰り返し処理をしているのもポイントです

第二引数を1で指定

第二引数を1で指定すると空欄は無視して出力されます

更に第三引数をTRUEで指定

第三引数を指定すると、読み込みの方向が横方向から縦方向に変ります

TOROW/列に変換

第二引数無

TOROW関数の中に行列を入れ替えたい範囲を指定します

=TOROW(D26:F29)

TOROW関数により、指定した範囲が1行に変換されます

今回は第二引数を指定してないので、空欄は0で出力されます

第二引数を1で指定

第二引数を1で指定すると空欄は無視して出力されます

これはTOCOL関数と同様です

更に第三引数をTRUEで指定

TOCOL関数と同様に、三引数をTRUEで指定すると、データを横方向ではなく縦方向に読み込みます

<まとめ>

今回は行列を入れ替えるTOCOL関数、TOROW関数を解説しました

従来はVBAでないと最終行まで繰り返すような処理が行えなかったので、本当便利になったものです

また後日、詳細を解説しますが今回のような複数出力する関数は他の関数と組み合わせると、もっと威力を発揮します

ぜひ続編をお楽しみにしていてください

参考までに実際のデータも添付させて頂きます

にほんブログ村 資格ブログ ビジネススキルへ

にほんブログ村

にほんブログ村 IT技術ブログ VBAへ

ガッツの日記 第5回 ChatGPTと残念なエクセルについて議論してみた

【ChatGPTを活用して、日常的なエクセル業務の問題を解決する糸口にしよう!】

今日、【Schoo(スクー)】のライブ授業「議論のプロと考える ChatGPTのプロンプト」を受講しました

ChatGPTの素早い回答を糸口に議論をすすめるのは、なかなか有効だなと感じました

もちろん全てがChatGPTで解決するわけではないですが、ChatGPTとの壁打ちをすることで自分の頭の中もかなり整理されていくのがわかります

完璧にこだわらずにChatGPTと対話を続けるのが有効活用のポイントのようです!

今回は早速、ChatGPTと「残念なエクセル」について議論しました

議論の様子を皆さんにも共有したいと思います

ちなみに本日の講師の方のプロフィールがとてもユニークでした

やはり優秀な方は色々な仕事を生み出していけるのですね!

残念なエクセルの定義について聞いてみた

以下がChatGPTに投げたプロンプトです

箇条書きで・と指定すると個人的には分かりやすい答えが返ってきやすいです

ChatGPTの答えは以下です

↓↓↓

業務効率を下げるような残念なエクセルの定義を以下に箇条書きで示します。これらの要因は、エクセルの不適切な使用や設計に起因するものです。

  1. 複雑な数式と関数:
    • 複雑で理解しにくい数式や関数が多用され、他の人がシートを理解しにくくなる。
  2. 使い捨てのデータ入力:
    • 一時的なデータをエクセルに保存してしまい、データベースなどの適切なツールを使わない。
  3. 繰り返しの手作業:
    • 自動化できる作業が手作業で行われ、時間の無駄になる。
  4. 不十分なデータ整理:
    • データの整理やクリーニングが不十分で、エラーや不正確な情報が含まれる。
  5. 複数人の同時編集の混乱:
    • 複数の人が同時にエクセルファイルを編集し、競合や混乱が発生する。
  6. ファイルの適切なバージョン管理の欠如:
    • 適切なバージョン管理が行われず、誤ったデータや情報が広まる。
  7. セキュリティの脆弱性:
    • 機密情報が適切に保護されておらず、セキュリティの脆弱性が存在する。
  8. 標準化の不足:
    • 統一されたフォーマットやスタイルガイドが不足し、一貫性が欠ける。
  9. バグやエラーの無視:
    • ファイル内のバグやエラーが無視され、問題の修正が行われない。
  10. 過度な依存:
    • エクセルに過度に依存し、他の有用なソフトウェアやツールの活用が不足している。

これらの要因がエクセルの不適切な使用に関連しており、業務効率を低下させる可能性があります。効果的なエクセルの使用には、適切なトレーニング、データ管理、セキュリティ対策、標準化などが必要です。

↑↑↑

2番目に「使い捨てのデータ入力」とあるのですが、これは良く残念なエクセルの特徴を拾い上げているな、と思いました

こちらをChatGPTに再度、聞いてみます

↓↓↓

  1. 会議の出席者リスト:
    • 会議の出席者リストをエクセルに入力し、会議後に使わなくなる。
  2. 電話メッセージの記録:
    • 受けた電話のメモや伝言をエクセルに一時的に記録し、後で削除する。
  3. 一時的な計算結果:
    • 特定の計算を行い、その結果をエクセルに入力して後で必要なくなる。

*一部省略

↑↑↑

この回答だと意味合いは分かるのですが、何が問題かが明確に分からないので再度問いかけてみます

↓↓↓
はい、正確です。使い捨てのデータ入力は、データの規則性や整合性を損なう可能性があります。これは、一時的なデータがエクセルに入力されたり、削除されたりすることで、データの一貫性や整合性が維持されなくなることを指します。具体的には以下の点に注意が必要です:

  1. フォーマットの一貫性の喪失: 使い捨てのデータ入力が行われると、データのフォーマットや構造が一貫性を失い、後でデータを分析や処理する際に問題が生じる可能性があります。
  2. 不正確なデータの記録: 一時的なデータが正確に記録されなかったり、誤った情報が入力されたりすると、データの信頼性が低下します。

*一部省略

↑↑↑

何度か問いかけを繰り返すことで、なかなかシャープな表現が返ってきますね

「表現を変えながら何度も問いかけること」これがChatGPTとの対話のコツですね

解決策について聞いてみた

次に具体策を聞いてみます

↓↓↓
データの規則性を維持し、使い捨てのデータ入力に関連する問題を解決するための具体的な解決策を以下に箇条書きで示します:

  1. データ入力の標準化:
    • データ入力のフォーマットや構造を標準化し、一貫性を保つためのガイドラインを策定します。
  2. 自動化:
    • 一時的なデータ入力が自動化できる場合、スクリプトやツールを使用して手作業を最小限に抑えます。
  3. データベースの活用:
    • 使い捨てのデータ入力よりも長期的なデータ管理のためにデータベースを活用します。データベースはデータの整合性を維持しやすく、クエリや分析にも適しています。

*一部省略

↑↑↑

かなり具体的に聞かないとやはり明確な答えはかえってこないですね

ただ、解決の糸口はそれなりに網羅した答えは返ってきます

ちなみに「ウナギの寝床」横に長いエクセルについても聞いてみました

やはりピボットというキーワードはきちんと入っていますね

結論から言うと、どう解決策を聞くかによるのですが、議論のための資料作りとかには十分役に立つと思います

<まとめ>

今回はChatGPTと「残念なエクセル」について議論してみました

今回はテーマが大きすぎましたが、壁打ちのごとく対話をすればそれなりの答えが返ってくると思います

少なくとも、会議資料みたいなものを作るには十分役に立つと思います

ChatGPTから返ってくる表現は非常にシャープで、網羅性が高いです

会議資料を作成する時には、キーワードを紙に書き出したりするのですが、そのキーワードの網羅作業はChatGPTで十分です!

個人的にはもっとChatGPT、AIを活用していきたいです

【Schoo(スクー)】では「その作業はAIにやらせてみよう」をシリーズで授業がありますので、ぜひスケジュールを確認してみてください!

にほんブログ村 資格ブログ ビジネススキルへ

にほんブログ村

にほんブログ村 IT技術ブログ VBAへ

ガッツの日記 第4回 残念なエクセルに出会ったら

【上司はあなたが毎日、エクセルの最終列を探す旅に出ているのを知っていますか?】

私が出会ったエクセルの中で、残念なものの1つが「最終列を探す旅」をするエクセルです

別名は「The ウナギの寝床」です

横長になっている表はいくらでもありますが、私が出会った中で1番凄いものは列がALLを超えてきていました

何故、ここまで横長になるかというと、クロス表の信仰があるからです

表を作る方からすればクロス表にすれば見やすくなるような気がするし、横に延ばすだけで設計が要らず、作るのも楽です

ただ、その後に検索したりするのは大変です

エクセルは列方向にフィルター処理が行えないからです

ですので、最終列を探す旅になります

もちろん、この手の表で共有の管理表を作成して、後で集計するという場合はもっと大変です

各自に口頭で聞いて、集計した方が早いかもしれません

では、

この手の残念なエクセルに実際に出会った時にはどうしたらいいかでしょうか?

それが、この記事のテーマです

組織の壁

他の部署の人がこの手の表を見たら「変えたらいいじゃん」と思います

ところが、一度回りした仕事のツールを変えるのは容易ではありません

ましてや、皆で入力して管理しているエクセル表なら尚更です

「自分が変えます」と手を挙げた途端、以下のようにババを引くような形になるからです

・表を変えて万が一、うまく行かなかったら全て責任を負うような形になる

・必ず誰かは「前の方が使い慣れててよかった」と言う人がいる

・そもそも現在の表のデータを新しい表にどう移行するか?自分が手動で移行することになりそう

・そもそも本来の業務で忙しい

そうして、放置した結果、ますます皆が使い慣れていき、表を変えにくくなるという悪循環が起こります

しかも使い慣れるといっても、業務のスピードがそんなに上がるわけではないのです

大抵、

こういった「残念なエクセル」が業務効率を下げているケースでは、上司がよくそのことを認識していないケースがあります

本日、【Schoo(スクー)】の講座で「ルール(組織のしがらみ)がイノベーションの壁」を受講しました

DX推進者を物語の中の「勇者」の置き換え、DXの目的を「ラスボスを倒すこと」に置き換えて解説しているのですが、これがよく分かりやすい内容になっていました

詳細はぜひ【Schoo(スクー)】のページで確認していきたいのですが、秀逸だと思ったのはDXの推進を阻む「組織の壁」の表現です

〇現場無視系

王様/上司が現場を見ていない

無駄な気飾り/本質とかけ離れた指示

予算がおりず武器が買えない

〇遅延系

え?道具屋のチェックが必要なんですか?

ネットで武器を買おうと思ったらサイトがブロックされている

(以降省略)

この上の「上司が現場を見ていない」というケースは、表現をこの記事の趣旨に沿って変えると「たかがエクセルの表一つで業務が停滞している」ことが伝わっていないケースです

このケースは良くみかけます

先日もある方から「長年、部下がまさかこんなエクセル処理を行ってるとは思ってもみなかった」ということで相談を受けました

よく話を聞いたら、基本的なVBAの処理で済むものでした

場合によっては、管理部門から「残業が多いと注意された」、では「早く帰れ!」と上司が指示を出すこともあるでしょう

ババを引かないためにも、上司に問題の所在を説明して組織全体を巻き込んでいくのがやはり第一歩になるべきです

そうでないと、日常業務がこれまでと同じように降ってきて「業務改善」どころではありません

「そうはいっても、問題の深刻さを分かってもらえない」というケースもあるでしょう

そんな時にはIT部門の力を借りてでも粘り強く説明することが必要かもしれません

技術的対策の実際

では、実際に対策をどうたてたらいいか?

あくまで私がこれまで見てきたケースですが、残念なエクセルの根本的な問題の多くは「データそのもの」にあります

冒頭で紹介した「ウナギの寝床」はまさに典型的です

見やすさや作りやすさを優先して作られています

他の言葉で言い換えると、データの蓄積画面と作業画面を一緒に考えてしまっています

一緒にすると見やすいし、作りやすいような気がします

本来は、データの蓄積と作業は別画面にすべきです

データの蓄積であれば、ウナギの寝床を列数を固定にし、「縦縦の繰り返し」に並べ替えて蓄積します

ここがスタートです

そして作業画面を別途作成します

例えば、データを閲覧するだけであれば、ピボットテーブルで変換することも「データがきちんと蓄積」されていれば可能です

入力が伴う作業画面を別途作成する作業はAccessを使用したりするなど、技術が必要な時もあります

ただ、今ではローコードの技術もあるのでハードルが下がっています

Power Queryで各自が入力したエクセルファイルを、フォルダを通じて集約する技術なんかはオススメです

更新ボタンを押せば、ファイル内の複数ファイルが1つの場所に集約されます

あくまで、入力は「クロス表」で縦横並びにしたいという場合も、ピボット解除行列入れ替えの技術があります

<まとめ>

今回の記事では「ウナギの寝床」のような残念なエクセルに出会った場合の対策について書きました

とにかくこの手の業務を著しく停滞させるエクセルに出会った場合には、組織を巻き込んで対処するのが先決です

放置をすると、どんどん悪循環が起きます

技術的には、まずデータを規則正しく蓄積することを考えるのが先決です

Sharepointリストを活用することもかなりオススメです

3000万行保管でき、行単位でバージョン管理や変更者の特定も行えます

いや、どうしてもクロス表でしか管理できないです、ですから「エクセルじゃなきゃダメです」というケースでもPower Appsという方法があります

詳細はこちらの記事で紹介しています⇒詳細

にほんブログ村 資格ブログ ビジネススキルへ

にほんブログ村

にほんブログ村 IT技術ブログ VBAへ

ガッツの日記 第3回 私が愛した残念なエクセルを紹介1

【エクセルを見た途端に’絶望’したことはないですか?何回かに分けてこれまで出会った残念なエクセルを紹介していきたいです】

今回の記事では私が実際に作業したエクセルの中で、衝撃を受けた2つのエクセルを紹介します

最後まで記事を読んで頂いても参考になるかは分かりませんが、エクセルの面白さなどを感じて頂けたら幸いです

ちなみに最近、このチャネルが気に入っていて「絶望」という言葉に凝ってます

https://www.youtube.com/watch?v=rwBy8Z5-ONk

10万行にチャレンジ

まず最初は以前、ある会社で毎月作業をするように引継ぎを受けたエクセル表です

記憶も定かでないでないので、詳細は割愛しますがパズルのような作業を10万行分行います

次の画像をご覧ください

Cの列にまだ値は入力されていません

A列とB列の値を見てから、C列に入るものを判断して値を入力します

例えばこんな感じです

・A列:A、B列:A⇒C列:〇

・A列:A、B列:B⇒C列:△

この作業を10万行分行います

ちなみにこのA列とB列の組み合わせは20通りぐらいあります

もちろん、値が同じ行が連続してたり、空白が続く行があったりするので純粋に10万行入力するわけではないです

ただ、それでも物凄い量です

前任者は月に1回は丸一日、この作業に没頭していたようです

「月1回我慢すればいいよ・・・」

と言われても、この手の作業は苦手なので「絶望」の2文字が頭をよぎりました

もう考えるだけで憂鬱です・・・

後から振り返ると、前任者に「こうやっている」と断言されたので視野が狭くなっていたかもしれないですね・・・

しばらくするとすぐに解決策が思い浮かびました

複合キーを作成してマスタを作成することです

こんな感じです

マスタを作成したら元の表でも&を使用して複合キーを作成します

最後にVLOOKUP関数で先ほどのマスタを参照します

IFERROR関数も組み合わせるとなおいいですね!

更にテーブル機能を活用すると、関数は1つのセルに入力するだけで済みます

関数の入力に苦しんでいる方にはぜひ活用して欲しい機能です

ということで、前任者が丸一日かかっていた作業を1分で行えるようになったのですが、何より絶望感から解放されたのがよかったですね

今はエクセルでもいろいろな機能があるので、残念なエクセルに出会っても必ずしも絶望する必要はないですね

セルの値が消えた!?

以前、勤めていた会社では長く受け継がれたエクセルがあり、予算を作成した後にその伝統のエクセルにもコピーし、毎月実績をメンテナンスする必要がありました

誰がどう見ているのかが不思議な内容でしたが、やはり伝統は守るためにあるものです

時間が限られている中で、その伝統のエクセルに予算をコピーする際、不思議なことが起こりました

上期の予算、4月~9月分を伝統エクセルにコピーしました

するとコピー先にコピーしたい内容が反映しないのです

9月まで反映せず、本来7月分の箇所に8月分が反映しているのです

とにかく時間が無いので焦りました

何度もコピーしたのですが、うまくコピーできません

実は

列が非表示になっていました

ここまで引っ張って「それだけ?」と思われた方もいらっしゃると思いますが、まだエクセルになれておらず、しかも時間が無い中なので全く気づけず焦るだけでした

伝統エクセルの非表示の箇所には四半期の数字が入っており、上期小計は1Q+2Qを合計する数式が入っておりました

こうしておいてもらえれば、1年分を一括で入力できたんですがね・・・

後から

前任者から「俺も最初気づけなくて参ったよ・・・」と苦笑いされたことも付け加えておきます

<まとめ>

今回はこれまで出会った残念なエクセルの第一弾として2つの事例を紹介しました

今回の事例は残念なエクセルというより、残念なエクセルの使い方という方が正しいかもしれません

少なくとも1つ言えることは、セル結合もそうですが「非表示」は不用意に使わない方がいいですね

非表示にした本人も忘れていることもあります

話は一見変わりますが、本日、【Schoo(スクー)】田中亨先生のエクセル授業を受けました

内容は、スピル関数からデータモデル、Pythonなど多岐にわたるものでした

本ブログでもPower Queryについてはかなり力を入れて紹介していますが、今のエクセルはかなり多機能です

絶望せずに解決策を探せば、案外簡単に解決策が見つかることもあります

新しいエクセル機能を研究してみると役に立つことも多いです

最後に、

エクセルの引継ぎは、常日頃からきっちり行えるようにしておきたいものです!

にほんブログ村 資格ブログ ビジネススキルへ

にほんブログ村

にほんブログ村 IT技術ブログ VBAへ