Microsoft Access 掲示板

6,622 件中 4,841 から 4,880 までを表示しています。
1

グループコードに対しての担当者を登録するテーブルを作成してみました
テーブル2
グループコード、担当者、氏名

紐づけ方がわかりません。
宜しくお願いします。

14
strSQL = "(SQL文)"

(SQL文)はどのように指定していますか?
上で紹介した方法で、実際にクエリを表示してみてください。エラーが表示されると思うので「作品テーブル」に必要なフィールドがないか、SQL文そのものが間違っているか確認してください

やりたいことが理解できていたなら、クエリデザインでクエリを作成し、SQLビューのSQL文をコピーしてVBAコードとして貼り付けという方法で作成するのもありです。
(クエリデザインから自動で作られるSQLは省略可能な部分も表記されるので醜いですが)

13
hiroton 2020/10/27 (火) 18:15:35 7c8fb@f966d

不要列がある場合

1.エラーにして無視する

strSQL = "SELECT タイトル, 感想, 1, 国 FROM 作品テーブル"

実処理部分が

        On Error Resume Next '//エラーを無視する
        For j = 0 To colCount
            rs(j) = Datas(i)
            i = i + 1
        Next
        On Error GoTo 0 '//エラー無視を解除する

となってるのでダミーの列を用意すれば取込はできます(処理的にはエラーが出てるのであんまりよくはない)

2.作品テーブルにダミー列を用意する

フィールド名「ダミー」を作っておきます

strSQL = "SELECT タイトル, 感想, ダミー, 国 FROM 作品テーブル"

余計な列が必要なので残念な感じですが、大きな問題はでないんじゃないかなと

3.取り込まない列制御処理を入れる

上記で問題がある場合ケースバイケースで何かしらの制御を入れることもあるかもしれません(複雑な処理を組むくらいなら次の方法のほうが楽なのであんまりやらない)

4.最初の構想通り一時テーブルを用意する

スタートが違う(個別にデータを解析して取り込む必要がある)ので紹介しなかったですが、個別にテーブルを用意してそれぞれから追加クエリを発行すると、フィールド名の対応を取りつつ不要列は取り込まないようにできます。データ形式が決まりきったファイルでインポート定義を使って取り込めるようなデータならこれをやります

2
ポンタ 2020/10/27 (火) 17:48:35 f1ed8@73413 >> 1

かなりサブフォームが便利そうですね。
グループが必ず発生する訳ではなくグループ数も不定なので、適当な数をタブで作成してみようかと思います。
リンク先を参考にさせていただき、取りかかろうと思います。ありがとうございます!

12
セロハン 2020/10/27 (火) 17:34:16 f1ed8@73413 >> 9

長文ありがとうございます🙇‍♂️
後ほど試させていただきます

11
hiroton 2020/10/27 (火) 16:25:00 7c8fb@f966d >> 9

ちょっと脱線しますがクエリSQLについての知識を身につけましょう
ざっくりですが、SQLはデータベースを扱うための命令書の仕様、クエリはSQLに従って作成された実際の命令書といった感じです

ACCESSはSQLを意識することなくクエリを扱えるアプリケーションですが、クエリの実態はきちんとSQLです。クエリデザインでリボンの「表示」からSQLビューデザインビューを相互に切り替えることができ、ACCESSのGUI(クエリデザイン)で作成するものがSQLであることが確認できます

つまり、SQL構文を記述するというのはクエリを作成すると同じことをしているわけです

それでは、クエリデザインを起動しテーブルの表示では何も選ばずに閉じて、SQLビューを表示してみましょう

SELECT;

と表示された画面が表示されるはずです。選択クエリを作成しようとし、テーブルを一つも選んでいないので選択クエリであることを表すSQLの命令SELECTのみが表示されている状態です。これを

SELECT タイトル, 感想, 製作年, 国 FROM 作品テーブル

に書き換えてデザインビューデータシートビューと切り替えてみましょう。よく使う形のものを見ることができると思います。このデータシートビューをみれば「対応する列を持ったテーブルを作成する」の意味が分かると思います

うまく動いたらSQLビューデザインビューを切り替えて見比べてみてください。何となくSQL構文のどこがどういう意味なのか分かると思います

そうしたら次に

SELECT タイトル, 感想,, 国 FROM 作品テーブル
SELECT タイトル, 感想,取込不要列, 国 FROM 作品テーブル

も同様にSQLビューにコピペして試してみましょう


掲示板ではクエリデザインでのイメージを伝えるのが難しいものです。SQLビューを使ったSQL文のコピペのやり取りができると間違いのないやり取りができるようになるのでうまく活用できるようになりましょう

1

フォームにはグループ化の機能はないので、

フォームでサブタイトルフィールドを作成し、複数行ごと同じものを設定して
レポート表示する際にサブタイトルフィールドをグループ化する設計になるのでしょうか。

フォームのレコードソースのテーブルにサブタイトルフィールドを追加して、複数行に同じものを繰り返し入力することになりますね。
あるいは、サブフォームにして、非連結の親フォームのテキストボックスでサブタイトルを入力して、リンク親フィールド/リンク子フィールドの設定を「サブタイトル」にしておけばサブタイトルは親フォームで一回入力するだけですみます。

また、グループごとに行番号を振りたい場合は手動になりますでしょうか。

サブフォームを使うのではあれば、下記の方法が使えます。

帳票サブフォームで行番号フィールドの連番を維持する
一対多の関係のデータをメイン/サブフォーム形式で入力する場合、サブフォームのデータに連番(行番号)を振りたい。途中のレコードを削除しても欠番がでることなく連番を維持したい。また、任意に並び替えをしたい。 上記のような仕様を実現する方法を紹介します。  連番(行番号)に関しては、テーブルに持たせなくても、計算やVBAで表示させる手段がありますが、連番のフィールドがあるとクロス集計するときとか、固定...
fc2

サブフォームを使わない場合も上記を改良すればできないことはないですが、かなり難易度は高いでしょう。

10
セロハン 2020/10/27 (火) 15:54:33 0029a@1c915

作成してみたのですが、エラーが出ます。

以下のコードが黄色に反転される
Set rs = db.OpenRecordset(tblname)

実行時エラー'3075'
クエリ式 '国 FROM 作品テーブル' の構文エラー :演算子がありません。

9
セロハン 2020/10/27 (火) 15:10:46 0029a@1c915 >> 3

ありがとうございます。
取込不要の列があった場合にはどうなりますか?以下のように空欄にしてよいでしょうか。
※例えばパターン4の3列目に「取込不要列」があったとする。

パターン4
strSQL = "SELECT タイトル, 感想,, 国 FROM 作品テーブル"

もしくは
パターン4?
strSQL = "SELECT タイトル, 感想,取込不要列, 国 FROM 作品テーブル"
2
ニンジャ 2020/10/27 (火) 13:56:32 0029a@1c915 >> 1

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

1
hiroton 2020/10/27 (火) 13:37:47 7c8fb@f966d

たぶん
If Me.状態.OldValue = "承認前" And Me.状態.Value <> "承認前" Then

If Me.cbo状態.OldValue = "承認前" And Me.cbo状態.Value <> "承認前" Then

8
hiroton 2020/10/27 (火) 13:26:58 7c8fb@f966d >> 3

メインのデータ取込処理は

        For j = 0 To UBound(Datas)
            rs(j) = Datas(j)
        Next

ですね。ループ処理になっているのでそれっぽく書き直すと

rs(0) = Datas(0)
rs(1) = Datas(1)
rs(2) = Datas(2)
:
:

な感じになります。これの意味するところはrsの0番目にDatasの0番目を入れる、rsの1番目にDatasの1番目を入れる・・・ということで、元データのフィールド名も作品テーブルのフィールド名も関係ありません。列番号だけ見て同じ列に値を入れているだけです。(列を飛ばしたりもできません)

例えばパターン2ならtblnameの1列目に「題名」を入れる、2列目に「作られた年」を入れるという処理をしていて、対応した列になっていればフィールド名は不問です

というわけで、「作品テーブル」から元データの列に対応する列を持ったテーブルをクエリ(SQL構文)で用意してあげます

パターン1
strSQL = "SELECT タイトル, 感想, 製作年, 国 FROM 作品テーブル"

パターン2
strSQL = "SELECT タイトル, 製作年 FROM 作品テーブル"

パターン3
strSQL = "SELECT タイトル, 感想, 国 FROM 作品テーブル"
7
セロハン 2020/10/27 (火) 12:53:59 0029a@1c915 >> 5

ありがとうございます。
仰る通り合体テーブルは変更して、「作品テーブル」とさせていただきます。
フィールド名は
タイトル、感想、製作年、国、おすすめ度合い、タイプ
でお願いします。
おすすめ度合い、タイプは後から追記するためのフィールドです。

6
hiroton 2020/10/27 (火) 12:45:22 7c8fb@f966d >> 5

「合体テーブル」のフィールド名を挙げてください
(「合体テーブル」も分割したテーブルがなくなると名前が変わりそうですね)

5
セロハン 2020/10/27 (火) 12:07:18 0029a@1c915 >> 3

仰る通り一連の質問の延長でした。
取り込む際に設定して1つのテーブルにすればよかったのですね。
ごめんなさい、例ではフィールド名を同じにしてしまいましたが、
実際は微妙に違う名前ですのでそれで書いてみます。
下記認識で正しいでしょうか…?

パターン1【フィールド名】タイトル、感想、製作年、国
パターン2【フィールド名】題名、作られた年
パターン3【フィールド名】タイトル、思ったこと、国名

パターンごとに3つボタンを作成。それぞれステートメント3行目を下記内容に変える。

パターン1
strSQL = "SELECT タイトル, 感想, 製作年, 国 FROM 合体テーブル"

パターン2
strSQL = "SELECT 題名,, 作られた年 FROM 合体テーブル"

パターン3
strSQL = "SELECT タイトル, 思ったこと,,国名 FROM 合体テーブル"

以上、何卒宜しくお願いいたします。

4
セロハン 2020/10/27 (火) 11:55:22 0029a@1c915 >> 2

ユニオンクエリは重い処理になるとのこと。
作成前に教えていただき、とても助かりました。テーブルを1つにするように考えてみたいと思います。

3
hiroton 2020/10/27 (火) 09:59:32 7c8fb@f966d

一連の質問の延長ですかね?
最終的に合体テーブル(タイトル、感想、製作年、国、おすすめ度合い、タイプ、etc...)を作りたい。とか

    Set rs = db.OpenRecordset(tblname)

Database.OpenRecordset メソッド (DAO)

tblnameにはクエリを指定することもできます

'//テーブル1パターン
Private Sub データ追加_Click()
    Dim strSQL As String
    strSQL = "SELECT タイトル, 感想, 製作年, 国 FROM 合体テーブル"
    Call AddData(strSQL, Me.txtデータ)
End Sub

こんな感じで必要な列と並びを指定してあげればデータごとにインポート用のテーブルを作る必要はないですよ

2
ポンタ 2020/10/27 (火) 09:48:08 0029a@1c915 >> 1

昨日から色々検索しても解決法が見つからず、自分でも完璧なものは作れなそうだったので、助かりました。
作成してみて、またわからなかったら質問させていただきます。ありがとうございます。

2

ユニオンクエリでできると思います。

ただ、ユニオンクエリは重い処理になりますし、更新できないクエリになりますので、テーブル設計の変更が可能なら、最初から一つのテーブルにしておいて、必要に応じてクエリで必要なデータを取り出すようにした方がいいでしょう。

1

レコードソースのテーブルに並び順用のフィールドを追加します。そこにお好みの並び順になるように数値を入力して、そのフィールドで並べ替えればいいでしょう。

下記は上記をVBAで自動化したサンプルになります。

帳票サブフォームで行番号フィールドの連番を維持する - hatena chips

1
セロハン 2020/10/26 (月) 17:43:09 f1ed8@73413

これは、やっぱりユニオンクエリで解決しそうですね…
検索して調べながら作ってみます。失礼しました。

17
セロハン 2020/10/26 (月) 15:42:48 0029a@1c915

ごめんなさい…
VBAに間違いがあります。修正します。

Private Sub btn取込_Click()
    Dim 取り込みデータ As String
    If IsNull(Me.txtデータ) Then
    MsgBox "テキストボックスが空です。"
    Else
    取り込みデータ = Me.txtデータ
    取り込みデータ = Replace(取り込みデータ, vbCrLf, vbTab)
        Call AddData2(Me.txtテーブル名, 取り込みデータ, 列数)
    End If

16
セロハン 2020/10/26 (月) 15:30:41 0029a@1c915 >> 15

スミマセン!同じくワードの表からテキストボックスへのコピペなのですが、セル内に改行がなく、レコード途中で改行があったので、下記加工して、1行のテキストのようにして扱っていました。そのことを書けばよかったです。
新規スレ立てようか悩んだんですが、わかりづらくなってしまい申し訳ありません。

Private Sub btn取込_Click()
    Dim 取り込みデータ As String
    取り込みデータ = Me.txtボックス
    取り込みデータ = Replace(取り込みデータ, vbCrLf, vbTab)
      Call AddData2(Me.txtテーブル名, Me.txtデータ,列数)
End Sub

上記の上、教えていただいたコードを部分的に修正してうまく動きました!
他の方が参考にされるかもしれないので載せておきます。
大変助かりました。ありがとうございました!

Private Sub AddData2(tblname As String, ByRef s As String, colCount As Long)
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim i As Long, j As Long
    Dim Datas

    Set db = CurrentDb
    Set rs = db.OpenRecordset(tblname)
    Datas = Split(s, vbTab)
    i = 0
    Do While i <= UBound(Datas)
        rs.AddNew
        On Error Resume Next
        For j = 0 To colCount
            rs(j) = Datas(i)
            i = i + 1
        Next
        On Error GoTo 0
        rs.upDate
    Loop
End Sub
15

ワードの表データではなく、別のテキストデータということなのかな。
だとしたら、まったく別の質問になるので新規に質問を立ててもらった方がいいですね。
あとから見た人にとっても利用しやしすですので。

14
hiroton 2020/10/26 (月) 14:48:03 8d8c2@f966d

単純に1データ1行のテキストデータですかね?レコード(列数)という情報なしの

Private Sub AddData2(tblname As String, ByRef s As String, colCount As Long)
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    i As Long, j As Long
    Dim Datas

    Set db = CurrentDb
    Set rs = db.OpenRecordset(tblname)
    Datas = Split(s, vbNewLine)
    i = 0
    Do While i <= UBound(Datas)
        rs.AddNew
        On Error Resume Next
        For j = 0 To colCount
            rs(j) = Datas(i)
            i = i + 1
        Next
        On Error GoTo 0
        rs.upDate
    Next
End Sub
13

セル内には改行が存在しないのですが、同じレコード内の列の区切りで途中で改行が入っているので
一括で改行を外して、固定の列数でレコードを区切りたく思っています。

ちょっと、どのようなデータなのかこの説明だけではわかりません。
「レコード内の列の区切りで途中で改行が入っている」というのが「セル内に改行が入っている」とどう違うのか分かりません。

ワードの表ではないのですか。
ワードの表ならば、前の回答で紹介した下記のリンク先の方法で
エクセルのセルに代入する部分を、テーブルに代入するように書き換えるだけです。

【VBA】Word文書内の表をエクセルに取り込む | あじゅWeb

これが比較的シンプルで確実な方法だと思います。

12
セロハン 2020/10/26 (月) 14:34:33 0029a@1c915 >> 11

>列数に対応しているのはUBound(Datas)のほうです

本当ですね…すみません。

>aはAddData()内でDim aした変数なのでデータ追加_Click()では使えないです。

なるほど…
取り込みデータにいくつか種類があり、ボタンを分けているのですが、
全部同じ汎用関数で行けるかなとかんがえていました
分けた方が良さそうですね、勉強になりました。ありがとうございます。

11
hiroton 2020/10/26 (月) 14:20:58 8d8c2@f966d >> 8

VBA記述的な話

a = Split(s, vbNewLine)は改行で区切りにした配列なのでUBound(a)は行数=レコード数ですね。列数に対応しているのはUBound(Datas)のほうです

aAddData()内でDim aした変数なのでデータ追加_Click()では使えないです。やるとすれば

Private Sub データ追加_Click()
    Const 列数 = 10 '//列数固定データの列数
    Call AddData(Me.txtテーブル名, Me.txtデータ, 列数)
End Sub

のように定数を宣言してあげる形でしょうか。このくらいならわざわざ宣言しなくてもいいですが


個人的な感想だとUBound(Datas)iUpに置き換えるメリットは感じないですね。汎用性が落ちる分やらなくていいんじゃないかなと

9

すごい!完璧です!
本当にありがとうございました。

またお力を貸して頂けると嬉しいです。

10
セロハン 2020/10/26 (月) 14:15:55 0029a@1c915 >> 9

紛らわしくてすみません。
これは前回質問したものとは別データになり、
セル内に改行が存在しないデータになります。

セル内には改行が存在しないのですが、同じレコード内の列の区切りで途中で改行が入っているので
一括で改行を外して、固定の列数でレコードを区切りたく思っています。

いろんな種類のデータがあり、明確に分別できるのでそのように取り扱いたく…紛らわしくてすみません。

9

列数が固定でも、例えば最後の列のセルや1列目のセルに改行がある場合、どの改行がレコード区切りなのか判断つかないので、無理ですね。例えば1列目がIDとかで改行がないということが保障されているなら方法はありそうです。

8

開いたときだけでいいのなら、値集合ソースを下記に変更すればいいでしょう。

SELECT 社員マスタ.社員番号, 社員マスタ.氏名 FROM 社員マスタ ORDER BY 社員マスタ.社員番号; 

50音選択で抽出したあとも、社員番号順にしたいなら、さらに、コードの下記の部分を

Const conOrderBy = "社員マスタ.[氏名(フリガナ)]"

下記に修正すればいいでしょう。

Const conOrderBy = "社員マスタ.社員番号"
8
セロハン 2020/10/26 (月) 13:36:46 0029a@1c915

あ、ちなみにiUpをvariantにしたら、引数で「UBound(a)」としても対応できますでしょうか。
VBAの初歩的な質問で恐れ入ります…

7
セロハン 2020/10/26 (月) 13:26:33 0029a@1c915

この件と絡み、別データになるのですが、改行を外して対応したいデータについて
列数が定数のデータがあり、以前教えていただいたVBAを修正して対応できないかと考えたのですが
うまくいきません。

Private Sub AddData(tblname As String, ByRef s As String)
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim a, i As Long, j As Long
    Dim Datas

    Set db = CurrentDb
    Set rs = db.OpenRecordset(tblname)
    a = Split(s, vbNewLine)
    For i = 0 To UBound(a)
        Datas = Split(a(i), vbTab)
        rs.AddNew
        On Error Resume Next
        For j = 0 To UBound(Datas)
            rs(j) = Datas(j)
        Next
        On Error goto 0
        rs.update
    Next
End Sub

Private Sub データ追加_Click()
    Call AddData(Me.txtテーブル名, Me.txtデータ)
End Sub

以前hatena様に教えていただいたVBAです。
こちらの「UBound(a)」の部分を変数にして
下記修正してみたのですが、うまく動きません。
「インデックスが有効範囲にありません」とエラー。

Private Sub AddData(tblname As String, ByRef s As String, iUp As Long)
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim a, i As Long, j As Long
    Dim Datas

    Set db = CurrentDb
    Set rs = db.OpenRecordset(tblname)
    a = Split(s, vbNewLine)
    For i = 0 To iUp
        Datas = Split(a(i), vbTab)
        rs.AddNew
        On Error Resume Next
        For j = 0 To UBound(Datas)
            rs(j) = Datas(j)
        Next
        On Error GoTo 0
        rs.upDate
    Next
End Sub

Private Sub データ追加_Click()
    Call AddData(Me.txtテーブル名, Me.txtデータ,列数)
End Sub

スミマセン。教えていただけると助かります。

6
セロハン 2020/10/26 (月) 13:18:22 0029a@1c915 >> 5

ありがとうございます!!めんどくさそうということなので、時間を取って確認させていただきます。
ありがとうございました。

7

とても勉強になりました!!
[氏名(フリガナ)]に直すときちんと動くようになりました。

これからフィールド名に()を使うのは控えたいと思います。
本当にありがとうございました。

1つ直したいところがあるのですが、今のフォームでは開いたときから名前の順で表示されるのですが、開いた時点では社員番号順に並べ替えたいのですがこちらは可能でしょうか?
すみませんが教えて頂きたいです。

6
hatena 2020/10/26 (月) 11:55:33 修正

ファイル見ました。原因はフィールド名に( )を使っているのが原因ですね。
このような記号や半角空白が含まれるフィールド名はSQLで使うときは[ ]で囲む必要があります。

下記のように、氏名(フリガナ)の部分を[氏名(フリガナ)]と修正してください。

Option Compare Database
Option Explicit
Const conSelect = "SELECT 社員マスタ.社員番号, 社員マスタ.氏名 FROM 社員マスタ"
Const conOrderBy = "社員マスタ.[氏名(フリガナ)]"

Private Sub Form_Error(DataErr As Integer, Response As Integer)
'フォームのエラー時

  If DataErr = 3021 Then
    'カレントレコードなしエラー(エラー番号:3021)は無視する
    Response = acDataErrContinue
  End If
End Sub

Private Sub Op50音選択_AfterUpdate()
    fnc50音選択_lst "[氏名(フリガナ)]", Me.lst得意先, conSelect, conOrderBy
End Sub
 
Private Sub op段選択_AfterUpdate()
    fnc段選択_lst "[氏名(フリガナ)]", Me.lst得意先, conSelect, conOrderBy
End Sub

Private Sub Form_Open(Cancel As Integer)
    Me.lbl件数.Caption = "件数: " & Me.lst得意先.ListCount
End Sub

このような記号や半角空白はトラブルの元になりますので、最初からフィールド名やオブジェクト名には使わないようにするのが吉ですね。

例えば、氏名(フリガナ) ではなくて 氏名_フリガナ とするとか。_(アンダースコア)は使用しても問題ない数少ない記号の一つです。

5

回答ありがとうございます。
あれからこちらで修正しましたが、サンプルファイルは正常に作動するのですが、実際使っているファイルは作動せずです・・・
新たにファイルを送信しましたのでご確認お願い致します。

5
hiroton 2020/10/26 (月) 10:08:53 8d8c2@f966d

めちゃくちゃめんどくさそうですがクリップボードのデータを直接取得してあれこれやればできないこともなさそうな感じはありました

クリップボードを操作する方法 (YU-TANG's MS-Access Discoveryさん)
※すでにページはないのでInternet Archive(web.archive.org)です

Wordでコピーした状態からだとHTMLDocumentとしてアクセスすることができ、テーブル構造を取得できるようです
ただし、TABとか改行とかはHTML用に変換されてしまうようなので内容を解析して再変換みたいなことをする必要がありそうです

4
セロハン 2020/10/24 (土) 01:48:13 f1ed8@2b9f5

おっしゃるとおり、セル内にも改行があります…
やはりレコード区切りの改行とは区別がつかないのですね。ワードからエクセルにはうまく貼り付けられるから、何かしら区別の方法があるのかもと思っていました…
accessにはxmlからなんとか抜き出す方法を考えてみたいと思います。
wordからexcelのvbaも参考にさせていただきます。ありがとうございました。