Private Sub EXCEL出力_Click()
Dim intRow As Integer
Dim intCell As Integer
Dim xls As Object
'Excelオブジェクトを生成
Set xls = CreateObject("Excel.Application")
With xls
'画面の再描画を抑止
.ScreenUpdating = False
'既存のブックを開く
.Workbooks.Open ("C:\Users\xxx\Documents\Access_expo_excel\請求書.xlsx")
'各レコードをExcelに出力
With .Workbooks("請求書.xlsx").WorkSheets(1)
.Cells(15, 2).Value = Me!お名前
.Cells(16, 2).Value = Me!〒
.Cells(17, 2).Value = Me!ご住所
.Cells(18, 2).Value = Me!お電話番号
.Cells(19, 2).Value = Me!メールアドレス
.Cells(20, 2).Value = Me!車名
End With
'画面の再描画を元に戻す
.ScreenUpdating = True
'Excelを可視状態にする
.Visible = True
End With
Set xls = Nothing
End Sub
ACCESS(SQL)のANDとORにも優先順位がありANDが優先されます。
例えば元コードで男性の伊藤さんを探そうとなった場合、漢字指定だと 氏名='伊藤' OR フリガナ='伊藤' AND 性別='*男*'
は 氏名='伊藤' OR (フリガナ='伊藤' AND 性別='*男*')
と同じとなります。その他の検索項目はフリガナで抽出できた場合にしか影響しないということですね。
提示した修正はこれを (氏名='伊藤' OR フリガナ='伊藤') AND 性別='*男*'
となるようにするものです。
単票フォームで現在表示されているレコードのデータをエクセルへ転記したいということですよね。
なら、わざわざレコードセットを開かなくても(OpenRecordsetしなくても)、フォームのデータをそのまま代入すればいいでしょう。
提示のコードではシートを指定していないのでエラーになると思いますので、それも修正すると下記のようなコードになると思います。
Me!フィールド名 でフォームに表示されているデータを参照できます。
データの持ち方が間違っていると思いますか、
ということなので、そういうことにして、
年に対する元号をクエリで表示させたいということでしょうか。
テーブルを作成して結合するのが一番速いと思います。
年 フィールドにはインデックスを設定しておきます。
クエリで、「年」同士を結合して「元号」を表示させます。
くわしく解説いただきまして、ありがとうございます。
意味も理解できずに使用していまして、全くダメですね。
この掲示板をもっと活用させて頂いて、勉強していきます。
ありがとうございました。😄
無事に行ったようでなによりです。
せっかくなので軽く解説を置いておきます。
演算子には優先順位があります。
3 + 3 * 3 = 12 '・・・18ではない(乗算が優先される)
といったようなものです。
ACCESS(SQL)の
AND
とOR
にも優先順位がありAND
が優先されます。例えば元コードで男性の伊藤さんを探そうとなった場合、漢字指定だと
氏名='伊藤' OR フリガナ='伊藤' AND 性別='*男*'
は
氏名='伊藤' OR (フリガナ='伊藤' AND 性別='*男*')
と同じとなります。その他の検索項目はフリガナで抽出できた場合にしか影響しないということですね。
提示した修正はこれを
(氏名='伊藤' OR フリガナ='伊藤') AND 性別='*男*'
となるようにするものです。
ありがとうございます。
頑張ります!🙋♀️
最初のうちはネットで調べてコピペでもいいと思います。
ただ、そのまま使うのではなくそれぞれの関数やコードの意味を調べて理解するようにするといと思います。
調べても分からなければ、このような掲示板でどんどん質問すればいいでょう。
そのうちにスキルアップしてきます。
詳しく教えて戴きましてありがとうございます。
意味も考えずに使用しているだけでは、全くダメですね。
勉強していきます。
ありがとうございました。
Year(DateAdd("m",-3, [入出庫日])
についてDateAdd で入出庫日の3か月前を取得、
これにより 2019/4/1 ~ 2020/3/31 の日付は、2019/1/1 ~ 2019/12/31 に変換される。
Year で年を取得すると 2019 となる。
IIf(Month([受理年月日])<=3,Year([受理年月日])-1,Year([受理年月日]))
月が3以前だったら年から1をひく、そうでなかったら年をそのまま返す。
つまり、4月から12月のまでの日付はその年を返して、3月以下だったら年から-1する。
どちらにしても結果は同じになります。
hatena様 hiroton様
本日、試したところ無事思うように動きました。
大変勉強になりました。
ありがとうございました。😊
提示されている式をそのままコピーして使っているだけなんですが不思議ですね。
(ちなみに自分のところでは元のコードからエラーになります)
Or
とフリガナ
の間に半角空白が必要です。ありがとうございます。
早速試しに アオキ で検索しようとした所、
実行時エラー‘3075
クエリ式’(氏名 Like “アオキ” Orフリガナ Like”アオキ”)’の構文エラー:演算子がありません。
と、表示され、下記部分が 黄色に反転しています。
Me.Filter = Mid(strfilter, 6)
申し訳ありません、ほぼ見よう見まねですので、どうしよう・・・という感じになっています。
氏名検索のところを
↓
でどうでしょう?
申し訳ありません。
Me.氏名検索 のところで、フリガナ を入力して性別検索であったり 産業検索等の項目をいくつか選択し
抽出をかけると、絞り込みが出来るのですが、
Me.氏名検索 に 漢字で氏名 を入力して同じように項目をいくつか選択し
抽出をかけると、漢字(氏名)のみの絞り込みしか出来ず、その他のいくつか選択した項目の絞り込みが出来ません。
具体的に上げてください。
「何をどうしたらこうなってほしい」のだけれど「何をどうしたらどうなった」というのがなければ書いたとおりに動いているだろうとしか言えません。
エラーが出てコードが途中で止まるという話ではないですよね?
お返事ありがとうございます。
質問は編集できたのですね。申し訳ありません。
Me.参加 はチェックボックスです。
データ登録画面で、参加する しない を チェックボックスで選択してもらい、
検索画面で、チェックが入ったデータのみを抽出しようと思いましたので、
チェックが入っていないものは抽出しない、程度にしか考えていませんでした。
あと、確認ですか、
Me.参加
はチェックボックスでしょうか。チェックボックスとして、チェックが入っているときは、「参加有無」フィールドがTrueを抽出するのだと思いますか、チェックが入ってないときはどうしたいのでしょうか。
質問は後からでも編集できるので、質問のコードを実際のものに修正してください。
お返事ありがとうございます。
すみません、確認すると実際には
strfilter = strfilter & " AND 参加有無 =" & Me.参加
と、記述していました。
表題と質問の最初と最後でどれが本当の質問なのかよくわからないですが
または
クエリに抽出用にフィールドを増やして
あたりがやりたいことですかね?
ちょっと眺めただけですが
strfilter = strfilter & " AND 参加有無 Like '*" & Me.参加 & "*'"
参加有無がYes/No型ならばLikeで比較するべきではありませんし、右辺が文字列型になっているので抽出できることはまずないでしょう。(これを見た時点でほかの条件生成文は見ていません)
strfilter
をMe.FilterOn = True
の直前でウォッチウィンドウで確認するとかDebug.print
でイミディエイトウィンドウで確認してみるとおかしなところがわかると思います。回答いただきありがとうございます。
1の方法で試しまして解決しました!
Access使い始めて間もないので、一つの目的に対していくつものクエリを重ねてよいものか、プロパティなどをいじれば少ない工数でできるのではないか、といろいろ考えて手詰まっておりましたが…。もっとシンプルに、単純なクエリで一つ一つ進めればいいのだなと思いました。
2の方法は私には難しいと思うので、もう少しAccessとVBAに慣れてから勉強することにします。
ありがとうございます。
グループヘッダーとなるとリンク先の方法では無理ですね。
方法としては2つ考えられます。
1.集計クエリでグループ件数を計算して、それをレポートのレコードソースのクエリと結合して、それをレコードソースとする。
2.VBAでレポートのフォーマット時でグループ件数を取得して連想配列に格納して、印刷時にグループヘッダーで出力する。
1.の方法で回答します。
まず、現状の集計クエリからクエリを作成して、フィールドAとフィールドBを表示させて、
クエリプロパティの「固有の値」を「はい」にします。
これで、フィールドBの重複が排除された出力が得られます。
フィールドA グループ化
フィールドB カウント
これで、重複を排除した件数が取得できます。
このクエリをレポートのレコードソースのクエリと結合させてレポートのレコードソースにすれば、
ご希望の件数をグループヘッダーに表示できます。
お騒がせしましたが、自己解決しました。
更新パッチがいくつかあたっていなかったことが原因だったようです。初歩的なミスで大変お恥ずかしい限りです。
失礼いたしました。
ありがとうございました。
まず、テーブルで新規レコード(新規行)は最後に表示されるというのは仕様ですので変更できません。
また、空のレコードを追加したとして、それをabc順に並ぶように設定してあるテーブルで空のレコードを途中にすることはできません。abc順ではなくなるからです。
並び順を決定するフィールドが必要になります。その上でフォームでなら、下記で紹介している方法で途中に行を挿入することは可能です。
2019と2013の環境はあるのですが、残念ながら2016の環境は持っていませんので、私からはアドバイスは難しいですね。
ほかの方の回答をお待ちいただくか、別の掲示板で質問してください。
名前なしさんの式は、使い方が分かりませんでしたが、テーブルを作る方法が上手く行きました。大変助かりました。有難う御座いました。
データの重複数をcountして最大数nまで重複数i以上で抽出したレコードをunionする
とか
nまでの連番をデータにしたテーブルを用意してクロス結合から連番がcount以下のレコードを抽出する
とか、やってできないことはないと思うけど連番をつけるのに適さないデータでなぜ連番を付けたいのか疑問です。
本当にただ表示だけでいいのであればレポートを使えば楽だとは思います。
office2000 ですか。こちらには環境がないので動作確認は難しいですね。
8番目のコメントの名前なしさんの式も試してみてください。
ご返答有難うございます。自作関数を試したのですが家のパソコンでは上手くいくのですが、会社のwin7 office 2000では○○を含む文字列を除外しようとしても表示されてしまいます。エラーは、表示されません。自宅環境は、win10 office 2003です。宜しくお願い致します。
リンクテーブルだとうまくいかないのですか。
どのようにうまくいかないのですか。
エラーがでるならエラーメッセージをご提示ください。
再投稿します。やはり必要に迫られてODBC経由のリンクテーブルである場合の上記の対応策は、ありませんでしょうか?ご教授お願い致します。
どうもありがとうございました。
ひとまずは現状の方法で対応さるようにいたします。
テーブル名、フィールド名に間違いはないか、もう一度確認してください。
原因はそれ以外は思いつきません。
あと、下記を参考にクエリで表示できるか確認してみてください。
表示出来たら、それをフォームのレコードソースにすればいいでしょう。
うまくいきませんでした。
テーブル「データA」の主キーのフィールド名はIDとデータ型はオートナンバー型です。
「コメント」フィールドのデータ型は長いテキストです。
名前なしさんの回答てうまくいけばいいですが、
上手くいかない場合は、下記の情報を提示してください。
テーブル「データA」の主キーのフィールド名とデータ型、
「コメント」フィールドのデータ型、
メインフォームの方にチェックを入れたいのですよね。
まあ、サブフォームでもメインフォームでも実装は可能ですが、
現状の方法で十分だと思います。
お返事遅くなって申し訳ございません。
サブフォームコントロールを使っておりますので、アドバイスいただいた方法は実装が困難です。
こういう手が使えないのだとしたら、これまで私がやっていたような方法がリーズナブルでしょうか?
コントロールソースを以下に修正でいかがでしょうか?
下記で紹介している方法を使えば、更新できないクエリでも、チェックボックスにチェックを入れることはできます。
ただし、フォーム上のテキストボックスに選択データを格納しているので、フォームを閉じれば消えてしまいます。
また、エクセルにエクスボートする場合は、SQLをVBAで生成する必要があります。