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と関連する良く見られている質問

QACCESS2003のデータアクセスページの使い方について

イントラ内でACCESS2003のデータアクセスページを使いたい。

1.ACCESS2003のデータアクセスページを作成しました。
2.そのMDBファイルと、データアクセスページ(htmファイル)を、WINDOWS2000ServerのInetpub内のwwwrootフォルダの中へ入れました。
3.ここにはイントラ内のHPなどを置いています。(普通に見れています。)
4.クライアントから、データアクセスページのhtmファイルを見に行くと「データソースログオン」が立ち上がります。(パスワードを設定しています。)
5.パスワードを入れるとデータアクセスページ(htm)から、通常のアクセスのフォームのごとくデータ入力が出来る予定なのですが(泣)できません。(泣)

で、悩んでおります。

ACCESS2003のMDBファイルとデータアクセスページ(HTMファイル)をサーバーのwwwrootへ置いただけでは、データアクセスページを通してmdbファイルへの入出力は不可能なのでしょうか?

Aベストアンサー

MDBに接続されたAccessプロジェクトを開いている場合データアクセスページは自動的にそのデータベースに接続されてそのパスがデータアクセスページのConnectionString プロパティに設定されます。
ページを作成した後でデータベースを移動またはコピーした場合はConnectionString プロパティに設定されているパスを更新して新しい保管場所を設定する必要がありますがどうなっていますか?
そこを確認してみてください。

QAccessクエリ特定文字列のカウントについて

初歩的な質問で申し訳ございません。

Accessクエリで1レコード内における特定の文字列(アルファベット(半角/全角)とギリシャ文字(半角/全角))の個数を抽出するための抽出条件は、どうしたらよろしいのでしょうか?

(例1)
<抽出結果>
|  F1   |  F2  |  F1の個数  |  F2の個数  |
  あ12あ    い999       2           3
   う8αう    7Ωえ       2           2

また、この時「F1の個数」と「F2の個数」が一致しない場合の条件付けを行う場合の
抽出条件も教えていただきたく。

(例2)
<抽出結果※(例1)の抽出結果の場合>
|  F1   |  F2  |  F1の個数  |  F2の個数  |  個数判定  |  
  あ12あ    い999       2           3       個数不一致


お手数おかけいたしますが、どうかよろしくお願いいたします。

Aベストアンサー

すみません、不都合が二つほど
標準モジュールは

Function countStr(s As Variant) As Long
  Dim i As Long
  For i = 1 To Nz(Len(s),0)
    If Mid(s, i, 1) Like "[A-z,A-zΑ-ω]" Then
      countStr = countStr + 1
    End If
  Next
End Function

に変更してください。
F1 と F2 のどちらかが Null だった場合のことを考慮。
また、クエリは
判定:iif(countStr([F1]) = countStr([F2]) ,"一致","不一致")
にしてください(前回F1どうしを比較してましたorz)
これで抽出条件に、"不一致"で出来るハズです。

以下は独り言です。
ギリシャ語のホームページからAccessのフィールドにコピペすると
ほとんどの文字が全角文字に変換されてしまいます。
しかし、中には半角文字のままのが少々。
なあぜぇ??
少々の半角文字になってしまう文字については nora1962 さんの回答で
SELECT regexp_count( 項目, "[a-zA-Za-zA-Zα-ωΑ-Ω△□]") FROM テーブル
△□は、その文字を順次一文字づつ追加したイメージです。
にすれば出来ました。
F1の個数:regexp_count([F1],"[a-zA-Za-zA-Zα-ωΑ-Ω△□]")
F2も同様に
判定:iif(regexp_count([F1],"[a-zA-Za-zA-Zα-ωΑ-Ω△□]") = regexp_count([F2],"[a-zA-Za-zA-Zα-ωΑ-Ω△□])","一致","不一致")

私は文字について根本的な事がわかっていないので危ない雰囲気 (^^ゞ
私の回答ではpattern をコード中に埋め込んでしまっているので出来ません。
(VBEではShift-JIS?ですのでコピペした時点で半角ギリシャ文字が『?』になります)
また前回回答でキャラクタコード云々の事をエラソーに言ってますが、これも忘れてください。
さっぱり判らなくなりました。

すみません、不都合が二つほど
標準モジュールは

Function countStr(s As Variant) As Long
  Dim i As Long
  For i = 1 To Nz(Len(s),0)
    If Mid(s, i, 1) Like "[A-z,A-zΑ-ω]" Then
      countStr = countStr + 1
    End If
  Next
End Function

に変更してください。
F1 と F2 のどちらかが Null だった場合のことを考慮。
また、クエリは
判定:iif(countStr([F1]) = countStr([F2]) ,"一致","不一致")
にしてください(前回F1どうしを比較してましたorz)
これで抽出条件に、"...続きを読む

Qホームページ移転に伴う.htaccessの使い方ですがアップロードして

ホームページ移転に伴う.htaccessの使い方ですがアップロードして削除できなくなる事ないですか??また、さくらサーバーは.htaccess使えますか??

Aベストアンサー

.htaccessだけではなく、
ファイルはパーミッションによっては一旦削除できなくなると思いますよ・・・
使えないのにアップすると削除出来ないとか。

>さくらサーバーは.htaccess使えますか??
使えます。
.htaccessを使えない有料サーバってあるのでしょうか?・・・

QACCESS フォームに入力した文字列と同じコントロール名の値を得たい

いつもお世話になっております。
どなたか、教えてください。

Aフォーム(単票)の当年月フィールド(非連結)に「200709」と入力
その後、Bフォームを開くと、
当年月数値フィールド(非連結)に”200709”と名前が付いているコントロール名の値をセットしたいと思っています。

Bフォームを開きながらAフォームの値を変えることはありません。

Bフォームを開く際の処理でも、当年月数値フィールドのコントロールソースの指定でも構いません。

よろしくお願いいたします。
(わかりづらい文章で申し訳ありません。)

Aベストアンサー

200709というコントロールがどちらのフォームにあるのかがわかりませんが、
Forms!Bフォーム.Controls("200709")

Bフォーム.200709
と同じ意味です。

よって、
me.当年月数値フィールド=forms!Bフォーム名.Controls(me.当年月フィールド)
とすることで目的は達せられると思います。 (エラー処理等一切していません。)

しかしフォームからデータを拾うというのはシステムの構造上あまり良くないような気がします。 
まあmdbとはいえ、せっかくデータベースを使っているので、テーブルから探してきましょう。 
また、入力を行ったものから選択肢を選ぶというのも運用上良くないことが起こる可能性があります。(検索はかまいませんが)
これもテーブルのデータをリストボックスなどに格納しその中から選ぶことによって間違いが少なくなります。

QAccessで作成したテーブルのOLEオブジェクトの使い方

Accessで作成したテーブルにデータ型(OLEオブジェクト型)で画像を取り込みできるようにしました。
取り込みした画像を開くためのフォームを作成して画像を開けるようにしました。
下記の内容です。

Private Sub Form_Open(Cancel As Integer)
Form.Caption = ProgName
End Sub

しかし「ビットマップ形式」ですと問題なく開くのですが、「JPG形式」ですと開けないのです。取り込みしたAccessテーブルのフィールドから直接だとひらけます。
Accessで作成したフォームから、「JPG形式」の画像を開くにはどうすればよろしいですか?
また、画像を1000件ほど取り込みすると大きいデータベースになってしまいます。Accessのデータベースのサイズは制限があるのかしら?
アドバイスいただけれは幸いです。

Aベストアンサー

Access のバージョンは?
んで Web で検索する努力はしましょうよ。
丸 1日ぐらい検索しっぱなしで悩まないと。

Google「access ole jpeg」で検索
http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=access+ole+jpeg&num=50

Access 2003 では以下のような制限があるようです。
■ Access 2003 で OLE オブジェクトとして JPEG および GIF 画像を取り扱う場合の注意事項
http://support.microsoft.com/kb/884484/ja

■ OLE オブジェクト型のフィールドに格納されているイメージが正しく表示されません
http://support.microsoft.com/kb/832508/ja

解決策としては JPEG を開ける OLE コンテナになるアプリケーションをインストールしておく。

Google「Access データベース サイズ 制限」で検索
http://www.google.com/search?hl=ja&num=50&q=Access+%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9+%E3%82%B5%E3%82%A4%E3%82%BA+%E5%88%B6%E9%99%90&lr=lang_ja

Access のバージョンは?
んで Web で検索する努力はしましょうよ。
丸 1日ぐらい検索しっぱなしで悩まないと。

Google「access ole jpeg」で検索
http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=access+ole+jpeg&num=50

Access 2003 では以下のような制限があるようです。
■ Access 2003 で OLE オブジェクトとして JPEG および GIF 画像を取り扱う場合の注意事項
http://support.microsoft.com/kb/884484/ja

■ OLE オブジェクト型のフィールドに格納されているイメージが正...続きを読む

QAccessでフィールド文字列内の特定のキーワードから分類・編集する方法

言葉で説明すると、長くて分かりにくいと
思いますので、図を作成してみました。

以下のテーブルがあったとした場合、

名前| 備考
--------------------
MMM |PC所有
WWW |携帯所有
XXX |パソコン所有
NNN |PHS所有


この様な形で編集・出力するクエリを
作成するには、どのようにすればよいでしょうか?

名前| 備考    | 分類コード
------------------------
MMM |PC所有 | 1
WWW |携帯所有 | 2
XXX |パソコン所有 | 1
NNN |PHS所有 | 3

ご存知の方がいらしたら、お教え願います。

Aベストアンサー

> フィールドの文字列に含まれるキーワードを参照し、
> 指定したキーワードが含まれていたら
> それぞれにあった変数を返す、という事は
> 可能でしょうか?

この「指定したキーワード」というのはいくつぐらいあるのでしょうか?
数個ならば、IIF 関数と InStr 関数を使ってやれば大丈夫だと思います。

数が多いのなら、式がかなり長くなってしまいますので、ユーザー定義関数を
作成してやった方がいいと思います。

QAccess2000でFTPの使い方について。

Access2000のフォームから、実行のボタンをクリックするとFTPサーバに接続→ファイル取得→Accessテーブルに取込→FTPサーバのファイル削除→FTPサーバの接続切断という処理をしたいのですがどのようにしたらよいかわかりません。説明不足だとは思いますが、アドバイスを宜しくお願い致します。

Aベストアンサー

ちなみに先ほどのFTPサンプルは、BASP21をインストール後、サンプルのコードを新規モジュールに貼り付けて(たとえば以下をまるごと)実行すればAccessでもそのまま動きます。

sub file_download()

Dim ftp As Object, rc As Long, v As Variant, v2 As Variant
Dim ctr As Long

Set ftp = CreateObject("basp21.FTP")
ftp.OpenLog "c:\temp\log.txt"
rc = ftp.Connect("ftp.microsoft.com", "anonymous", "")
If rc = 0 Then
v = ftp.GetDir("bussys/winnt/winnt-public", 2) ' ディレクトリ一覧(詳細)
If IsArray(v) Then
For Each v2 In v
Debug.Print v2
Next
End If
v = ftp.GetDir("bussys/winnt/winnt-public") ' ディレクトリ一覧(ファイル名のみ)
If IsArray(v) Then
For Each v2 In v
Debug.Print v2
Next
End If
rc = ftp.GetFile("bussys/winnt/winnt-public/*", "c:\temp") 'ファイル受信

end sub

実行には20秒ほどかかります。
実行前にはCドライブにtempというフォルダを作っておいてください。

ちなみに先ほどのFTPサンプルは、BASP21をインストール後、サンプルのコードを新規モジュールに貼り付けて(たとえば以下をまるごと)実行すればAccessでもそのまま動きます。

sub file_download()

Dim ftp As Object, rc As Long, v As Variant, v2 As Variant
Dim ctr As Long

Set ftp = CreateObject("basp21.FTP")
ftp.OpenLog "c:\temp\log.txt"
rc = ftp.Connect("ftp.microsoft.com", "anonymous", "")
If rc = 0 Then
v = ftp.GetDir("bussys/winnt/winnt-public", 2) ' ディレクトリ一...続きを読む

QACCESSでテーブルのMAX値(文字列を除く)をやりたい

ACCESS2000で1テーブル内の項目のMAX値を取りたいのですが、数値ではないのは除外したいです。
どのようにSQLを組んだらいいのでしょうか。

ex)
テーブル名:a
フィールド名:ID(string型)
+--+
|01|
+--+
| 2|
+--+
|03|
+--+
|04|
+--+
|05|
+--+
|06|
+--+
|R1|
+--+
上記の項目でMAX値06を取りたいのですが
SQL>select MAX(ID) as MaxID from a
とすると「R1」がMAX値になる。
「06」をMAX値として取りたい。

Aベストアンサー

2行目のレコード(スペース+2?)のようなパターンを除くなら、項目の値が"0"以上":"(コロン 文字コードで9の次になる文字)未満とするwhere条件をつければいいと思います。

スペースで始まるものも必要なら、Val関数などで数値化して最大値を求めるとか。(R1を数値化すると、0になるのでとりあえずは最大値にはならないはず)

QRuby on Rails 「attr_accessor」 の使い方に

Ruby on Rails 「attr_accessor」 の使い方について

こんにちは。

現在、Ruby on Railsで登録画面を作成しているのですが、attr_accessorで定義した項目に対して、validationのチェックを行うと、問題が起きてしまいました。

attr_accessorで定義した項目は、DB登録の対象ではないのですが、lengthのチェック等を行う必要があり、validates_length_of等を使って入力チェックを行っています。

問題になったのは、入力があったときだけチェックをかけたいのに、入力がなくてもチェックがかかってしまうという状態になってしまうことです。
「:if => 項目?」を書いてみると、「undefined method」のエラーがでてしまいます。

どなたか対応策の分かる方がおられましたらご教授いただけないでしょうか?

下記に実際の問題箇所のモデルクラスのソースを書いておきます。

 class User < ActiveRecord::Base

   attr_accessor :NEW_USER_PW ← 追加したアクセサ

   # 追加したアクセサに対するチェック
   validates_length_of :NEW_USER_PW, :minimum=>4, :message=>"は%d桁以上を設定してくださ            
    い。", :on => :update, :if => :NEW_USER_PW?

 end

上記のチェック内の「:if => :NEW_USER_PW?」で落ちてしまいます。
入力がないのにチェックに引っかかるとまずいので、入力がないときだけ上記チェックを行えれば良いのですが・・・。

どうぞ宜しくお願い致します。

Ruby on Rails 「attr_accessor」 の使い方について

こんにちは。

現在、Ruby on Railsで登録画面を作成しているのですが、attr_accessorで定義した項目に対して、validationのチェックを行うと、問題が起きてしまいました。

attr_accessorで定義した項目は、DB登録の対象ではないのですが、lengthのチェック等を行う必要があり、validates_length_of等を使って入力チェックを行っています。

問題になったのは、入力があったときだけチェックをかけたいのに、入力がなくてもチェックがかかってしまうという状...続きを読む

Aベストアンサー

attr_accessor :NEW_USER_PWを定義したからといって、
NEW_USER_PW?メソッドが定義されるわけではりません。
attr_accessorはゲッターとセッターメソッドを作るだけです。
それ以外の論理値を返すようなメソッドは自作しなければなりません。

NEW_USER_PW?メソッドを作成されていないのなら、「undefined method」が
出てしまうのは当然です。

質問にあるように、「入力があった場合のみ」とありますので、
NEW_USER_PW?メソッドを下記のように実装すればチェック可能です。

def NEW_USER_PW?
@NEW_USER_PW.size > 0
end

また、ifにはprocオブジェクトを渡すこともできますので、
:if => Proc.new{|u| u.NEW_USER_PW.size > 0}
と書いてもいいでしょう。


NEW_USER_PWというインスタンス変数はすべて大文字を使用されていますが、
見る人によっては定数と勘違いします。
変数であれば小文字表記を利用するほうが良いかもしれません。

attr_accessor :NEW_USER_PWを定義したからといって、
NEW_USER_PW?メソッドが定義されるわけではりません。
attr_accessorはゲッターとセッターメソッドを作るだけです。
それ以外の論理値を返すようなメソッドは自作しなければなりません。

NEW_USER_PW?メソッドを作成されていないのなら、「undefined method」が
出てしまうのは当然です。

質問にあるように、「入力があった場合のみ」とありますので、
NEW_USER_PW?メソッドを下記のように実装すればチェック可能です。

def NEW_USER_PW?
@NEW_USER_PW.s...続きを読む

QAccess2003]フォーム:オプショングループウィザード:割り当てる値「Yes/No型」

4月15日にオプショングループウィザードの割り当てる値について分からなくて質問しました。アドレスは、http://okwave.jp/qa4881106.htmlです。「Yes/No型」とは、理解できました。
http://okwave.jp/qa4881106.htmlで質問したことなのですが、更に疑問点が出てきました。参考書(下記のオプショングループウィザードは、著作権の関係もあり、ラベル名を変えてあります。また、テーブル名を変えてあります。)を見たら・・・・
オプションラベル名:営業中 営業終息
既存で選択するオプション:営業中
割り当てる値:営業中 0 営業終息 -1
値を保存するフィールド:営業終息
オプショングループのスタイル:標準
オプショングループの標題:営業終息

●「Yes/No型」について理解できた時点で、オプションラベル名:営業中 営業終息を入力した後、オプショングループウィザードの割り当てる値:営業中0  営業終息 -1と」の割り当てる値についてよく分からなくなりました。
☆営業中と営業終息の割り当てる値をそれぞれ入力するのに…..
(1)「営業終息」フィールド=オプションラベル名:「営業終息」なので、割り当てる値は、-1でOKでしょうか?
(2)「営業終息」フィールドは、イコールではないので、オプションラベル名:「営業中」の割り当てる値は、0と考えてOKでしょうか?

●もし…
『オプションラベル名:営業中 営業終息』で「値を保存するフィールド:営業中」だとしたら・・・「割り当てる値は、営業中 -1 営業終息 0」かなと思いました。この割り当てる値についての考え方でOKでしょうか?

*Access初心者なので簡潔に教えてくださったら助かります。

4月15日にオプショングループウィザードの割り当てる値について分からなくて質問しました。アドレスは、http://okwave.jp/qa4881106.htmlです。「Yes/No型」とは、理解できました。
http://okwave.jp/qa4881106.htmlで質問したことなのですが、更に疑問点が出てきました。参考書(下記のオプショングループウィザードは、著作権の関係もあり、ラベル名を変えてあります。また、テーブル名を変えてあります。)を見たら・・・・
オプションラベル名:営業中 営業終息
既存で選択するオプション:営業中
割...続きを読む

Aベストアンサー

きつい言い方になるのかもしれません。

先に結論を。
1度教えてくださる方と対話できる形で、講習なり講座を受けらたらと思います。
このご質問は数日前(22日?)の焼き直しと思います。
なぜ、回答がつかなかったのか、これについて考えて見られたらと思います。
Accessで実現する疑問点/対策/処置方法以前のものと、私は思います。
(今回のご質問からは消えていますが「返す」とはなんなのか・・・とか)


以下にご質問への回答になる(?)ものを記述します。

・フィールド名の命名について
フィールド名は後々処理するうえで、参照する人(VBAやクエリ等を利用して)がイメージしやすい名前を付けます。
今回で言えば「営業終息」という名前を付けたわけですが、値はYes/No。
では、営業終息=Yes と判別した時、どのようなイメージを持たれますか。
営業終息がYesなのだから、一段落した。。。と私はイメージします。
つまり、「営業終息」とフィールド名を決定したので、イメージと同じYes=-1の値を、オプショングループに表示している「営業終息」に割り当てます。
営業終息=No は、イメージからして終息していないのだから、営業中ととらえてた方が素直。

では、もし・・・のご質問に対して、
フィールド名を「営業中」とした場合、営業中=Yes をイメージしてください。

さらに、フィールド名を「営業」とした場合、営業=Yes でどのようなイメージを持たれますか。
(この場合、イメージし難いですよね)

前回の私の回答で、補足して書いておけばよかったのですが、
オプショングループで値をデータとして格納する場合の多くは、そのフィールドにどのような値を入れるか設計されていることの方が多いです。
オプショングループのそれぞれの値を逆にして入れても・・・は、通じません。
(オプショングループは単に分かりやすい入力を行わせるために使われる部品でしかないと思っています)

ただ、オプショングループの部分に限ってみれば、どの値をどの順で設定しなければならない、ということはありません。

きつい言い方になるのかもしれません。

先に結論を。
1度教えてくださる方と対話できる形で、講習なり講座を受けらたらと思います。
このご質問は数日前(22日?)の焼き直しと思います。
なぜ、回答がつかなかったのか、これについて考えて見られたらと思います。
Accessで実現する疑問点/対策/処置方法以前のものと、私は思います。
(今回のご質問からは消えていますが「返す」とはなんなのか・・・とか)


以下にご質問への回答になる(?)ものを記述します。

・フィールド名の命名について
...続きを読む


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

人気Q&Aランキング

おすすめ情報