Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


20 / 500 ページ ←次へ | 前へ→

【12926】Re:指定文字数にしたい
発言  かるびの  - 16/1/16(土) 16:34 -

引用なし
パスワード
   >今回は半角文字の対応はしなくても大丈夫そうなのですが、これをきちんと出す方法があれば、
>後学のために教えていただけるとうれしいです。

 これへの対応方法について興味が湧いたので、その対応方法を考えてみました。

 細かな処理を要するので、関数化します。

Function FnGetStr(ByVal strUni As String _
        , lngJisLen As Long _
        , strAddFull As String _
        , strAddHalf As String) As String
'UnicodeのstrUni文字列から、Shift-Jisで数えてlngJisLen分のバイト数の文字列を切り出す関数
'引数 strUni 文字列の切り出し元となるUnicodeの文字列)
'   lngJisLen 切り出すバイト数(Shift-Jisで計算)
'   strAddFull strUniがlngJisLenより短い場合に付加する全角の文字
'    strAddHalf strUniのバイト数が奇数になる場合に付加する半角の文字
'返り値 UnicodeのstrUni文字列から、Shift-Jisで数えてlngJisLen分のバイト数分を取り出した文字列(Unicode)
  
  Dim i As Long
  Dim strJis(1) As String  '添え字:0=前回ループ、1=今回ループ    
  Dim lngLen As Long
  Dim strRslt As String
  Dim strDbgUni As String  'デバッグ用
  
  'strUniがlngJisLenよりも短い場合に備えて、全角文字を付加
  strUni = strUni & String(lngJisLen, strAddFull)
  
  'Shift-JisによるstrUniのバイト数を調査。
  For i = Int(lngJisLen / 2) To Len(strUni)
    strJis(1) = Left(strUni, i)
    strJis(1) = StrConv(strJis(1), vbFromUnicode)
    
    If (LenB(strJis(1)) > lngJisLen) Then
      Exit For
    End If
    
    strJis(0) = strJis(1)
    
    strDbgUni = StrConv(strJis(0), vbUnicode) 'デバッグ用
  Next i

  'strUniから該当部分を切り出す。
  strRslt = Left(strUni, i - 1)
  lngLen = LenB(strJis(0))

  'Shift-Jisのバイト数が奇数になってしまう場合に備えて、半角文字を追加
  If lngJisLen - lngLen = 1 Then
    strRslt = strRslt & strAddHalf
  End If
  
  FnGetStr = strRslt
End Function
・ツリー全体表示

【12925】Re:カレントレコードのサブIDが前のレコ...
回答  かるびの  - 16/1/16(土) 13:02 -

引用なし
パスワード
    私の前レスの
> 私がやるなら、次のような方法をとります。
> すなわち、
>予めテーブルに「区分」フィールドを設けた上で、
>テーブルのレコードセットを取得し、
との部分についての補足ないし訂正です。


 まず、「テーブルのレコードセットを取得し、」ですが、正確に言うと、
「テーブルのレコードについて並び替えを指定したクエリのレコードセットを取得し、」
です。


 次に、「予めテーブルに「区分」フィールドを設けた上で、」についてです。

 「区分」フィールドを設けるのも一つの方法なのですが、
テーブルに設けるのは「区分」フィールドではなく、
「連番」フィールドにした方が使い勝手がいいかもしれません。 

 というのは、第一に、
「前のレコード」と比較したいという場面は、今回の「区分」フィールド以外にも
出てきそうなので、そうなった場合、連番フィールドがあると対応しやすいからです。

 第二に、「区分」フィールドの値は、特定の並び順の下でのみ妥当する値であり、
つまり、並び替え方が変われば、「区分」フィールドの値は異なってくるはずなので、
それを恒久的にテーブルに保持するというのは、良くないのではないかと思うからです。

 第三に、テーブルの「連番」フィールドであれば、それが暫定的な値、
つまり、特定の並び順の下でのみ妥当する値だということに気付きやすいからです。


 それから、前レスで触れた自己結合クエリの作り方について述べておきます。

 まず、クエリのデザインビューを開きます。
 そして、「テーブルの表示」というウィンドウを表示させます
(2003であれば、メニューの「クエリ(Q)」→「テーブルの表示(H)」を実行します)。
 「テーブルの表示」ウィンドウから「クエリ乙」を選択します。
すると、デザインビュー中に「クエリ乙」という標題のボックスが表示されます。
 次に、再度、「テーブルの表示」というウィンドウを表示させ、「クエリ乙」を選択します。
すると、デザインビュー中に「クエリ乙_1」という標題のボックスが表示されます。
 あとは、「クエリ乙」や「クエリ乙_1」から適宜フィールドを選択して、クエリ丙を作ります。
・ツリー全体表示

【12924】Re:カレントレコードのサブIDが前のレコ...
回答  かるびの  - 16/1/16(土) 3:12 -

引用なし
パスワード
    アクセスでは、あるレコードの値が他のレコードの値によって決まる
というような計算結果を表示するのは、苦手です。
 今回の場合、前のレコードの値によって区分フィールドの値が決まるわけであり、アクセスが苦手とするパターンのものにほかなりません。


 今回の場合、あるレコードについて、その「前のレコード」を取得できれば、
御希望のことができます。
 では、どうやって「前のレコード」を取得するかです。

 リレーショナルデータベースでは、テーブルにはレコードの並び順の情報を
持ちません。
 したがって、あるレコードを基準として「一つ前のレコード」とか、
「二つ後のレコード」とかということでは、レコードを特定できません。

 リレーショナルデータベースでは、レコードの特定は主キーによってなされます。
 したがって、今回の場合、「前のレコード」の主キーの値を
計算によって求められれば、希望のことができるということになります。


 主キーの値が連番であるということが保証されているのであれば、簡単です。
 あるレコードについて、その「前のレコード」の主キーの値は、
あるレコードの主キーの値から1を引くことにより求められます。

 ただ、主キーの値が必ず連番になっているというような事態は、
奇跡的な偶然の産物といってよいほどの事態です。
 というのは、あるレコードがテーブルから削除されれば、
主キーは連番ではなくなってしまうところ、
レコードの削除は、テーブルを長く使っていれば、ほとんど場合で少なくとも1度は行うはずであり、
将来を見越しても、少なくと1度はほぼ必ずレコードの削除をするはずだからです。
 そのため、主キーの値が連番となっているという事態は、ほぼ期待できません。

 
 主キーが連番であることが期待できないなら、
レコードごとに必ず値が異なり(これはしばしば「ユニークな」とか「一意の」とかと表現されます)、
かつ、連番となるフィールドを設けてあげられれば、解決します。


 具体的には、

ID  |サブID|名前   
301245|4500 |かきくけこ 
301246|4500 |まみむめも
301247|5000 |らりるれろ
301248|3500 |あいうえお

というテーブルに対して、連番のフィールドを持つクエリを作ります。
 まるこさんの「連番2」フィールドがそのような連番のフィールドに該ります。
そうすると、そのクエリは次のようなものになります。

ID  |サブID|連番2
301245|4500 |181 
301246|4500 |182 
301247|5000 |183 
301248|3500 |184 

 なお、このクエリを「クエリ甲」と呼ぶことにします。


 クエリ甲から、連番2の値から1を引いた値を持つ演算フィールドを持つクエリを作ります。
 このクエリは、「クエリ乙」と呼ぶことにします。
 次のようなクエリになります。

ID  |サブID|連番2|連番2引く1
301245|4500 |181 |    180
301246|4500 |182 |    181
301247|5000 |183 |    182
301248|3500 |184 |    183


 さらに、クエリ乙とクエリ乙とを結合させるクエリ(クエリ丙)を作ります。
 結合フィールドは、「連番2引く1」フィールドと「連番2」フィールドとします。
 なお、このようなクエリは「自己結合クエリ」と呼ばれます。

 クエリ乙        | クエリ乙_2
ID  |サブID|連番2引く1|連番2|ID  |サブID
301245|4500 |    180|   |   |
301246|4500 |    181| 181|301245|4500  
301247|5000 |    182| 182|301246|4500 
301248|3500 |    183| 183|301248|3500

 
 次に、「クエリ乙.サブID」フィールドと「クエリ乙_2.サブID」フィールドとを
比較する演算フィールドを持つクエリを作ります。
 この演算フィールドはIIF関数を使って式を組みます。
 そうすると、次のようなクエリになります。

 クエリ乙        | クエリ乙_2    |
ID  |サブID|連番2引く1|連番2|ID  |サブID|区分
301245|4500 |    180|   |   |   | *
301246|4500 |    181| 181|301245|4500 | 
301247|5000 |    182| 182|301246|4500 | * 
301248|3500 |    183| 183|301248|3500 | *


 考え方としては、上記のとおりなのですが、最大の問題点は速度です。

 DCount関数やDSum関数などは、D系関数と呼ばれたりしますが、
D系関数をクエリの演算フィールドで使うと、激遅となり、実用に堪えないと言われています。
 実際に私もそれを経験しました。
 なお、激遅になるかどうかは、
パソコンの性能とテーブルのレコード数次第であり、
高性能のパソコンでは実用に堪えるかもしれません。
 

 私のパソコンでは、激遅になってしまうので、
私がやるなら、上記のようなクエリは組みません。

 私がやるなら、次のような方法をとります。
 すなわち、
予めテーブルに「区分」フィールドを設けた上で、
テーブルのレコードセットを取得し、
これをループさせ、
各ループにおいて、前レコードと比較して、「区分」フィールドに値を書き込む
という方法を取ります。

 この方法だと、上記のようなクエリよりもはるかに速いです。

 もっとも、この方法は、VBA必須です。
・ツリー全体表示

【12923】カレントレコードのサブIDが前のレコード...
質問  まるこ  - 16/1/15(金) 16:25 -

引用なし
パスワード
   こんにちは初めまして

下記のようなクエリを作成したいと思っていますが、なかなか上手くいかずお知恵を借りたくてお邪魔しました
(カレントレコードのサブIDが前のレコードのサブIDと同じなら区分フィールドは空白、違っていたら*を入れたい)

ID  |サブID|名前   |区分
301245|4500 |かきくけこ|* 
301246|4500 |まみむめも|
301247|5000 |らりるれろ|*
301248|3500 |あいうえお|*

やってみたこと:

連番1というフィールドを作成し、DCount("証憑No","クエリA","サブID <= '" & [サブID] & "'")
連番2というフィールドを作成し、DCount("証憑No","クエリA","ID<=" & [ID])
として同じレコードの二つの値を比較しイコールなら*イコールでないならNullとしようとしました

IDはユニークでサブIDはユニークではありません。

こうなります

ID  |サブID|名前   |連番1|連番2|区分 |
301245|4500 |かきくけこ|182 |181 |   | 正解は*   
301246|4500 |まみむめも|182 |182 |*   | 正解はNull 
301247|5000 |らりるれろ|183 |183 |*   | 正解は* 
301248|3500 |あいうえお|181 |184 |   | 正解は*      

サブIDは例を見て頂いたらわかるとおり順番が昇順でも降順でもなくバラバラなんですよね・・・
だけどIDの昇順にしたいし、独自の番号ではなく与えられるものなので変更ができないんです
これはダメだと気付きましたがお手上げです
なにか良い方法はないでしょうか?
・ツリー全体表示

【12922】Re:指定文字数にしたい
お礼  あおぎん  - 16/1/14(木) 16:16 -

引用なし
パスワード
   ▼かるびの さん:

さっそくお返事ありがとうございます。

>>クエリの & Space$(64)を、& "〜32文字分の全角
>>スペース〜 "に変更したら、終了位置は揃ったのですが、なにぶん知識が薄いので、、、これで
>>いいんでしょうか?
>
> それでいいと思います。
> ほかにも方法が考えられますが、その方法がベストだと思います。

安心しました^^

それから、他の方法も教えていただきありがとうございます。
String 関数を調べて使ってみたら同じ結果になりました!
見た目スマートなのでこちらに変えようと思います^^

> さらに、「名称」に半角文字が含まれていた場合、
>出来上がる文字列が63バイトとか、65バイトになったりする
>ということもあり得そうです。

今のところ名称は全角を使うこととしているため、問題ないのですが、ためしに半角1文字を混ぜてみたら、おっしゃるとおり、シフトJISだと63バイトになってしまいました。

今回は半角文字の対応はしなくても大丈夫そうなのですが、これをきちんと出す方法があれば、後学のために教えていただけるとうれしいです。

ない頭を振り絞って考えると、例えば文字列に含まれる半角の数によって、半角スペースを足して、抽出するバイト数を変更するなどすれば・・などと思いますが、半角の数のカウントって簡単にはできないみたいですね;


面倒であればスルーしてください!
回答ありがとうございました!助かりました。
・ツリー全体表示

【12921】Re:指定文字数にしたい
回答  かるびの  - 16/1/14(木) 11:57 -

引用なし
パスワード
   >クエリの & Space$(64)を、& "〜32文字分の全角
>スペース〜 "に変更したら、終了位置は揃ったのですが、なにぶん知識が薄いので、、、これで
>いいんでしょうか?

 それでいいと思います。

 ほかにも方法が考えられますが、その方法がベストだと思います。


 ほかに考えられる方法について触れておきます。

 まず、32文字分の全角スペースを作る方法です。
 これについては、String 関数という関数が使えます。
 String 関数を使えば、クエリの演算フィールドに設定する式を短くすることができます。
 反面、関数呼出を伴うため、その分だけクエリが遅くなります。
もっとも、人間には気付かないくらいの差だとは思いますが。


 次に、64バイトの文字列を作るに当たり、
追加する全角スペースの数をその都度調整するという方法が考えられます。

 具体的には、
64バイトから、「名称」の文字列のバイト数を引き、
これを2で割って、追加する全角スペースの文字数を求め、
その分だけ、全角スペースを追加する
という方法です。

 しかし、いくつかの関数呼出を必要とするので、その分遅くなります(でも、きっと、気付かないくらいの差)。
 また、式が長くなりそうです。
 さらに、「名称」に半角文字が含まれていた場合、
出来上がる文字列が63バイトとか、65バイトになったりする
ということもあり得そうです。

 
 こうしたことを考えると、あおぎんさんの方法がベストかなと思います。
・ツリー全体表示

【12920】Re:指定文字数にしたい
質問  あおぎん  - 16/1/14(木) 10:45 -

引用なし
パスワード
   ▼かるびの さん:

レスポンスが遅くなって申し訳ありません。
回答ありがとうございます。半角は1バイトだと思い込んでおりました。
文字列の終了位置がまちまちな理由が理解できました。ありがとうございます。

>
> ところで、出力用のCSVファイルの文字コードはUnicodeでいいんでしょうか。

シフトJISコードで作成する仕様となっています。
エクスポート定義でシフトJISを指定しているので、CSVはシフトJISで作成されているんだと思います。


足すスペースを半角から全角スペースにして64バイト抜き出したらいいかと思いましたが、全角スペースを置く関数がよくわからなかったので、クエリの & Space$(64)を、& "〜32文字分の全角スペース〜 "に変更したら、終了位置は揃ったのですが、なにぶん知識が薄いので、、、これでいいんでしょうか?

間違ってたり、もっとスマートな?やり方などあればご教示いただけると助かります。
よろしくお願いいたします。
・ツリー全体表示

【12919】Re:指定文字数にしたい
回答  かるびの  - 16/1/8(金) 15:59 -

引用なし
パスワード
    アクセス2007では、文字コードはUnicodeが使われていたと思いますが、
Unicodeでは半角文字も2バイトとなります。
 だから、全角半角文字混在の場合、文字列の終了位置は全角半角の混在具合によって変わってきます。


 例えば、20バイトの文字列をいくつか掲げてみます。

あいうえおかきくけこ
あいうえお12345
あいう1234567
あ123456789

となります。


 なので、
>表示させてみると文字の長さがまちまちのようなのです。
でいう「文字の長さ」というのが上記で示した文字列の終了位置のことを言っているのであれば、
Unicodeを使う以上、文字列の終了位置がまちまちになるのは
当然のことだと思います。


 なお、文字コードがShift-JISであれば、全角2バイト、半角1バイト
となりますから、
64バイトの文字列の文字数は、Unicodeの場合とは変わってきます。


 ところで、出力用のCSVファイルの文字コードはUnicodeでいいんでしょうか。
・ツリー全体表示

【12918】指定文字数にしたい
質問  あおぎん  - 16/1/8(金) 12:06 -

引用なし
パスワード
   いつも参考にさせていただいています。

CSV出力用ファイルをアクセスで作成しているのですが、文字数指定で苦労しています。

64バイトと指定のある「名称」という項目があり、入力データは全角文字で8文字から20文字程度とまちまちなため

クエリで 名称変換:LeftB$([名称] & Space$(64),64)とし、64バイト分抽出しているのですが、

表示させてみると文字の長さがまちまちのようなのです。
名称変換の桁数を調べるとすべて32となっておりどうも全角文字数+半角スペースの数=32とはなっているようですが・・(全角文字10+半角スペース22とか全角文字12+半角スペース10とかになっています。)

クエリが間違っていますでしょうか??
ヒントでもよいのでご教示いただけると幸いです。
どうぞよろしくお願いいたします。


アクセス2007 Win2007
・ツリー全体表示

【12917】Re:直前の入力内容を新規レコードのフィ...
お礼  blue impact  - 15/12/29(火) 19:40 -

引用なし
パスワード
   ありがとうございました。早速ためしてみます。また教えてください。
・ツリー全体表示

【12916】Re:Access関数の記述=IIfについて教えて...
お礼  素人初心者  - 15/12/25(金) 9:06 -

引用なし
パスワード
   かるびの様
いろいろありがとうございました。

当方、殆ど素人で、
テーブル構成やフォーム構成など説明できません。

ありがとうございました。
・ツリー全体表示

【12915】Re:Access関数の記述=IIfについて教えて...
発言  かるびの  - 15/12/24(木) 19:41 -

引用なし
パスワード
   >イ部署 2015年状況表
>消費部材  5000000
>社内在庫  50000
>仕入れ   150000 (ここの数式)
>
>ロ部署 2015年状況表
>消費部材  5000000
>社内在庫  50000
>仕入れ   220000 (ここの数式)
>
>このように、部署ごとに集計表を出したいです。

 イ部署やロ部署の仕入額だけを求めたいというならば、DSum関数を使います。
 また、DSum関数ではなくて、クロス集計クエリでもいけそうな気もします。
 さらに、消費部材や社内在庫の求め方によっては、集計クエリを組み合わせるということも
あるかもしれません。


 ただし、仮に、DSum関数を使うとしても、テーブル構成がまずければ、DSum関数は使えません。


 いずれにしても、テーブル構成やフォーム構成がわからないと
これ以上は回答のしようがないです。
・ツリー全体表示

【12914】Re:Access関数の記述=IIfについて教えて...
回答  かるびの  - 15/12/24(木) 11:59 -

引用なし
パスワード
    外出直前なので、細かく考えてはいないのですが、
とりえず、テーブル構成はどうなっていますか。

 テーブル名
 主キーのフィールド名
 主要なフィールド名及びデータ型

を提示してください。
・ツリー全体表示

【12913】Re:Access関数の記述=IIfについて教えて...
質問  素人初心者  - 15/12/24(木) 9:49 -

引用なし
パスワード
   ▼かるびの さん:ご回答ありがとうございます。

どう説明してらいいのかさえ、わからない素人なのですが、

流れとしては、たとえば、

A社から仕入れた金額
1月 10000
2月 20000
|
12月 30000

B社から仕入れた金額
1月 50000
2月 70000
|
12月 10000

となった場合
コード?800はA社仕入れ(別に800はA社の仕入れと設定し、集計しています)
コード?801はB社仕入れ(別に801はB社の仕入れと設定し、集計しています)


年間集計として、
A社の合計を表示するために
=IIf([800]=0,"",[800])
の式が入っていましたが、

今回表示したい値は
A社の年間合計が0の場合B社の年間合計を表示

年間を通して、A社かB社かのどちらか一方しかしいれないので、
(部署によってA社のみで仕入れる部署と B社のみで仕入れる部署があります)

A社の年間合計が0の場合B社の合計を年間合計表示が無理な様であれば

A社の年間合計+B社の年間合計の値を表示したいと考え

=IIf([800]+[801]=0,"",[800]+[801])
上記のような記述で試したが、表示しなくなってしまったのです。


イ部署仕入れ(A社のみ仕入れ)
1月 10000
2月 20000
3月 10000
4月 10000
5月 10000
6月 10000
7月 10000
8月 10000
9月 10000
10月 10000
11月 10000
12月 30000
−−−−−−−−
計 150000

ロ部署仕入れ(B社のみから仕入れ)

1月 50000
2月 70000
3月 10000
4月 10000
5月 10000
6月 10000
7月 10000
8月 10000
9月 10000
10月 10000
11月 10000
12月 10000
−−−−−−−−−
計 220000

このような状況であった場合

イ部署 2015年状況表
消費部材  5000000
社内在庫  50000
仕入れ   150000 (ここの数式)


ロ部署 2015年状況表
消費部材  5000000
社内在庫  50000
仕入れ   220000 (ここの数式)


このように、部署ごとに集計表を出したいです。

いい方法があったら教えてください。


>>集計帳票で現在の記述は
>>=IIf([100]=0,"",[100])
>>となって記述されています。
>>
>>コードNo100の値を表示 値がゼロの場合は空白でという記述だと思っているのですが、
>
> いきなり脱線しますが、
>「空白」という表現は使うべきではありません。
> テキストボックスが空白になる場合には、
>テキストボックスの値が長さ0の文字列(空文字などとも呼ばれます)である場合と
>テキストボックスの値がNullである場合との
>2通りあります。
> そのため、「空白」という表現ではどちらのことなのか区別できないからです。
> ちなみに、長さ0の文字列とNullとでは、コンピュータでの処理上では、雲泥の差があります。
>
>
> で、本題ですが、 
> 上記の式は、おそらくテキストボックスのコントロールソースに記述されているのだと思います。
> 「100」という名前のコントロールがテキストボックスなのか、コンボボックスなのか、はたまた
>他の種類のコントロールなのか不明ですが、
>説明の便宜上、「100」という名前のコントロールはテキストボックスだとします。
>
> そこで、上記の式の意味ですが、
>「100」という名前のテキストボックスの値が0であれば、長さ0の文字列を表示し、
>そうでなければ、「100」という名前のテキストボックスの値を表示する
>というものです。
>
>
> また脱線しますが、
>上記の式にはものすごく違和感を覚えます。
> 上記の式が設定されたコントロールが表示する値が、テキスト型だったり(長さ0の文字列の場合)、数値型だったりするからです。
> エクセルではデータ型を意識することはないのに対して、アクセスはデータ型にうるさいわけですが(というより、エクセルがずさん過ぎる)、
>データ型を混在させると、このコントロールの値を使って何かをしようという場合に、
>困ったことになる場合が出てきます。
>
>
> さらに脱線ですが、
>上記の式が設定されたコントロールですが、値が0である場合に0を表示させないようにしたい
>ということですよね。
> そのためにわざわざ1つのコントロールを設けるのは、無駄ではないかと思います。
>
> また、もし、値が0である場合に、0を表示させたくないというならば、
>上記の式で言えば、名前が「100」であるテキストボックスの「書式」プロパティを、
>しかるべく設定すれば、実現することができます。
>
>
> 脱線はまだ続きますが、
>コントロールの名前を、例えば「100」のように数字で始まるものにするのはNGです。
> コントロールの名前の1文字目は文字にしなければなりません。
>
> 一般機能だけでアクセスを使うのであれば、つまり、VBAを決して使わないというのであれば、
>数字で始まる名前でも何とかなると思いますが、
>後々VBAを使うかもしれないというのであれば、数字始まりは避けるべきです。
>
>
> 本題その2です。
>
>>=IIf([800]+[801]=0,"",[800]+[801]) 
> 
> この式がうまくうまく動いてもらうためには、
>フォームに、「800」という名前のコントロールと「801」という名前のコントロールが
>存在している必要がありますが、そういうコントロールは存在しているのでしょうか。
>
>
>>正解な記述を教えていただければ助かります。
>
> フォーム構成を正確に提示してもらえなければ、正確な記述など示しようがありません。
>
> なお、通常、フォーム構成と言えば、
>フォームの名前、
>フォームのレコードソース
>フォーム上の主要なコントロールの名前
>当該コントロールのコントロールソース
>あたりを提示してもらうことになります。
・ツリー全体表示

【12912】Re:直前の入力内容を新規レコードのフィ...
回答  かるびの  - 15/12/24(木) 3:01 -

引用なし
パスワード
   既定値を使うのが最も簡単だと思います。
 
 Form_AfterUpdate(更新後処理)のタイミングで、
コントロールの値をそのコントロールの既定値に設定する
という方法です。

 当該コントロールのAfterUpdateのタイミングでもいいです。
 フォームのAfterUpdateにするか、コントロールのAfterUpdateにするかは
好みだとは思いますが、
フォームのAfterUpdateの方が操作感が良いように思います。
・ツリー全体表示

【12911】直前の入力内容を新規レコードのフィール...
質問  blue impact  - 15/12/23(水) 13:11 -

引用なし
パスワード
   フォーム上で数レコードを入力しています。ある特定のフィールドに、直前に入力した内容と同じものを入力したいと考えています。(例えば入会日が同じ等、途中から変わった場合は、変わったものを)。自動的に直前の内容を表示するようなマクロ等はないでしょうか?
・ツリー全体表示

【12910】Re:Access関数の記述=IIfについて教えて...
回答  かるびの  - 15/12/23(水) 1:09 -

引用なし
パスワード
   >集計帳票で現在の記述は
>=IIf([100]=0,"",[100])
>となって記述されています。
>
>コードNo100の値を表示 値がゼロの場合は空白でという記述だと思っているのですが、

 いきなり脱線しますが、
「空白」という表現は使うべきではありません。
 テキストボックスが空白になる場合には、
テキストボックスの値が長さ0の文字列(空文字などとも呼ばれます)である場合と
テキストボックスの値がNullである場合との
2通りあります。
 そのため、「空白」という表現ではどちらのことなのか区別できないからです。
 ちなみに、長さ0の文字列とNullとでは、コンピュータでの処理上では、雲泥の差があります。


 で、本題ですが、 
 上記の式は、おそらくテキストボックスのコントロールソースに記述されているのだと思います。
 「100」という名前のコントロールがテキストボックスなのか、コンボボックスなのか、はたまた
他の種類のコントロールなのか不明ですが、
説明の便宜上、「100」という名前のコントロールはテキストボックスだとします。

 そこで、上記の式の意味ですが、
「100」という名前のテキストボックスの値が0であれば、長さ0の文字列を表示し、
そうでなければ、「100」という名前のテキストボックスの値を表示する
というものです。


 また脱線しますが、
上記の式にはものすごく違和感を覚えます。
 上記の式が設定されたコントロールが表示する値が、テキスト型だったり(長さ0の文字列の場合)、数値型だったりするからです。
 エクセルではデータ型を意識することはないのに対して、アクセスはデータ型にうるさいわけですが(というより、エクセルがずさん過ぎる)、
データ型を混在させると、このコントロールの値を使って何かをしようという場合に、
困ったことになる場合が出てきます。


 さらに脱線ですが、
上記の式が設定されたコントロールですが、値が0である場合に0を表示させないようにしたい
ということですよね。
 そのためにわざわざ1つのコントロールを設けるのは、無駄ではないかと思います。

 また、もし、値が0である場合に、0を表示させたくないというならば、
上記の式で言えば、名前が「100」であるテキストボックスの「書式」プロパティを、
しかるべく設定すれば、実現することができます。


 脱線はまだ続きますが、
コントロールの名前を、例えば「100」のように数字で始まるものにするのはNGです。
 コントロールの名前の1文字目は文字にしなければなりません。

 一般機能だけでアクセスを使うのであれば、つまり、VBAを決して使わないというのであれば、
数字で始まる名前でも何とかなると思いますが、
後々VBAを使うかもしれないというのであれば、数字始まりは避けるべきです。


 本題その2です。

>=IIf([800]+[801]=0,"",[800]+[801]) 
 
 この式がうまくうまく動いてもらうためには、
フォームに、「800」という名前のコントロールと「801」という名前のコントロールが
存在している必要がありますが、そういうコントロールは存在しているのでしょうか。


>正解な記述を教えていただければ助かります。

 フォーム構成を正確に提示してもらえなければ、正確な記述など示しようがありません。

 なお、通常、フォーム構成と言えば、
フォームの名前、
フォームのレコードソース
フォーム上の主要なコントロールの名前
当該コントロールのコントロールソース
あたりを提示してもらうことになります。
・ツリー全体表示

【12909】Access関数の記述=IIfについて教えてくだ...
質問  素人初心者  - 15/12/22(火) 17:56 -

引用なし
パスワード
   突然の質問で失礼します。

現在使っているAccessで作成されているシステムの中で
帳票を作成しています。

集計帳票で現在の記述は
=IIf([100]=0,"",[100])
となって記述されています。

コードNo100の値を表示 値がゼロの場合は空白でという記述だと思っているのですが、

これをコードNo100の値または、コードNo101の値を表示 
値がゼロの場合は空白でという記述に書き換たいと思っています。

難しい場合は
100の値+101の値の合計の値を表示 
値がゼロの場合は空白でという記述でも良いので、
=IIf([800]+[801]=0,"",[800]+[801])
上記のような記述て゛ためしてみましたが、表示できませんでした。

正解な記述を教えていただければ助かります。

よろしくお願いいたします。
・ツリー全体表示

【12908】Re:CSVファイルのインポート
お礼  質問します。  - 15/11/25(水) 13:26 -

引用なし
パスワード
   試してみます。
ありがとうございました。
・ツリー全体表示

【12907】Re:CSVファイルのインポート
回答  hatena  - 15/11/24(火) 14:54 -

引用なし
パスワード
   >csvファイルは
>="111",="222",="333",
>で行数ユニークです。
>横の項目数は40個固定です

データの前に = が付いているのですか。変わったフォーマットですね。

そのままではインポートできないので、まずは、カンマ区切りでリンクテーブルにします。

|=111|=222|=333|

というような出力結果になります。

このリンクテーブルから追加クエリを作成して、下記のような式で、先頭の = を削除して、目的のテーブルに追加すればいいかと思います。

式1: Mid([フィールド名],2)
・ツリー全体表示

20 / 500 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
1078201
(SS)C-BOARD v3.8 is Free