Private Sub cbo送付先企業ID_Enter()
If Me.chk未登録 = True Then
Else
Me.cbo送付先企業ID.Requery
End If
End Sub
Private Sub txt送付先企業_Enter()
If Me.chk未登録 = True Then
Else
Me.cbo送付先企業ID.SetFocus
End If
End Sub
Private Sub cbo氏名ID_AfterUpdate()
Me.cbo氏名ID.Requery
If Me.txt住所1 = "" Then
MsgBox "住所が入力されていません。"
ElseIf Me.txt郵便番号 = "" Then
MsgBox "郵便番号が入力されていません。"
End If
End Sub
半角化じゃなかった、文字コードの変更をすると文字化け、の間違いです。スミマセン。
すみません。書きかけでエンターを押してしまいました。
下記コードで半角化すると文字化けしますが、こちらは今までどおりの式にして
カウントだけ変更すればよいでしょうか、今から試してみます。
ありがとうございます。とても参考になったのですが、うまく行きません。
Len 関数
その文字に何バイト使うか?というのは文字コードに依存します。(LenB関数の埒外)
String Data Type (Visual Basic)
VBAで文字を扱おうとすると基本、Unicodeで扱われます。Unicodeは半角、全角関係なく1文字を2バイトで表現する文字コードです。
半角カナ
いろいろあって、濁音や半濁音を表すときは2文字使うというのが現在です。
以上のことから質問の、
の例では4文字×2バイト増えた数字が表示されるのです。
半角1文字を1、全角1文字を2とカウントするためには、そう表現する文字コードに変換してLenB()を使う必要があります。最初のリンク先にある通り
のような処理をさせます。
表示/非表示の切り替えは、Visibleプロパティで可能です。
AccessVBAの基本8~可視・使用可能プロパティの変更
ご検討ありがとうございます。
そうですよね。申し訳ありません。
実際のファイルを送ることができないので、時間ができたら簡単なものを作ってみたいと思います。その前に、本件に関する別件で質問です。
(この件もファイルを送らないと伝わりづらかったら申し訳ありません、その場合は改めます)
上記コードの1つ目の件で、登録された企業はコンボボックスとテキストボックスを切り替えて表示しているのですが、未登録企業チェックを入れたときコンボボックスにロックをかけますが、表示されてしまうので紛らわしい状態です。(タブストップも適用される)
コンボボックスを非表示にすることはできますか?
現状ですと、どこのレコードソースを変更するのか分からない状態になっているかと思います。
フォームBのレコードソースを変更したい場合には下記になるかと。
またSelect Caseに対応するEnd Selectがありませんので、
別のエラーも出ていると思います。
可能なら、実際のファイルを見せてもらった方が速いです。
コードだけでは全体像がつかめないし、出ている情報だけからサンプルを作成して動作確認するのもちょっと困難なので。
右カラムの下の方にあるファイル送信フォームから現状のファイルを送信てもらえませんか。
テーブルデータは個人情報も入っていると思いますので、削除しておいてください。
早速の質問恐れ入ります。
まず、企業名はコンボボックスだったため以下設定にしてみました。(正しいでしょうか…?)
そして、チェックをつけたりはずしたりした時の挙動がよくわからなかったので
実行のタイミングをチェックボックス更新にしてみました…問題ありますでしょうか。
そして今困っている点です。チェックボックスを切り替えたとき、
不要な情報を消したいのですが、色々エラーが出てうまくいきません。。
まだ作成途中なので、これらの設定では今後不具合が出てくるのかもしれませんが
とりあえずチェックボックスの切替で悩んでいる状況です。
そのエラーがでるとき「F管理総合」フォームは開いてますか。
あるいは「F管理総合」がサブフォームということはないですか。
コンボボックスはフォームヘッダーに配置しているのですか。
フォームは帳票フォームですか。
フォームで新規レコードを入力できますか。
コンボボックスの値集合ソース、値集合タイプの設定を提示してください。
下記の手順で確認してみましたが、再現できませんでした。(普通に貼り付けできました。)
Access
テーブルを新規作成して、
データ型:短いテキスト
書式:@
のフィールドを追加
Excel
新規ブックを開いて、
A1セルに 00LJ と入力
B2セルに AU87 と入力
上記のセルをそれぞれコピーして、Accessのテーブルのフィールドに貼り付け
とりあえず、上記の手順をそちらでやってみてブランクになるという現象が発生しますか。
ありがとうございます!
テキストボックスを切り替えることができるのですね!!すごい。
理解できたつもりですが、作成してみてわからないところがでてきたら改めて質問させていただきたいと思っています。
申し訳ありませんが、その際は宜しくお願い致します。
また、色々考えている内に本件について追加の欲望もでてきたので、その件も行き詰ったら質問させていただきたいと思っております。すみません。
不足している情報は勝手に推測して、テーブルは下記と仮定します。
T送付履歴
送付ID、発送日、会社ID、送付資料1、送付資料2、・・・
T会社情報
会社ID、会社名、部署名、郵便番号、住所1、住所2、・・・
先頭のフィールドが主キー
T送付履歴 に下記のフィールドを追加します。
仮(Yes/No型)、仮会社名、仮部署名、仮郵便番号、仮住所1、仮住所2
上記のテーブルからクエリを作成してフォームのレコードソースとします。
フォームは単票フォームとします。
会社名、部署名、郵便番号、住所1、住所2 のフィールドはテキストボックスとしてフォーム上に配置します。
「編集ロック」は「はい」にしておきます。(マスターが不用意に更新されないようにするため)
また、フィールドの追加やウィザードで配置したテキストボックスの名前はフィールド名と同じになっているので、それぞれの名前を、
txt会社名、txt部署名、txt郵便番号、txt住所1、txt住所2 というように変更しておきます。
あと「仮」フィールドもフォーム上に配置します。Yes/No型なので、チェックボックスになります。
フォームのモジュールに下記のイベントプロシージャを作成します。
これで、仮チェックボックスにチェックを入れると、会社名、住所等を入力できるようになり、
仮会社名、仮住所1 ・・・に格納されます。
レポートでは、例えば会社名のテキストボックスのコントロールソースは、下記のように設定します。
=IIf([仮]=True,[仮会社名],[会社名])
以上、一例です。
度々スミマセン。結局自己解決しました。
現在は郵送履歴は残していませんでしたが、残したいと思っていたので
先程記載した現状のフィールドに「発送日」も追加予定です。
フォームは帳票にしていますが、よく考えたら単票でもいいです。
都合の良い方で宜しくお願い致します。
ご確認ありがとうございます。「F送付」のレコードソースはクエリになっています。
住所等の情報は「T会社情報」にあり、「Q送付」にひっぱっています。
Q送付のフィールド名は 送付ID、郵便番号、住所1、住所2、会社ID、会社名、部署名、氏名ID、氏名、送付資料1、送付資料2・・
といった感じです。
「普段は登録している企業を選択したら情報を引っ張ってくる」についてですが、
「F送付」の「cbo氏名ID」にて氏名を選択すると以下VBAが動きます。
フォームは帳票です。
アイデアがあるとうれしいです。ご検討ありがとうございます。
hatena様大変ありがとうございました。
ごめんなさい。修正して絞り込んだらうまく行ったとおもったのですが、勘違いでした。。
改めて、下記コードの修正部分を教えていただけると助かります。
Access上でしばらく悩んでいたので投稿したのですが、記載した途端間違いがわかりました。。
※orの部分を大かっこで囲む
スミマセン。お騒がせしました。
hatenaさん
迅速な返信感謝いたします。
ご提示いただいた入力で無事に解決しました。
助かりました。ありがとうございました!
[Q10_記号]![記号]>10<100
というような書き方はできません。というのが下記のようなことなら、
記号:
ABCDEF
数量:
123
の場合、下記のようにしたい。
ABCDE123 L
ということなら、
QRコード: Format(記号 & 数量,"!" & String(20,"@")) & "L"
ちがうのなら、上記のようにデータ例と出力例を提示してください。
うまくいきました!初歩的な間違いでお恥ずかしい限りです。ありがとうございます。
新規登録フォーム の「データ入力用」プロパティを「はい」に設定するか、
下記のように引数に acFormAdd を指定しておいた方がいいでしょう。
新規登録フォームのテーブルにIDが既に存在しているかどうかのチェックも必要かと思います。
できました!ありがとうございます!
「現在郵便を送るための住所欄」があるフォームのレコードソースは何でしょうか。
テーブル名 郵送履歴
フィールド名 郵送履歴ID、発送日、企業CD
というような感じでしょうか。
「普段は登録している企業を選択したら情報を引っ張ってくる」とは具体的にどのように実現してますか。
(コンボボックス、オートルックアップクエリ、VBA・・・)
フォームは単票フォームですか。
出荷日 > 顧客名 でグループ化してグループヘッダーに、出荷日と顧客名を配置。(出荷日 > 顧客名 の順は逆でも可)
詳細セクションに、品名、売上数量、売上単価、[売上数量]*[売上単価] を配置。
グループフッターにテキストボックスを配置してコントロールソースを下記に設定。
=Sum(IIf([消費税率]=0.1,[売上数量][売上単価],0)) 0.1 + Sum(IIf([消費税率]=0.08,[売上数量][売上単価],0)) 0.08
これで消費税合計が計算できます。
簡単なのはDLookup関数かな
コード全体がないとなんとも言い難いですが
標準モジュールで「Meキーワードの使用方法が不正です」(hatena chipsさん)
フォーム名指定をしたいのなら「Forms(formName)」ですかね
Forms object (Access)
ありがとうございます。「DefaultValue」についても勉強になりました
ありがとうございます。
やっと理解できてきた気がします。
詳しく教えてくださり、本当に感謝の気持ちでいっぱいです。
「新規登録用のフォームを開く」ですかね?
たとえば、自分自身なら
Me
で参照できますね。自分自身でない場合はForms!フォーム名
で参照できます。ただし、この場合データが即座に登録されます。新規登録するつもりはなかったが間違ってボタンをクリックしてしまったなんて場合が面倒ですね。規定値プロパティを使うと実際の登録を後回しにして値を設定できます
あぁ、すみません。そもそも「コードそのまま」がフィルターとして不適切ですね。フィルターとして設定する文字列はSQL(のWHERE句)に従った記述にしないといけません
VBAはSQLとして処理できる文字列を発行し、それをデータベースに処理させるという2段階の処理をしています。VBAとして発行したものをそのままフィルターに設置したいとなった場合は、たとえば
として表示される文字列を設定することになります。具体例を挙げると
のようになり、これをそのままフィルターに記述すれば動きます
VBAコード上で文字列を表すための「"」はVBAのための記述なのでフィルター用の文字列に含めてはいけません
この時「#~#」は、「直接記述した文字が日付ですよ」ということを表しています。VBAの出力からは人が見れば日付に見えるだけの文字でしかないので、SQLとして処理するために日付として扱ってほしい部分として「#」で囲っているわけです
これを直接SQLとして関数に置き換える場合「#」まで含めて書き直すこととなります。今回は、
DateSerial(Year(Date()), Month(Date()), 1)
自身が日付のデータとなるので、単純に「#」が不要になります式を修正しました。下記の式なのですが、やはり絞り込みができません。。
※読み込み時にフィルターを適用プロパティを「はい」にしている状態
今コピペして気づいたのですが、式が変わってしまっていますね・・・スミマセン。
最初の式でやり直してみます。
ありがとうございます。
Date()も試していたのですが、(記載すればよかったです、2度手間になりスミマセン)
それで行うと、絞り込みが行われませんでした。
Date()
と記述してくださいコードでかっこを使用する
VBAコード上では括弧を省略してもいいし、VBEが自動で省略してくれる(
Date()
と記述してもDate
になる)のですが、クエリやフォーム上ではこのルールが使えないのできちんと括弧付きで記述する必要がありますありがとうございます。
フォームを開いたときに自動で適用したかったのですが、フィルター適用プロパティが「いいえ」になっていたので変更しました。
しかし、新たに問題が起きました。
パラメータの確認ポップアップが出て「Date」と表示されます。
Forms!F鑑賞.FilterOn = True
に該当する設定はされていますか?FilterOn プロパティ
フィルターを適用して、Access データベースのレコードを選択して表示する - フィルターを保存する
何も設定されていなければ(デフォルトの設定だと)
[ホーム]>[並べ替えとフィルター]>[フィルターの実行]
または、
フォームのステータスバー>[フィルター処理なし/フィルター適用]
をクリックして手動でフィルターを適用することになります
フォームを開いたときに自動で適用するなら読み込み時にフィルターを適用プロパティを「はい」にします