Microsoft Access 掲示板

views
4 フォロー
6,283 件中 4,281 から 4,320 までを表示しています。
4
シソンヌ 2020/11/27 (金) 17:15:59 0029a@1c915 >> 2

半角化じゃなかった、文字コードの変更をすると文字化け、の間違いです。スミマセン。

3
シソンヌ 2020/11/27 (金) 17:13:39 0029a@1c915 >> 2

すみません。書きかけでエンターを押してしまいました。

Private Sub btn半角化_Click()
    Me.Refresh
    txt変更テキスト = StrConv([元テキスト], vbFromUnicode)
    Me.Refresh
End Sub

下記コードで半角化すると文字化けしますが、こちらは今までどおりの式にして
カウントだけ変更すればよいでしょうか、今から試してみます。

2
シソンヌ 2020/11/27 (金) 17:07:52 0029a@1c915 >> 1

ありがとうございます。とても参考になったのですが、うまく行きません。


1
名前なし 2020/11/27 (金) 16:14:07 d8dfb@f966d

Len 関数
その文字に何バイト使うか?というのは文字コードに依存します。(LenB関数の埒外)

String Data Type (Visual Basic)
VBAで文字を扱おうとすると基本、Unicodeで扱われます。Unicodeは半角、全角関係なく1文字を2バイトで表現する文字コードです。

半角カナ
いろいろあって、濁音や半濁音を表すときは2文字使うというのが現在です。

以上のことから質問の、

このページの下の「新しいトピックを作る」ボタンをクリックして質問を入力してください。あるいは下記のリンクをクリックしてください。

の例では4文字×2バイト増えた数字が表示されるのです。

半角1文字を1、全角1文字を2とカウントするためには、そう表現する文字コードに変換してLenB()を使う必要があります。最初のリンク先にある通り

LenB(StrConv(str, vbFromUnicode))

のような処理をさせます。

10
hatena 2020/11/27 (金) 10:52:13 修正

コンボボックスを非表示にすることはできますか?

表示/非表示の切り替えは、Visibleプロパティで可能です。

AccessVBAの基本8~可視・使用可能プロパティの変更

9
ポンタ 2020/11/27 (金) 10:44:40 0029a@1c915 >> 8

ご検討ありがとうございます。
そうですよね。申し訳ありません。
実際のファイルを送ることができないので、時間ができたら簡単なものを作ってみたいと思います。その前に、本件に関する別件で質問です。
(この件もファイルを送らないと伝わりづらかったら申し訳ありません、その場合は改めます)

上記コードの1つ目の件で、登録された企業はコンボボックスとテキストボックスを切り替えて表示しているのですが、未登録企業チェックを入れたときコンボボックスにロックをかけますが、表示されてしまうので紛らわしい状態です。(タブストップも適用される)
コンボボックスを非表示にすることはできますか?

1

現状ですと、どこのレコードソースを変更するのか分からない状態になっているかと思います。
フォームBのレコードソースを変更したい場合には下記になるかと。

Forms!フォームB.RecordSource

またSelect Caseに対応するEnd Selectがありませんので、
別のエラーも出ていると思います。

8

可能なら、実際のファイルを見せてもらった方が速いです。
コードだけでは全体像がつかめないし、出ている情報だけからサンプルを作成して動作確認するのもちょっと困難なので。

右カラムの下の方にあるファイル送信フォームから現状のファイルを送信てもらえませんか。
テーブルデータは個人情報も入っていると思いますので、削除しておいてください。

7
ポンタ 2020/11/27 (金) 00:51:48 0029a@1c915

早速の質問恐れ入ります。
まず、企業名はコンボボックスだったため以下設定にしてみました。(正しいでしょうか…?)

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 chk未登録_AfterUpdate()

(★ここに後述のコードを入れている)
    Call 未登録_AfterUpdate
End Sub

そして今困っている点です。チェックボックスを切り替えたとき、
不要な情報を消したいのですが、色々エラーが出てうまくいきません。。

(★上記の部分)

    If Me.chk未登録 = True Then
        Me.cbo送付先企業ID = Null
        Me.cbo送付先担当者ID = Null
    Else
        Me.txt送付先企業 = Null
        Me.txt送付先担当者 = Null
        Me.txt部署 = Null
        Me.txt郵便番号 = Null
        Me.txt住所1 = Null
        Me.txt住所2 = Null
    End If

まだ作成途中なので、これらの設定では今後不具合が出てくるのかもしれませんが
とりあえずチェックボックスの切替で悩んでいる状況です。

1

そのエラーがでるとき「F管理総合」フォームは開いてますか。
あるいは「F管理総合」がサブフォームということはないですか。

1

コンボボックスはフォームヘッダーに配置しているのですか。
フォームは帳票フォームですか。
フォームで新規レコードを入力できますか。

コンボボックスの値集合ソース、値集合タイプの設定を提示してください。

1

下記の手順で確認してみましたが、再現できませんでした。(普通に貼り付けできました。)

Access
テーブルを新規作成して、
データ型:短いテキスト
書式:@
のフィールドを追加

Excel
新規ブックを開いて、
A1セルに 00LJ と入力
B2セルに AU87 と入力

上記のセルをそれぞれコピーして、Accessのテーブルのフィールドに貼り付け

とりあえず、上記の手順をそちらでやってみてブランクになるという現象が発生しますか。

6
ポンタ 2020/11/26 (木) 22:01:38 0029a@1c915

ありがとうございます!
テキストボックスを切り替えることができるのですね!!すごい。
理解できたつもりですが、作成してみてわからないところがでてきたら改めて質問させていただきたいと思っています。
申し訳ありませんが、その際は宜しくお願い致します。
また、色々考えている内に本件について追加の欲望もでてきたので、その件も行き詰ったら質問させていただきたいと思っております。すみません。

5

不足している情報は勝手に推測して、テーブルは下記と仮定します。

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型なので、チェックボックスになります。

フォームのモジュールに下記のイベントプロシージャを作成します。

'レコード移動時
Private Sub Form_Current()
    Call 仮_AfterUpdate
End Sub

'仮チェックボックス更新後処理
Private Sub 仮_AfterUpdate()
    If Me.仮 = True Then
        Me.txt会社名.ControlSource = "仮会社名"
        Me.txt会社名.Locked = False
        Me.txt部署名.ControlSource = "仮部署名"
        Me.txt部署名.Locked = False
        Me.txt郵便番号.ControlSource = "仮郵便番号"
        Me.txt郵便番号.Locked = False
        Me.txt住所1.ControlSource = "仮住所1"
        Me.txt住所1.Locked = False
        Me.txt住所2.ControlSource = "仮住所2"
        Me.txt住所2.Locked = False
    Else
        Me.txt会社名.ControlSource = "会社名"
        Me.txt会社名.Locked = True
        Me.txt部署名.ControlSource = "部署名"
        Me.txt部署名.Locked = True
        Me.txt郵便番号.ControlSource = "郵便番号"
        Me.txt郵便番号.Locked = True
        Me.txt住所1.ControlSource = "住所1"
        Me.txt住所1.Locked = True
        Me.txt住所2.ControlSource = "住所2"
        Me.txt住所2.Locked = True
    End If
End Sub

これで、仮チェックボックスにチェックを入れると、会社名、住所等を入力できるようになり、
仮会社名、仮住所1 ・・・に格納されます。

レポートでは、例えば会社名のテキストボックスのコントロールソースは、下記のように設定します。
=IIf([仮]=True,[仮会社名],[会社名])

以上、一例です。

3
トマト 2020/11/26 (木) 14:51:37 0029a@1c915

度々スミマセン。結局自己解決しました。

4
ポンタ 2020/11/26 (木) 13:14:36 0029a@1c915 >> 1

現在は郵送履歴は残していませんでしたが、残したいと思っていたので
先程記載した現状のフィールドに「発送日」も追加予定です。

3
ポンタ 2020/11/26 (木) 13:10:15 0029a@1c915 >> 2

フォームは帳票にしていますが、よく考えたら単票でもいいです。
都合の良い方で宜しくお願い致します。

2
ポンタ 2020/11/26 (木) 13:08:50 0029a@1c915

ご確認ありがとうございます。「F送付」のレコードソースはクエリになっています。
住所等の情報は「T会社情報」にあり、「Q送付」にひっぱっています。
Q送付のフィールド名は 送付ID、郵便番号、住所1、住所2、会社ID、会社名、部署名、氏名ID、氏名、送付資料1、送付資料2・・
といった感じです。

「普段は登録している企業を選択したら情報を引っ張ってくる」についてですが、
「F送付」の「cbo氏名ID」にて氏名を選択すると以下VBAが動きます。

Private Sub cbo氏名ID_AfterUpdate()
    Me.cbo氏名ID.Requery
    If Me.txt住所1 = "" Then
    
    MsgBox "住所が入力されていません。"
    ElseIf Me.txt郵便番号 = "" Then
    MsgBox "郵便番号が入力されていません。"
    End If
End Sub

フォームは帳票です。
アイデアがあるとうれしいです。ご検討ありがとうございます。

3
tokinaito 2020/11/26 (木) 11:52:31 10f3b@f6db2

hatena様大変ありがとうございました。

2
トマト 2020/11/26 (木) 10:17:11 0029a@1c915

ごめんなさい。修正して絞り込んだらうまく行ったとおもったのですが、勘違いでした。。
改めて、下記コードの修正部分を教えていただけると助かります。

Forms!F作品.Filter = "月>=#" & DateSerial(Year(Date), Month(Date), 1) & "# AND 月<#" & DateSerial(Year(DateAdd("m", 1, Date)), Month(DateAdd("m", 1, Date)), 1) & "# And (([条件1chk] = False And [条件1] Is Null) Or ([条件2chk] = False And [条件] Is Null))"

1
トマト 2020/11/26 (木) 10:09:27 0029a@1c915

Access上でしばらく悩んでいたので投稿したのですが、記載した途端間違いがわかりました。。
※orの部分を大かっこで囲む
スミマセン。お騒がせしました。

2
wasabi 2020/11/25 (水) 16:58:57 d94c8@d1b14

hatenaさん
迅速な返信感謝いたします。
ご提示いただいた入力で無事に解決しました。
助かりました。ありがとうございました!

1

[Q10_記号]![記号]>10<100というような書き方はできません。

6ケタの記号に数量(1、10、100の位)、ケタ数を21桁に合わせるためにスペースを入れ、
最後21ケタ目にアルファベットの”L”と繋げる設定

というのが下記のようなことなら、

記号:ABCDEF
数量:123
の場合、下記のようにしたい。
ABCDE123            L
ということなら、

QRコード: Format(記号 & 数量,"!" & String(20,"@")) & "L"

ちがうのなら、上記のようにデータ例と出力例を提示してください。

2
ポンタ 2020/11/25 (水) 16:33:03 0029a@1c915

うまくいきました!初歩的な間違いでお恥ずかしい限りです。ありがとうございます。

3

新規登録フォーム の「データ入力用」プロパティを「はい」に設定するか、
下記のように引数に acFormAdd を指定しておいた方がいいでしょう。

Docmd.Openform "新規登録フォーム", , , , acFormAdd
Forms!新規登録フォーム!ID.DefaultValue = Me!ID

新規登録フォームのテーブルにIDが既に存在しているかどうかのチェックも必要かと思います。

2
hassy-hhh 2020/11/25 (水) 15:33:02 bf909@6eb0c

できました!ありがとうございます!

1
hatena 2020/11/25 (水) 15:27:51 修正

「現在郵便を送るための住所欄」があるフォームのレコードソースは何でしょうか。

テーブル名 郵送履歴
フィールド名 郵送履歴ID、発送日、企業CD
というような感じでしょうか。

「普段は登録している企業を選択したら情報を引っ張ってくる」とは具体的にどのように実現してますか。
(コンボボックス、オートルックアップクエリ、VBA・・・)

フォームは単票フォームですか。

3

出荷日 > 顧客名 でグループ化してグループヘッダーに、出荷日と顧客名を配置。(出荷日 > 顧客名 の順は逆でも可)

詳細セクションに、品名、売上数量、売上単価、[売上数量]*[売上単価] を配置。

グループフッターにテキストボックスを配置してコントロールソースを下記に設定。

=Sum(IIf([消費税率]=0.1,[売上数量][売上単価],0)) 0.1 + Sum(IIf([消費税率]=0.08,[売上数量][売上単価],0)) 0.08

これで消費税合計が計算できます。

1
hiroton 2020/11/25 (水) 14:53:49 6ffb1@f966d

簡単なのはDLookup関数かな

=DLookup("フィールドA","テーブルA","ID=" & DMax("ID","テーブルA"))
1
hiroton 2020/11/25 (水) 14:45:20 6ffb1@f966d

コード全体がないとなんとも言い難いですが
標準モジュールで「Meキーワードの使用方法が不正です」(hatena chipsさん)

フォーム名指定をしたいのなら「Forms(formName)」ですかね
Forms object (Access)

2
シソンヌ 2020/11/25 (水) 14:24:21 0029a@1c915

ありがとうございます。「DefaultValue」についても勉強になりました

8
トマト 2020/11/25 (水) 11:37:04 0029a@1c915

ありがとうございます。
やっと理解できてきた気がします。
詳しく教えてくださり、本当に感謝の気持ちでいっぱいです。

1
hiroton 2020/11/25 (水) 11:28:18 6ffb1@f966d

新規フォームを作成する

「新規登録用のフォームを開く」ですかね?

たとえば、自分自身ならMeで参照できますね。自分自身でない場合はForms!フォーム名で参照できます。

Docmd.Openform "新規登録フォーム"
Forms!新規登録フォーム!ID = Me!ID

ただし、この場合データが即座に登録されます。新規登録するつもりはなかったが間違ってボタンをクリックしてしまったなんて場合が面倒ですね。規定値プロパティを使うと実際の登録を後回しにして値を設定できます

Docmd.Openform "新規登録フォーム"
Forms!新規登録フォーム!ID.DefaultValue = Me!ID
7
hiroton 2020/11/25 (水) 11:11:46 6ffb1@f966d

あぁ、すみません。そもそも「コードそのまま」がフィルターとして不適切ですね。フィルターとして設定する文字列はSQL(のWHERE句)に従った記述にしないといけません

日付>=DateSerial(Year(Date()), Month(Date()), 1) AND 日付<DateSerial(Year(DateAdd("m", 1, Date())), Month(DateAdd("m", 1, Date())), 1)

VBAはSQLとして処理できる文字列を発行し、それをデータベースに処理させるという2段階の処理をしています。VBAとして発行したものをそのままフィルターに設置したいとなった場合は、たとえば

MsgBox Forms!F鑑賞.Filter

として表示される文字列を設定することになります。具体例を挙げると

月>=#2020/11/01# AND 月<#2020/12/01#

のようになり、これをそのままフィルターに記述すれば動きます

VBAコード上で文字列を表すための「"」はVBAのための記述なのでフィルター用の文字列に含めてはいけません

この時「#~#」は、「直接記述した文字が日付ですよ」ということを表しています。VBAの出力からは人が見れば日付に見えるだけの文字でしかないので、SQLとして処理するために日付として扱ってほしい部分として「#」で囲っているわけです

これを直接SQLとして関数に置き換える場合「#」まで含めて書き直すこととなります。今回は、DateSerial(Year(Date()), Month(Date()), 1)自身が日付のデータとなるので、単純に「#」が不要になります

6
トマト 2020/11/25 (水) 10:06:40 0029a@1c915 >> 5

式を修正しました。下記の式なのですが、やはり絞り込みができません。。
※読み込み時にフィルターを適用プロパティを「はい」にしている状態

"月>=#" & DateSerial(Year(Date()), Month(Date()), 1) & "# AND 月<#" & DateSerial(Year(DateAdd("m", 1, Date())), Month(DateAdd("m", 1, Date())), 1) & "#"
5
トマト 2020/11/25 (水) 10:02:29 0029a@1c915 >> 4

今コピペして気づいたのですが、式が変わってしまっていますね・・・スミマセン。
最初の式でやり直してみます。

4
トマト 2020/11/25 (水) 10:01:26 0029a@1c915

ありがとうございます。
Date()も試していたのですが、(記載すればよかったです、2度手間になりスミマセン)
それで行うと、絞り込みが行われませんでした。

"月 Between #" & DateSerial(Year(Date()), Month(Date()), 1) & "# AND #" & DateSerial(Year(Date()), Month(Date()) + 1, -1) & "#"
3
hiroton 2020/11/25 (水) 09:48:38 6ffb1@f966d

Date()と記述してください

コードでかっこを使用する

VBAコード上では括弧を省略してもいいし、VBEが自動で省略してくれる(Date()と記述してもDateになる)のですが、クエリやフォーム上ではこのルールが使えないのできちんと括弧付きで記述する必要があります

2
トマト 2020/11/25 (水) 08:45:48 0029a@1c915

ありがとうございます。
フォームを開いたときに自動で適用したかったのですが、フィルター適用プロパティが「いいえ」になっていたので変更しました。
しかし、新たに問題が起きました。
パラメータの確認ポップアップが出て「Date」と表示されます。

1
hiroton 2020/11/25 (水) 08:20:29 6ffb1@f966d

Forms!F鑑賞.FilterOn = Trueに該当する設定はされていますか?
FilterOn プロパティ
フィルターを適用して、Access データベースのレコードを選択して表示する - フィルターを保存する

何も設定されていなければ(デフォルトの設定だと)
[ホーム]>[並べ替えとフィルター]>[フィルターの実行]
または、
フォームのステータスバー>[フィルター処理なし/フィルター適用]
をクリックして手動でフィルターを適用することになります

フォームを開いたときに自動で適用するなら読み込み時にフィルターを適用プロパティを「はい」にします