Dim Qdf As DAO.QueryDef
Dim strSQL As String
strSQL = "SELECT A.氏名 FROM " & 元テーブル名 & " A INNER JOIN " & 一時テーブル名 & " B ON A." & 主キー & "=B." & 主キー & " WHERE INSTR(B.氏名,'?')"
Set Qdf = CurrentDb.CreateQueryDef("文字化けチェッククエリ", strSQL)
UPDATE T_出力, T_置換用テーブル
SET T_出力.住所1 = Replace(Nz([T_出力].[住所1],""),[T_置換用テーブル].[置換前],[T_置換用テーブル].[置換後])
WHERE InStr(1,Nz([T_出力].[住所1],""),[T_置換用テーブル].[置換前],0)>0;
UPDATE T_出力, T_置換用テーブル
SET T_出力.住所1 = Replace(Nz([T_出力].[住所1],""),[T_置換用テーブル].[置換前],[T_置換用テーブル].[置換後])
WHERE InStr(1,Nz([T_出力].[住所1],""),[T_置換用テーブル].[置換前],0)>0;
UPDATE T_出力, T_置換用テーブル SET T_出力.住所1 = Replace(Nz([T_出力].[住所1],""),[T_置換用テーブル].[置換前],[T_置換用テーブル].[置換後])
WHERE (((T_出力.住所1) Like "*" & [T_置換用テーブル].[置換前] & "*"));
これはかなりのメリットだと思いますが。これがあるおかげで、コード入力がはかどりますし、タイプミスによるエラーも防げます。
また、Me.があれば、フォーム(レポート)に関連するコントロール、メソッド、プロパティと分かりますので、コードを後から読むときに解読しやすいです。ないと、それ以外の何かの可能性も考慮しつつ読む必要がでてきます。
他の関数などと名前が重複したりすると、バグの原因になりかねません。
Valueはそのオブジェクトが持っている値を取得するプロパティです。
このプロパティはよく使用することが多いので既定のプロパティとされていて、省略することができます。
値を取得したいときは省略してもいいのですが、関数などと名前が重複したりするとバグの原因になったりするので、大きなプロジェクトの場合は、省略しない方がいいと思います。
通常は囲まなくても大丈夫ですが、コントロール名に半角スペースが含まれていたり、VBAのコードとバッティングする記号が含まれていたりするとコントロール名と認識できない場合がありまので、その時は必要になります。
Accessのvbaで処理する方法を探していたんですね。それは気づけませんでした。
以下の記載は参考になるでしょうか。
https://support.microsoft.com/ja-jp/office/sharepoint-にデータをインポート-リンク-または移動する-65bf7b03-74bf-445c-959a-24b7a401ddee
https://naberium.com/2022/07/22/adoを利用してsharepoint-listの一覧を取得する/
↑これはエクセルの場合ですが
以下のように有料のドライバーとしても売ってるので、それなりに難しそうですね。
https://www.cdata.com/jp/kb/tech/sharepoint-odbc-access-linked-tables.rst
すずやんさま 返信ありがとうございます。
手動でパスを取得する方法はわかっています。
access vbaで処理する方法を模索しています。
access側でボタンをクリックするとsharepointのドキュメント内フォルダを
一覧表示するのが目的です。
宜しくお願いいたします。
すずやん様
もしかすれば、Accessも歴史が長く、ハードもソフトも未熟・非力な時に決まった軽量な既定がそのまま遺産になったのかもしれないですね。
ともあれ、ありがとうございました。
んー、なんでしょうね。
「とりあえず実行は許可して結果から判断できるようにする」てのを既定値にしているのかもしれませんね。
じゃないと「OptionDatabase.Execute」の設定や記述がおかしいのか、それとも実行した内容がおかしいのかが判別しにくいから、というのかもしれません。
ヘルプだと同じような RecordsetOptionEnum を持つ OptionDatabase.Execute メソッドの既定値が dbInconsistent らしいんです。
「(既定値) 矛盾した更新を実行します (Microsoft Access ワークスペースのみ)。」
実験してませんが、ソースぐらいしか指定しないと矛盾を許してるんでしょうか。
Executeのほうも、何故既定があえてユルいのか不思議です。
sharepointは使っていませんが、このあたりの方法ではどうでしょうか。
https://begin-prog.site/sharepoint-how-to-get-file-folder-link
ちょっと調べてみましたが、たしかに分からないですね。
希望する動作の値をセットするしかないのかもしれません。
Shift-JISに無い文字を抽出すれば良いのであれば、いったんcsv(sjis)に出力して文字化けさせて
csvを一時テーブルにインポートして元テーブル結合させて絞り込み~じゃダメですかね。
元テーブルに名前以外の主キーがある前提ですが、こんな感じのvbaで。
Public Sub A()
Dim 元テーブル名 As String
Dim 一時テーブル名 As String
Dim 主キー As String
Dim 一時ファイル As String
元テーブル名 = "T_住所録"
一時テーブル名 = "TMP"
主キー = "ID"
一時ファイル = "C:\temp\名前リスト.CSV"
On Error Resume Next
CurrentDb.Execute "drop table " & 一時テーブル名, dbFailOnError
DoCmd.TransferText acExportDelim, , 元テーブル名, 一時ファイル, True
DoCmd.TransferText acImportDelim, , 一時テーブル名, 一時ファイル, True
Dim Qdf As DAO.QueryDef
Dim strSQL As String
strSQL = "SELECT A.氏名 FROM " & 元テーブル名 & " A INNER JOIN " & 一時テーブル名 & " B ON A." & 主キー & "=B." & 主キー & " WHERE INSTR(B.氏名,'?')"
Set Qdf = CurrentDb.CreateQueryDef("文字化けチェッククエリ", strSQL)
CurrentDb.QueryDefs("文字化けチェッククエリ").Sql = strSQL
CurrentDb.QueryDefs.Refresh
Set Qdf = Nothing
DoCmd.OpenQuery "文字化けチェッククエリ"
End Sub
「環境依存文字」という定義が今となっては難しいですね。
はしご高、立つ崎は、現在のUnicode対応のフォントならたいてい普通に表示できると思いますが。
どのようなフォントを使かおうとしているのでしょうか。
ここはチャット型掲示板ではないので、最低でも1日程度はまたないとそもそも網にかかってないのだろうと感じることがありますね
ちょっと前に似たような話題がありました
外字を含むレコードを抽出したい
スマートな方法はありません
りんごさん相対関係は最初作ろうと思ってたのですが内容的にお互い全てが対象となりますので不可なのです。品目はコンボで選択する形になっており、よくあるパターンとして絞り込みは出来る様にしているのです。
品目の相対関係を管理するテーブルを別に作らないの?
まずは、きちんと正規化しておかないと、質問して完成しても、設計が杜撰だから破綻している、捨てて下さいとなるだけですよ。残念ながら。
りんごさん イメージとしてはそんな感じですが、日付や取引先(Nullの場合あり)・伝票番号・その他テキストはメインテーブルにしてます。サブにはA、Bの品目・金額は両方とも入力必要で(相対品目として)、繰越入力の時は説明した通りの決まった切り分けとなります。
要するにこういう事?
りんごさん 財務の振替の様なもので伝票に記入するイメージで直感的にそれに沿った処理フォームにしています。実際は
品目A 金額A 品目B・金額B
あ 1000 繰越 1000
繰越 500 い 500
で金額AとBの合計値は合致させる必要があります。(繰越入力フォーム基のクエリでこうなる様にしてます)
繰越時はA・Bどちらかになるかは決まってますが日々の処理ではどちらかになるかはランダムなのです。
これも説明不足でした(すみません)。
>●処理イメージ(サブ)
品目A 金額A 品目B・金額B
あ 1000
い 500
但し品目のグループにより品目A・金額Aに入るか品目B・金額Bに入るかの切り分けがあります
下記のようにしない理由は?
●処理イメージ(サブ)
hatenaさん情報不足で色々すみません。非連結の認識は勘違いしてました。対象のフォームに直接関係ないイメージでとらえてました。今回の関連するテーブル構成としては下記になってます。
①処理メイン:メインID、日付、伝票番号、その他項目 ②処理サブ:サブID、品目A、品目B、金額A、金額B、メインID、その他の項目 *品目と金額入力欄が各2ヶ所あり ③品目一覧:品目ID、品目名、繰越金額、グループID ④グループ一覧:グループID、グループ名
社内用財務関係のファイルです(作成途中)。
特定の品目に繰越金額を入力して(半年毎)、それを処理メイン、サブに追加したいのです(日付設定は任意)。但し品目のグループにより品目A・金額Aに入るか品目B・金額Bに入るかの切り分けがあります(繰越時)。
③の品目一覧テーブルを基に特定の項目に対する繰越金額を入力できるフクエリを作成しました。入力したら品目A・金額A、Bに切り分ける為にIIFで処理してます。入力し易い様にこのクエリを基にリスト型フォームを作成し、処理メイン、サブに追加できるコマンドボタンを用意したいのです。
●繰越入力イメージ
品目 繰越 IIFにて切り分け ★フォームには任意の日付欄と伝票番号(共に非連結)
あ 1000 ⇒ 品目A・金額A
い 500 ⇒ 品目B・金額B
●処理イメージ(メイン)
日付 伝票番号
3/31 0000
●処理イメージ(サブ)
品目A 金額A 品目B・金額B
あ 1000
い 500
1レコードづつ追加は教えて頂いたDAOコードで出来ましたのでそれに繰り返し処理が出来たらいいかなと思ってます。
でもそれはどうやってしたらいいか分からなくて。
お手数かけます。
それぞれのテーブル名、フィールド構成、を提示して、
それぞれのデータ例を提示して、
どのような結果が欲しいのか説明してもらえますか。
非連結という言葉の意味を誤解しているようですね。
フォームがテーブルと連結してたら非連結とはいいません。
VBAでするならForループでレコード件数分繰り返せはいいでしょう。
ただ、テーブルがあるのなら追加クエリの方が楽です。
どのような意味で「非連結」という言葉を使ったのでしょうか。
hatenaさん すみません40件程のレコードは非連結というか、あるテーブルに保存されたものです。そのテーブルを加工したクエリがありそれを基に作成したリスト形式のフォームがあります。そのフォームにはサブフォームはありません。金額等の数字だけを入力してまして(項目は固定)それを別テーブルに追加する形です。追加先は日々の処理用でメインが日付や他の項目、サブに必要な項目や金額等が入ります。そのリスト型フォーム上のデータをコマンドボタンで追加したいのです。
式1: InStr(1,Nz([T_出力].[住所1],""),[T_置換用テーブル].[置換前],0)
というような演算フィールドは更新できませんからね。
プロシージャを抜ければ、自動で廃棄してくれますので、なくても問題ないです。(あっても問題はないですが。)
プロシージャが長くて、途中で使用済みになったというようなときに、使用済みということを明確にするために、
Set rs = Nothing とするということはありえます。
40レコード程あるとのことですが、非連結フォームなんですよね。
40レコード分の非連結コントロールがあるということですか。
それとも一時テーブルをレコードソースとするサブフォームが埋め込まれているとか。
HatenaさんのSQLビューをコピーしてデザインビューを確認したところ、住所1とInstrの2つに分かれました。1つのフィールドに書こうとしていたから上手くいかなかったのですね。
デザインビュー見ました。
更新するフィールドと抽出条件を設定するフィールドは別にしないと。
上記の回答で新規作成したクエリをデザインビューにして違いを確認してください。
クエリを新規作成して、SQLビューにして、下記のSQLを貼り付けて実行するとどうなりますか。
見にくいかもしれませんが、スクショでのデザインビューです。
hatenaさんへ 追加クエリではなく教えて頂いたDAOでしました。追加は出来たのですが、サブには1レコードづつなのですね? 40レコード程あるのですが、(メイン1つに対して)一括では出来ないのでしょうか? (知識不足ですみません)
あとついでにお聞きするのですが rs.Close の後は Set rs = Nothing と記述した方がいいのでしょうか?
SQLビューを開こうとしましたが、'InStr(1,[T_出力].[住所1],[T_置換用テーブル].[置換前],0)'が見つかりません、パラメータや別名が正しいこと、、、を確認してくださいというエラーが出ます。
このエラーが出ているクエリのSQLを提示してください。
エラーの出ないSQLを提示されても意味ないですよね。
一応、下記のSQLを実行してみましたが、エラーなく実行できました。
すみません、現状のSQLとは、Instrに書き換えた方(エラーが出ている方)のことでしょうか?
SQLを見る限りは問題なさそうですね。
簡単なサンプルを作成して確認してみましたが、問題なく実行できました。
クエリを新規作成して、SQLビューに提示のSQLをコピーして貼り付けて実行したらどうなりますか。
下記提示致します。
住所1のみのSQLです。
ありがとうございます。
2台のPCでテストしましたが、どちらも発生しました。
よってaccessのバクかと思われます。(office2002ではこのような現象はなかった)
ご回答ありがとうございます!
無事に合計値出すことができました。
テキストボックスとラベルについて性質を理解していないので勉強してみようと思います。
ありがとうございました。
[T_置換用テーブル].[置換前]
のテーブル名、フィールド名に間違いはないですか。間違いないなら、現状のクエリのSQLを提示してください。
ご質問の文章を拝見すると、「規定の文字数」の規定の理由が明確に記載されてなかったので、回答が迷走している感じがします。
最初に「レポートは最大サイズが決まっていますので、どこまでもテキストボックスを広げるわけにはいきません。」という記載があれば、その後の回答がスムーズになったかと思います。
※そういう意味で「何か特別な理由があるならば提示したほうが回答がつき易いですよ?」と記載されているのかと思います。
使用される環境によって、出力帳票の仕様は様々かと思いますので、同しようもないときもありますね。大きな会社ですと、レイアウトを一箇所変えるのも申告書が必要だったり、工場側のすべてのプリンターで正常に表示されるか確認が必要になることもあるので、結構厄介なケースもあります。
ただ規定の理由が不明瞭な場合、修正コストを考えると「ちょっとテキストボックスを広げるだけ」のほうが圧倒的に簡単ですぐに修正できます。
なので、自分の望む方向の回答が欲しい場合は、なるべくすべての条件を記載されるのが良いかなと思います。
>> 7
ExcelやWordに例えるとわかります。
文字列が途中で途切れたらセルの幅を広げたり、最大文字列に合わせて列の幅を広げたり、しませんか?
印刷用紙に収まらないならば、レイアウトが崩れるならば、規定の文字数を最初からオーバーしないように入力項目・内容から再検討しませんか?
データベースのレコードが文字数調整で更新・保存される事は普通ではありません。最初からそうならないように設計からやり直さないの?
うーん、納得いかなければ、hatenaさんに意見を求めてみたらどうですか?