MS Access 用 ChatGPT プロジェクト

ChatGPT ではプロジェクトを作成できます。いつも同じ質問を繰り返すのは面倒なので、プロジェクトの「指示」にあらかじめ質問を書いておき、目的に応じて質問するプロジェクトを選択します。

チャットに「対象項目: △△△△」を記述して、「対象項目を～」と指示しないと期待通りに動作しないときがあります（単に「提供された文章を～」と指示しても期待通りに動作しない）。簡単のために、チャットに「#1 △△△△」を記述して、「#1 の文章を～」と指示します。

「指示」に複数の文を記述しても、期待通りに理解してくれないので、1文で「#番号 から #番号 に従って、△△を〇〇してください」と書いています。（日本語への指示は問題ないようです。）（最初の文と箇条書きの間に空行を入れます。）

プロジェクトにファイルを追加して、指示に「sample.txt にあるスタイルを参考に、～」を追加しました。

　

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/d5723108-28fa-4f6a-9743-e457230c5cd7.png" width=70%>

```:指示
sample.txt にあるスタイルを参考に、#1 から #3 に従って、クエリを整形してください。日本語で回答してください。

#1 改行とインデントを用いてクエリを見やすくしてください
#2 各SQLステートメントを新しい行に配置してください
#3 クエリを整形して、読みやすく表示してください
```


```:sample.txt
SELECT
    name,
    email
FROM
    users
WHERE
    id = 1;


INSERT INTO
    users (name, email)
VALUES
    ('John Doe', 'john.doe@example.com');


UPDATE
    users
SET
    email = 'new.email@example.com'
WHERE
    id = 1;


DELETE FROM
    users
WHERE
    id = 1;


SELECT
    users.name,
    users.email,
    orders.order_date,
    orders.amount
FROM
    users
INNER JOIN
    orders
ON
    users.id = orders.user_id
WHERE
    users.id = 1;

```

　

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/ad9cc324-be55-40b0-b109-1d886570020e.png" width=70%>

```:指示
sample.txt にあるスタイルを参考に、#1 から #5 に従って、MS Access の DLookup や DSum などの関数を書き換えてください。日本語で回答してください。

#1 クエリに書き換えてください
#2 改行とインデントを用いてクエリを見やすくしてください
#3 各SQLステートメントを新しい行に配置してください
#4 クエリを整形して、読みやすく表示してください
#5 格納先の変数名は、 AS に使用してください
```

```:sample.txt
sample.txt は上と同じ
```

　

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/4048ba96-0e0c-3607-efe5-3c5863284da8.png" width=70%>

```:指示
#1 の文章を校正してください。日本語で回答してください。

```

```:チャット
#1
ChatGPT ではプロジェクトを作成できます。いつも同じ質問を繰り返すのは面倒なので、プロジェクトの「指示」にあらかじめ質問を書いておき、目的に応じて質問するプロジェクトを選択します。
```

　

ChatGPT の最初の画面のメニュー

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/f16bc7b9-da21-8c4d-b315-1a58756a8575.png" width=50%>

　

## Excel 用

以下に、Excel 用を追加しました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/1be31c88-a47d-474a-ae8c-bd6db26c85ae.png" width=70%>

```:指示
#サンプル1 から #サンプル2 にあるスタイルを参考に、#1 の Excel の VLOOKUP を1文で説明してください。#サンプル2 のように、列名の記述がある場合は、それをそのまま置き換えてください。

#サンプル1
VLOOKUP("最終日", Sheet1!$A:$E, 4, TRUE)
Sheet1シートのA列からE列の範囲内の最初の列で「最終日」を近似一致で検索し、一致する行のD列の値を取得します。

#サンプル2
VLOOKUP("更新日", INVOICE!$A:$E, 4, FALSE)
A列: Date
D列: Address
E列: Tel
INVOICEシートのDate列からTel列の範囲内の最初の列で「更新日」を完全一致で検索し、一致する行のAddress列の値を取得します。

```

```:チャット
#1
VLOOKUP("登録日", 会員情報!$A:$G, 5, TRUE)

```

　

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/91463241-a511-481e-a00b-5d3a673ced72.png" width=70%>

```:指示
#サンプル1 から #サンプル2 にあるスタイルを参考に、#1 の Excel の SUMIFS を1文で説明してください。#サンプル2 のように、列名の記述がある場合は、それをそのまま置き換えてください。

#サンプル1
SUMIFS(Sheet1!$J:$J, Sheet1!$A:$A, '最終日付', Sheet1!$B:$B, '会社ID')
Sheet1シートの、A列が「最終日付」と一致し、B列が「会社ID」と一致する全ての行のJ列の数値を合計します。

#サンプル2
SUMIFS(台帳!$B:$B, 台帳!$C:$C, "2021/01/*", 台帳!$D:$D, "北海道", 台帳!$E:$E, "食品")
B列: 売上額
C列: 販売日
D列: 地域
E列: 商品カテゴリ
台帳シートの、販売日列が「2021/01/*」と一致し、地域列が「北海道」と一致し、商品カテゴリ列が「食品」と一致する全ての行の売上額列の数値を合計します。

```

```:チャット
#1
SUMIFS(Sheet1!$B:$B, Sheet1!$C:$C, "2025/02/*", Sheet1!$D:$D, "北海道", Sheet1!$E:$E, "食品")

```

　

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/8ba7978c-b350-449a-9707-64df265175f1.png" width=70%>

```:指示
#サンプル1 から #サンプル5 にあるスタイルを参考に、#1 の Excel の MAX や SUM や MATCH などの関数を1文で説明してください。#サンプル2 と #サンプル4 のように、列名の記述がある場合は、それをそのまま置き換えてください。

#サンプル1
MAX(Sheet!A:A)
Sheet1シートのA列内の数値の最大値を返します。

#サンプル2
SUM(台帳$D$11:$D$50)
D列: 利益
台帳シートの利益列の11行目から50行目までの範囲にあるデータを合計します。

#サンプル3
MATCH("文京区", $A60:$A79, 1)
$A$60:$A$79 のセル範囲で、昇順に並んだデータの中から「文京区」以下の最大の値を探し、その位置（インデックス番号）を返します。

#サンプル4
IF(Z13=0,0,ABS(X13-Z13)/Z13)
Z列: 新価格
X列: 旧価格
「新価格」が0の場合は0を返し、それ以外の場合は「旧価格」と「新価格」の差の絶対値を「新価格」の値で割った結果を返します。

#サンプル5
sheet1.Cells.Find(What:="Address", After:=sheet1.Cells(1, 1), LookAt:=xlPart)
sheet1 のセル内で「Address」という文字列を部分一致で検索しています。検索はセルA1 (Cells(1, 1)) の次のセル（セルB1）から始まり、見つかったセルの参照が返ります。

```

```:チャット
#1
MAX(Sheet1!A:A)

```

　

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/f5a00e66-c7af-4172-8292-684a5e5660af.png" width=70%>

```:指示
#1 の Excel OFFSET や Cells などの関数の結果を、Sheet1!A1 のようなシート名とセル名で表してください。以下のサンプルを参考にしてください。

#サンプル1
OFFSET(値段!$A$60:$A$79,0,5)
値段!F60:F79

#サンプル2
Cells(2,3)
Sheet1!C2

```

```:チャット
#1
Cells(9, 8)

```

　

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/29338828-7bc0-410b-a20c-913539edc8a4.png" width=70%>

```:指示
#1 の文章を日本語訳してください。

```

```:チャット
#1
Why is the sky blue?

```

　

## 補足：MS Access のデバッグ

［表示］－［イミディエイト ウィンドウ］を表示します
デバッグでブレークポイントで停止します

　
変数値の確認
? yourVariable1
1.23456

　
関数の複数の引数値の確認
returnVal = DLookup(argument1, argument2, argument3)
↓
先頭に「? """" + 」（または、? と " の次に「returnVal = DLookup(」も含める） 
「, 」を「 + """, """  + 」に置換 
末尾に「 + """"」（または、" と末尾の間に「)」も含める） 
↓ 
? """" + argument1 + """, """  + argument2 + """, """  + argument3 + """"

　
変数の宣言（Dim）やコメントにはブレークポイントは貼れません

　

![0129_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956789/484342cf-bd40-fe46-ba66-4332d879f195.png)


## 補足：MS Access ノウハウ

レコードセット（DAO.Recordset）の指定したフィールドの value は、最初の（現在の）レコードの value を返します 

標準モジュールはすべてのコードに読み込まれています（Public の記述があるとき） 

DateSerial は Day 引数に 0 を使用することで、指定した月の「前の月の最後の日」を取得することができます。 DateSerial(Year("2015/01/15"), Month("2015/01/15") - 4, 0) は、2014年の8月31日を返します。なぜなら2014年9月0日と解釈され、日付のローリングバックにより8月の最後の日が得られます

クエリを実行する 
［作成］－［クエリデザイン］でクエリを新規作成 
SQL ビュー 
クエリを書込み、または、貼り付け 
［クエリデザイン］－［実行］

独自に作成したクエリ（Insert）を保存する際に、「SQL ステートメントが正しくありません。」というメッセージが表示される場合がありますが、実行は正常に行えます。Insert 先のテーブルはウィンドウを閉じる必要があります

自分の環境でのレコードのエクスポート/インポート
　テーブルを選択し、マウス右クリック、XML ファイルでエクスポートする
　データのみエクスポートする
　必要に応じてデータ（XML）を加工
　テーブルを選択し、マウス右クリック、XML ファイルをインポートする
　既存のテーブルにデータを追加する
　完了


## 補足：Excel ノウハウ

lastAddress = someSheet.Cells(Rows.Count, col("住所")).End(xlUp).Value
lastRow = someSheet.Cells(Rows.Count, col("住所")).End(xlUp).Row

https://excel-ubara.com/excelvba1/EXCELVBA318.html