Access2003を使用しています。

列Aに以下のような値があります。

列A
1111-222
3333-444-55
6666-777-88-99

これをハイフン毎に列を分けて以下のような形に整形したいのです。

列B   |列C   |列D  |列E
1111  |222   |     |
3333  |444  |55   |
6666  |777  |88   | 99

クエリなどで一発で実行できるコマンド等があればご教示いただきたく思います。
説明下手ですみませんが、よろしくお願いします。

A 回答 (11件中1~10件)

クエリで出来るのかな?出来たとしても難解なものになるのでは?


あの御方なら可能かもしれません・・
直感的に分かりやすいレコードセットを操作する方に決定
説明は最後に
'------------------------------------------------------
Const tblName = "T1" '操作したいテーブル名の定数

Function getColCount() As Long '最大の分割数取得
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim t As Long

  Set db = CurrentDb
  Set rs = db.OpenRecordset(tblName, dbOpenSnapshot)

  If rs.EOF = False Then
    t = UBound(Split(rs!F1, "-"))
    Do Until rs.EOF
      If getColCount < t Then
        getColCount = t
      End If
      rs.MoveNext
    Loop
  End If

  getColCount = getColCount + 1
  rs.Close: Set rs = Nothing
  db.Close: Set db = Nothing
End Function

Sub makeTable()  'テーブル操作
Dim db As DAO.Database
Dim rsFrom As DAO.Recordset, rsTo As DAO.Recordset
Dim tdf As DAO.TableDef
Dim strSql As String
Dim i As Integer
Dim tVar As Variant

  Set db = Application.CurrentDb

'既存テーブルにフィールド追加
  i = getColCount + 1
  strSql = "alter table " & tblName & " add column F"
  For i = 1 To i
    db.Execute strSql & CStr(i + 1) & " text(20) ", dbFailOnError
  Next i
  db.TableDefs.Refresh

'各フィールドにF1フィールドの分割した値を格納
  Set rsFrom = db.OpenRecordset(tblName, dbOpenSnapshot)
  Set rsTo = db.OpenRecordset(tblName, dbOpenDynaset)
  Do Until rsFrom.EOF
    tVar = Split(rsFrom!F1, "-")
    rsTo.Edit
    For i = 0 To UBound(tVar)
      rsTo.Fields("F" & CStr(i + 2)) = tVar(i)
    Next i
    rsTo.Update
    rsFrom.MoveNext: rsTo.MoveNext
  Loop

  rsFrom.Close: Set rsFrom = Nothing
  rsTo.Close: Set rsTo = Nothing
  db.Close: Set db = Nothing
End Sub
'------------------------------------------------------
データが入っているテーブルの複製をコピペして、テーブル名を、T1 に
データがあるフィールド名を、F1 に変更

DAOに参照設定がされていなければ・・
Alt + F11 を押してVBEの画面にして
メニュー→ツールから参照設定を選択
参照可能なライブラリから、Microsoft DAO 3.6 Object Library を探して
チェックボックスにチェックを入れます

メニュー→挿入から標準モジュールを選択
新たな窓が出てくるので、上記の点線で囲んだ部分をコピペ
Ctrl + G を押してイミディエイトウィンドウを出して
そこに maketable と入力し Enter

Alt + F11 で Access の 窓に切り替え
先ほどの T1 テーブルを開いてみてください。
なお、DAOのメンバを使うように変数宣言してますので、ADO との共存可能也
また、T1 テーブルにはフィールドは一つしかないものと仮定
文字数ぎり
    • good
    • 0

おお!


またやってしまいましたかorz
試したつもりだったのですが・・・言葉もありません。
鱗の次は冷や汗。。。

piroin654 さん ありがとうございます。
そして、質問者さんごめんなさい。

バグの根っこは、getColCount 関数に有りました。
ついでに見直して データが空(Null)だった場合に対応したつもり。
Nz で囲んだだけです。こんどは大丈夫かな?

Function getColCount() As Long '最大の分割数取得
  Dim db As DAO.Database
  Dim rs As DAO.Recordset
  Dim t As Long
  
  Set db = CurrentDb
  Set rs = db.OpenRecordset(tblName, dbOpenSnapshot)
  
  If rs.EOF = False Then
    Do Until rs.EOF
      t = UBound(Split(Nz(rs!f1, ""), "-"))
      If getColCount < t Then
        getColCount = t
      End If
      rs.MoveNext
    Loop
  End If
  getColCount = getColCount + 1
  rs.Close: Set rs = Nothing
  db.Close: Set db = Nothing
End Function

Sub makeTable()   'テーブル操作
  Dim db As DAO.Database
  Dim rsFrom As DAO.Recordset, rsTo As DAO.Recordset
  Dim tdf As DAO.TableDef
  Dim strSql As String
  Dim i As Integer
  Dim tVar As Variant
  
  Set db = Application.CurrentDb
  
  '既存テーブルにフィールド追加
  i = getColCount
  strSql = "alter table " & tblName & " add column F"
  For i = 1 To i
    db.Execute strSql & CStr(i + 1) & " text(20) ", dbFailOnError
  Next i
  db.TableDefs.Refresh

  '各フィールドにF1フィールドの分割した値を格納
  Set rsFrom = db.OpenRecordset(tblName, dbOpenSnapshot)
  Set rsTo = db.OpenRecordset(tblName, dbOpenDynaset)
  Do Until rsFrom.EOF
    tVar = Split(Nz(rsFrom!f1, ""), "-")
    rsTo.Edit
    For i = 0 To UBound(tVar)
      rsTo.Fields("F" & CStr(i + 2)) = tVar(i)
    Next i
    rsTo.Update
    rsFrom.MoveNext: rsTo.MoveNext
  Loop

  rsFrom.Close: Set rsFrom = Nothing
  rsTo.Close: Set rsTo = Nothing
  db.Close: Set db = Nothing
End Sub
    • good
    • 0
この回答へのお礼

nicotinismさんをはじめ、たくさんの方より助言をいただき光栄です。質問者です。

nicotinismさんの助言を参考に試行錯誤しておりましたが、望みどおりの結果を得ることができました。大変感謝しております。
レコードが25万件ほどありましたので、一時はExcelでちまちま区切り位置で変換しようとも思いましたが、分かりやすい説明のおかげでAccess上で実行することができました。

ありがとうございました。

お礼日時:2011/04/14 18:01

nicotinismさん フィールド数がたりません。


>For i = 1 To i
 For i = 1 To i + 1
なら、正常なんですが。
    • good
    • 0

追伸。

nicotinism です。
回答がチンプンカンプンなら・・取り合えず Excel にデータを持って行って
データ→区切り位置で、"-"を指定して分割されたらどうですか?
質問内容からすると、もう御存知のようなのですが一応。
    • good
    • 0

モジュールで自作関数を作る。



Function chkst(st As String, sw As Integer)
Dim x As Long
Dim y As Long
Dim z(10) As String
x = Len(st)
y = 1
z(1) = ""
z(2) = ""
z(3) = ""
z(4) = ""
For I = 1 To x
If Mid(st, I, 1) = "-" Then
y = y + 1
z(y) = ""
Else
z(y) = z(y) & Mid(st, I, 1)
End If
If y > sw Then Exit For
Next I
chkst = z(sw)
End Function

クエリデザインで
B項目:CHKST("1111-222-333",1)としたら"1111"
C項目:CHKST("1111-222-333",2)としたら"222"
D項目:CHKST("1111-222-333",3)としたら"333"

母体文字列を与えて"-"出現何番目区切りを受け取るか、
そんな関数を作れば良いです。

サンプルなので、
CHKST("1111-222",3)
結果が伴わないもの、初期化も省略してます。完全ではありません。

こういうのを考えてアレンジしてみてください。
    • good
    • 0

20246kikuさんへ


なあ~るほど!
眼から鱗が4枚ポロリ。
頭を柔軟にしなくてはいけませんね。
ありがとうございます。
    • good
    • 0

いろいろやり方があると思いますので・・・




標準モジュールに、以下のユーザ定義関数を作成します。

Public Function MojiCut(iNum As Integer, vSrc As Variant, _
            Optional sDEL As String = "-") As String
  On Error Resume Next
  MojiCut = ""
  MojiCut = Split(vSrc, sDEL)(iNum)
End Function

"-" で区切った何番目を返すようにします。
何番目は、0スタート

ユーザ定義関数を、クエリから呼び出すようにします。

テーブル名を「TBL_A」と仮定します。

クエリのSQLビュー記述は以下。

SELECT MojiCut(0,列A) AS 列B
, MojiCut(1,列A) AS 列C
, MojiCut(2,列A) AS 列D
, MojiCut(3,列A) AS 列E
FROM TBL_A;

クエリの表示結果は以下

列B   列C   列D   列E
1111   222      
3333   444   55   
6666   777   88   99

区切りを指定しなければ "-" で区切ったものになります。

MojiCut(0,列A,",") AS 列B

とすると、区切りは "," (カンマ)になります。

上記クエリは、"-" 区切りで4つになることを前提としていますが、
何個に区切られるかわからない時には、VBA でクエリの内容を作成します。


Dim rs As New ADODB.Recordset
Dim sSql As String
Dim i As Integer, iLoop As Integer

iLoop = -1
rs.Source = "SELECT Max(Len(列A)-Len(Replace(列A,'-',''))) AS 数 FROM TBL_A;"
rs.Open , CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
If (Not rs.EOF) Then iLoop = rs(0)
rs.Close

sSql = ""
For i = 0 To iLoop
  sSql = sSql & ", MojiCut(" & i & ",列A) AS 列" & Chr(Asc("A") + i + 1)
Next
If (Len(sSql) > 0) Then
  sSql = "SELECT " & Mid(sSql, 3) & " FROM TBL_A;"
  Debug.Print sSql ' ★ 作成されたSQL
End If


"-" の個数の最大数を求めて、くるくる作成します。
"-" が26個以上ある時には、Chr(Asc("A") + i + 1) 部分は考えてください。


提示サンプルデータで上記を実行した時に作成される ★部分でのSQLは、

SELECT MojiCut(0,列A) AS 列B, MojiCut(1,列A) AS 列C, MojiCut(2,列A) AS 列D, MojiCut(3,列A) AS 列E FROM TBL_A;

となるので、後はその内容で、
クエリを作成する/既存クエリの内容を書き換える等、
処理を追加すればよいと思います。


参考になる/ならない等々、自己責任でお願いします。

(データ量によっては使えないものかも・・・)
    • good
    • 0

No1、No3です。



DAOを使っているので、コード表のツールから
参照設定を選択して、
Microsoft DAO xx Object Library
にチェックを入れて、OKとします。xxは3.6のような数字です。
このとき、
Microsoft ActiveX Data Objects xx Library
にチェックが入っていたらはずしてください。

以上です。
    • good
    • 0

訂正です。


コードのSub cmdData()のところを
以下におきかえてください。

Sub cmdData()
Dim db As Database
Dim rs1 As Recordset
Dim rs2 As Recordset
Dim str As Variant
Dim i As Long
Dim j As Long
Dim k As Long
Dim l As Long

Set db = CurrentDb
Set rs1 = db.OpenRecordset("Tデータ", dbOpenDynaset)
Set rs2 = db.OpenRecordset("Tデータ分割", dbOpenDynaset)

If rs1.RecordCount > 0 Then
rs1.MoveFirst
Do Until rs1.EOF
j = 0
For i = 1 To Len(rs1!列A)
If Mid(rs1!列A, i, 1) = "-" Then
j = j + 1
End If
Next i
str = Split(rs1!列A, "-")
rs2.AddNew
For k = 0 To myCount
rs2.Fields(k) = Null
Next k
rs2.Update
rs2.MoveLast
If j = 0 Then
rs2.Edit
rs2.Fields(0) = str(0)
rs2.Update
End If
If j > 0 Then
rs2.Edit
rs2.Fields(0) = str(0)
rs2.Update
For l = 1 To j
rs2.Edit
rs2.Fields(l).Value = str(l)
rs2.Update
Next l
rs2.MovePrevious
End If
rs1.MoveNext
str = ""
Loop
End If

rs1.Close: Set rs1 = Nothing
rs2.Close: Set rs2 = Nothing
db.Close: Set db = Nothing
End Sub





No1の続きです。文字数がギリギリだったので。


フォームのボタンクリックで、Tデータ分割という
テーブルにデータを抽出します。
以上です。コードの中で何をしているかの説明は
省きます。何かあれば補足してください。
    • good
    • 0

この際INSTR関数は覚えておく方が良い。



-を違う文字に置き換えたら区切ることできるか。

固定文字列にすれば何文字めから何文字めまでがB列、何文字めから何文字めまでがC列、となる。

-が何個あるか、あったとして何番目か。1番目見つかるまでがB列、2番目見つかるまでがC列、となる。

どんな情報があれば、置き換えすれば実現出来そうか考えてみる。

VBA、モジュール作成はできますか。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QアクセスのクエリでSplit関数は使えないのですか

レコードにaaa/bbb/cccと入っていて、
クエリで
SELECT Split([テーブル1]![フィールド1],"/") AS test
FROM テーブル1;
とすると、
式に未定義関数 <関数名> があります。(Error 3085)
になります。

VBAでやるとしたら
Sub test()
Dim str As String
str = "aaa/bbb/ccc"
Debug.Print Split(str, "/")(1)
End Sub

のような事がしたいのですが
クエリでは無理なのでしょうか?

Aベストアンサー

あれれ、モジュール(VBA)では無くて、クエリの方をお願いしたつもりだったんですが。

splitを適用したいクエリの結果は、列にSplitを適用しない状態だと何行(レコード)あるんですか?
1行(レコード)で複数箇所splitを適用してませんか?

QAccessのクエリで、Left関数を使用して、7桁の数値を抜き出す方

Accessのクエリで、Left関数を使用して、7桁の数値を抜き出す方法。
IDが8桁で入力されているのですが、左から7桁だけを抜き出して、全てのレコードを表示させたかったのですが、誤って入力されている7桁のIDしか表示されませんでした。
いつもExcelを使用している感覚だったので、文字の左から7桁の数値や文字列を抽出して表示してくれるものと思っていました。
元のテーブルに入力されているIDを変更することなく、
クエリで、7桁だけにして、その取り出した7桁で区別し、グループとして認識し合計を出したいと考えているのですが、どうすればよいのでしょうか。
宜しくお願い致します。

Aベストアンサー

>Left関数をする前は、5000行程なのですが、関数を加えたとたん4300程度に減ってしまいます。

関数を加えるのでは無く、関数だけ(演算フィールドのみ)のクエリを作成をして実行させます
単にleft関数で左から何文字取れという演算フィールドしか持たないクエリを実効させれば、指定した桁数に満たない場合には実際にある桁数まで、一文字も入っていない場合には0を返して、全データ分のクエリ結果を返します

全件分のデータが帰って来ないという事は作成しているクエリに問題ありの可能性高いです

先の書き込みに書きましたが、手順は演算フィールドのみのクエリを作成し実行させ全データが取得出来る事を確認してから、この演算フィールドのみのクエリに必用なフィールドを追加してゆくって事してください

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。

QAccess で 特定の文字の個数をしりたい

テーブルのフィールドに特定の文字があります。
たとえば、@があったとすると、1フィールド内に何個@があるか調べるにはどうしたらよいのでしょうか。

宜しくお願いします。

Aベストアンサー

個数を調べつ関数を作り、クエリから呼ぶようにすれば

よいと思います。

---
標準モジュール

Public Function cnt(wk As Variant) As Long

cnt = UBound(Split(wk, "@"))

End Function

SQL

SELECT cnt([フィールド]) AS 個数
FROM テーブル;

QACCESS IIF関数 複数条件の設定について

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "")


なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、
Accessの関数などではこれだと正しい結果が得られません。
正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の
2つの要素からなる形にする必要があります。
(「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と)

但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる
式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証
されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として
指定すればOk、ということになります。
(「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた
 場合は、省略ができない、と)


【参考】
「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。
この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに
なります。
何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、
ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す
ことになります。

この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」
以外なので、「真(=-1)」という値が返された、ということです。

なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに:
http://oshiete.goo.ne.jp/qa/4850675.html

a)IIF関数で対応する場合:
 IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。

式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", ""))))


b)別の組込関数を使用する場合:
 IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで
 使用できる、似た機能の関数に、Switch関数というものもあります。
 これであれば、入れ子にする必要がなくなります。
 (詳しくは、Accessのヘルプを参照下さい)

式: Switch([X]<=0, "", [X]<=50, "A"...続きを読む

Qアクセスで#エラーを表示させない方法は?

アクセス2000を使用しています。フォームにテキストボックスを貼り付けて、計算式を入れています。計算できない数値になると、#エラーと表示されます。目障りなので、#エラー という表示を消したいのですが、どうしたらよろしいでしょうか?宜しくお願い申し上げ候。

Aベストアンサー

はじめは「IIF関数とIsError関数を使用して」と考えたものの、IIF関数は引数がエラーになった時点で
エラーが返されてしまう(=元の木阿弥)ので、どうしたものかと思ったのですが・・・
とりあえず、「見た感じ、何も表示されていないように見える」ということで、『条件付書式』での対応と
いうのはいかがでしょうか。

1)当該フォームをデザインビューで開く
2)当該テキストボックスを選択
3)メニューで「書式(O)→条件付き書式(D)」を選択
4)『条件付き書式設定』ダイアログが開くので、『条件1(1)』枠の左端にあるコンボボックスで「式」を選択
5)上記コンボボックスの隣が1つのテキストボックスになるので、そこに以下のような式を入力
 IsError([テキスト0])
 ※上記の式は当該テキストボックスの名前が「テキスト0」の場合です。
6)上記テキストボックスの下、右から2番目に「A」と表示された、文字色を指定するボタンがあるので、
 その左の小さな「▼」をクリックし、当該テキストボックスの背景と同じ色(既定では白のはず)を選択
7)『OK』ボタンをクリックしてダイアログを閉じる

・・・以上です。
これで、『テキスト0』の計算式がエラーになった場合は、文字色が背景と同じ色になるので、「#エラー」と
いう表示はされていないように見える、という状態にすることができると思います。

はじめは「IIF関数とIsError関数を使用して」と考えたものの、IIF関数は引数がエラーになった時点で
エラーが返されてしまう(=元の木阿弥)ので、どうしたものかと思ったのですが・・・
とりあえず、「見た感じ、何も表示されていないように見える」ということで、『条件付書式』での対応と
いうのはいかがでしょうか。

1)当該フォームをデザインビューで開く
2)当該テキストボックスを選択
3)メニューで「書式(O)→条件付き書式(D)」を選択
4)『条件付き書式設定』ダイアログが開くので、『条件1(1)』枠の...続きを読む

QAccessで名前の間のスペースを削除したいのですが

Accessで名前の間のスペースを削除したいのですが

Aベストアンサー

細かい状況が分かりませんがAccessではReplace関数というものが使用できます。
例えば 鈴木 太郎 のようなデータがテーブルの氏名フィールドに入っている場合には、更新クエリーで次のように更新すれば間のスペースを除去できます。
Replace([氏名]," ","")

Replace関数は文字列中のある文字を別の文字に置き換える関数ですが、この例では全角スペースを""(空文字列=文字なし)に置き換えています。

QAccessの桁区切りについて教えてください。

アクセスのレポートの金額に、桁区切りのカンマを付けたいと思っています。
プロパティの書式を通貨にすると¥マークがついてしまいます。
合計は付いてもいいのですが、内訳には¥マークを付かないように桁区切りだけにしたいのです。

そのため、書式に『###,##0』としました。
できましたが、小数点以下が表示されません。

小数点を表示したいので『###,##0.###』としたら、『59,180.000』となってしまいます。
小数点の指定を自動から3桁表示に変えましたが、うまくいきません。

教えていただきたい内容としては、
・金額の表示に桁区切りのカンマを付けたい。
・でも¥マークは付けたくない。
・小数点以下該当があるもののみ3桁まで表示させたいが(5,500.365)、
 小数点以下がないものは小数点以下は表示させたくない(5,400)。

ぜひともアクセスを使いこなしている方、お教えください。

Aベストアンサー

この内容からですと、[金額]フィールドを「レコードの内容により、書式を変えたい」と
いうことですので、テキストで処理する方法よりないかと思います。(Access2000)

VBAによる「ユーザー定義関数」を使う方法ですが、それで良かったら手順を
詳しく書きますので、テストしてみてください。

・テーブルのデザインで[金額]フィールドを「数値型」の「単精度浮動小数点型」か
 「倍精度浮動小数点型」にします。

・「モジュール」の新規作成で開いたコードウィンドウに下記コードをコピーして
 貼り付けます。

・フォームのレコードソースにするためのクエリを作成します。
 必要なフィールドをQBEグリッド(画面の下側)にドラッグした後、
 新規フィールドに 例えば、 金額Txt:Valtxt([金額]) と入力します。

・レポートの[金額]のコントロールソースに、この[金額T]を指定します。
 この書式で「配置」を右に設定します。

これで、少数部がない数値は、整数部だけを表示し、位取りの , が付きます。
小数部がある場合は、4位を四捨五入します。(通常と同じ)
その結果、右側に 0 が付いた場合は、表示しません。

ご承知の上とは思いますが、表形式の場合、少数点位置が揃わなくなりますので
見ずらくなってしまいます。

このようなもので如何でしょうか。

Function Valtxt(V As Double) As String
Dim T As String
Dim N As Integer
T = Format(V, "#,##0.000")
For N = Len(T) To InStr(T, ".") Step -1
  If Mid(T, N, 1) = "0" Then
    T = Left(T, N - 1)
  Else
    Exit For
  End If
Next N
If Right(T, 1) = "." Then T = Left(T, Len(T) - 1)
Valtxt = T
End Function

この内容からですと、[金額]フィールドを「レコードの内容により、書式を変えたい」と
いうことですので、テキストで処理する方法よりないかと思います。(Access2000)

VBAによる「ユーザー定義関数」を使う方法ですが、それで良かったら手順を
詳しく書きますので、テストしてみてください。

・テーブルのデザインで[金額]フィールドを「数値型」の「単精度浮動小数点型」か
 「倍精度浮動小数点型」にします。

・「モジュール」の新規作成で開いたコードウィンドウに下記コードをコピーして
 ...続きを読む

QACCESS 住所の分割について

ACCESS初心者です。

ACCESS2003を使用しています。

スペースで区切られた住所を分割し、表示しようとしているのですが行き詰まっています。
皆さんのお力をお借りしたく質問させていただきます。

現状は次の通りです。

テーブルのフィールドに2通りの住所が混在しています。

【パターン1】 ○○○○○ △△△△ とマンション名などがスペースで区切られたもの。
【パターン2】 ○○○○○ とマンション名などがないもの

クエリを使って「住所1」と「住所2」に分割しようと思い、演算フィールドにそれぞれ下記のように記入をしました。

住所1: Left([住所],InStr(1,[住所]," ")-1)
住所2: Mid([住所],InStr(1,[住所]," ")+1)

上記のように設定をしましたが、「住所1」と「住所2」にはそれぞれ下記の通り表示をされます。

【パターン1】 「住所1」に○○○○、「住所2」に△△△△ と正常に表示
【パターン2】 「住所1」には#エラー、「住所2」に○○○○ と表示

いろいろと試行錯誤しましたが、どうしてもうまくいきません。
VBAを使ったことがないので、出来れば使わずに設定できる方法をご教示いただければと思います。

よろしくお願い致します。

ACCESS初心者です。

ACCESS2003を使用しています。

スペースで区切られた住所を分割し、表示しようとしているのですが行き詰まっています。
皆さんのお力をお借りしたく質問させていただきます。

現状は次の通りです。

テーブルのフィールドに2通りの住所が混在しています。

【パターン1】 ○○○○○ △△△△ とマンション名などがスペースで区切られたもの。
【パターン2】 ○○○○○ とマンション名などがないもの

クエリを使って「住所1」と「住所2」に分割しようと思い、演算フィールドにそれぞれ下記の...続きを読む

Aベストアンサー

> 住所1: Left([住所],InStr(1,[住所]," ")-1)
> 住所2: Mid([住所],InStr(1,[住所]," ")+1)



住所1: Left([住所],InStr(1,[住所] & " "," ")-1)
住所2: Mid([住所],InStr(1,[住所] & " "," ")+1)


とするとどうなりますか?
つまり、InStr する時には、必ず " " (空白)が存在するようにします。

※ 上記は LEFT のエラーをなくすもので、
Mid の場合は文字数以降のところから全部・・・・しても、エラーにはならないようです。


※ 不都合あれば修正してください。

QACCESS 重複データを1つだけ表示したい(初心者です)

ACCESSで複数のフィールドに全く同じレコードが複数存在します
(例)
フィールド1  フィールド2  フィールド3
愛知      田中      12
愛知      田中      12
愛知      田中      12
三重      山本      23
三重      山本      23
岐阜      鈴木      33
岐阜      鈴木      33

もともと他のデーターベースからCSVで落としたものをインポートしているので、データの存在自体はどうしようもありませんが、これらの重複しているデータを1件だけ表示したいのです。つまり
(例)
フィールド1  フィールド2  フィールド3
愛知      田中      12
三重      山本      23
岐阜      鈴木      33

どのようにすればよいでしょうか。

Aベストアンサー

クエリにて[固有のレコード]プロパティーを[はい]にします


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報