ある日、職場の方から突然ZIPファイルを開けなくなりましたという連絡がありました。エクスプローラーでファイルを開いて、圧縮されている中のファイルをダブルクリックすると、「展開を完了できません。展開先ファイルを作成できませんでした。」というメッセージが表示され、ファイルの中身が表示されません。 7zipからは開くことができるので、Windows 10標準のZIP機能がおかしいらしい。 ネットで検索して一時ファイルを消してみたり、SFC /SCANNOW を実行して見たり、色々やってみたけれど効果なし。 海外サイトで Windows cannot complete the extraction. The destination file could not be created. などで検索してもいい情報が見つかりません。 途方に暮れつつ、ZIPファイルを右クリックして、「すべて展開」を選んでみたところ、エラーコード「0x80004005」が出ました。 それで検索したところ、次のページがヒットしました。 Windows 10でZIPファイルの解凍エラー(0x80004005)が発生したときの対処方法 問題のZIPファイルの作成には7zipを使っていたので、圧縮時の設定を見てみたところ、確かに圧縮方式がデフォルトのdeflateではなく、BZip2になっていました。 もとのdeflateに戻して、再度圧縮して標準ZIP機能で開いたところ、あっさり開くことができるようになりました。なんと。 というわけで、ZIPファイルが開けない場合には、元のツールの圧縮方式を疑ってみる必要があります。取引先から送られてきたものは、頼み込むか、7zip等で開くしかなさそうです。 また、無駄な時間を使ってしまった。 ちなみに、暗号化方式がZipCryptでないとやはりWindows 標準のZIP機能では開けないそうです。
最近噂のChatGPT。大学受験問題も解ける賢いAIだとか。そこで私も試してみました。 指示は、「単価、数量、金額の列を持つExcelのテーブルを一行ずつ読み、金額を計算して更新するVBAを作りなさい。ListObjectとFor eachを用いなさい」です。 結果は次の通り正しく回答されました。 マジかと思いました。 自然言語からコードが生成されるだけで驚きですが、金額を計算しなさいと言っただけで、単価と数量を乗算しています。 試しに実行 上の画面のテキストをコピペしたものです。 ExcelのVBAでは、ListObjectを用いることで、Excelシート上のテーブルを操作することができます。以下は、単価、数量、金額の列を持つExcelのテーブルを一行ずつ読み、金額を計算して更新するVBAの例です。 Sub UpdateTable() Dim tbl As ListObject Dim row As ListRow ' テーブルを取得します Set tbl = ActiveSheet.ListObjects("Table1") ' テーブルの各行を取得します For Each row In tbl.ListRows ' 単価と数量から金額を計算します Dim unitPrice As Double Dim quantity As Integer unitPrice = row.Range(1, 1).Value quantity = row.Range(1, 2).Value row.Range(1, 3).Value = unitPrice * quantity Next row End Sub 上記のVBAを実行すると、単価と数量から金額を計算し、テーブル内の金額の列が更新されます。 ListObjectを用いることで、Excelシート上のテーブルを簡単に操作することができるようになります。また、For Eachステートメントを用いることで、テーブルの各行を順番に取得し、処理を行うことができます。 できています。実際にテーブルを作って実行してみました。 実行結果 ちなみに、quantityのデータ型がintegerで最大値が小さい
VBAから ADO を使わずにODBC経由でデータベースにアクセスする方法です。 サンプルデータベース 次のようなアクセスのデータベースがあるとします。 テーブル名は「商品マスター」 カラム名は、ID, 商品名, 金額 保存してあるファイルは C:\Test\SampleDB.accdb DSNの用意 このファイルにアクセスするための DSN を作成します。(作成方法は後述) VBAの実行 Excel でシートを開き、次のプロシージャーを実行します。これはテーブルを作成するプロシージャーなので、最初に一回実行するだけです。 Private Sub uCreateTableWithQuery() Dim uWS As Worksheet Dim uList As ListObject Set uWS = ActiveSheet Set uList = uWS.ListObjects.Add( _ SourceType:=xlSrcQuery, _ Source:="ODBC;DSN=NK Test", Destination:=Range("A3")) uList.DisplayName = "ExcelProductMaster" End Sub DSN=にDSN名を指定します。この例では、NK Test。 Destination はテーブルの左上を配置するセルです。この例ではA3セル。 DisplayName はテーブル名を指定します。この例ではExcelProductMaster。 実行すると次のようにテーブルが作成されます。テーブルはQueryTableに接続され、QueryTableはDSNを利用可能です。 次のプロシージャーを実行します。 Public Sub uRefleshQueryTable() Dim uList As ListObject Dim uSQL As String Set uList = ActiveSheet.ListObjects("ExcelProductMaster") uSQL = "SELEC
コメント
コメントを投稿