Microsoft Access 掲示板

views
4 フォロー
6,283 件中 4,521 から 4,560 までを表示しています。
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も参考にさせていただきます。ありがとうございました。

3

ひょっとして、Wordの表データは、セル内で改行があるものですか。
だとすると、テキストボックスにコピペしたものでは、ちょっと難しいですね。
セル内改行とレコード区切りの改行の区別がつかないので。

下記にWordの表をエクセルに取りこむVBAコードのサンプルがあります。

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

Tableオブジェクトを使って、Wordの表をExcelに貼り付ける:VBA/マクロ便利Tips - @IT

上記をAccess用改造すれば、ワードファイルのパスと何番目のテーブルかを指定すれば取り込むことは可能だと思います。

2
セロハン 2020/10/23 (金) 19:57:48 1d451@2b9f5 >> 1

↑タグ部分がすっかり消えていたので書き直します

xmlに変換して確認したのですが、

<td>

で区切られている部分をフィールドに分けて

<tr>

で区切られている部分をテーブルに分けたいです。

今回の件がwordの中の、表の中身を抜き取ってアクセスにインポートしたいという作業になるので
一旦xmlに変換してそこから表の部分だけコピペというのも手間がかかるように思い、
やはりwordから表の部分を目視でコピペで完結したいのですが…VBAでの処理は難しいでしょうか…?

1
セロハン 2020/10/23 (金) 19:55:56 1d451@2b9f5

xmlに変換して確認したのですが、

で区切られている部分をフィールドに分けて

今回の件がwordの中の、表の中身を抜き取ってアクセスにインポートしたいという作業になるので
一旦xmlに変換してそこから表の部分だけコピペというのも手間がかかるように思い、
やはりwordから表の部分を目視でコピペで完結したいのですが…VBAでの処理は難しいでしょうか…?

6
セロハン 2020/10/23 (金) 17:20:29 1d451@2b9f5 >> 4

思ったより問題が単純ではなかったので新しくスレッドを立てます。

5
セロハン 2020/10/23 (金) 15:30:25 1d451@2b9f5 >> 4

上記コードで、別データを扱うことになり、10列ごとに改行してレコードを新しくしたいです。
現在は全てタブ区切りになっています。
spritstrという関数を見つけましたが、accessでは使えなそうです?
どのようにコード指定すればよいでしょうか。

9
どんぐり 2020/10/23 (金) 11:36:35 1d451@2b9f5 >> 8

ごめんなさい。そもそもクエリで設定すれば良かったですね…クエリで設定し、解決しました。

しかし、プロパティで指定する条件とマクロで指定する条件が異なることは勉強になりました…
お騒がせしました。

8
どんぐり 2020/10/23 (金) 11:20:33 1d451@2b9f5

以前教えていただいた、並べ替え条件のプロパティ設定について
更新ボタンにも設置したく、マクロに組み込もうとしたのですが
エラーが出てしまいます。

マクロ>並べ替えの設定>「並べ替え」に下記条件をセット>「式を解析できません」とエラーが出る。

[契約状況]<>"契約中", 最新契約満期日

1つずつつまずいて、申し訳ありません。
VBAでもよいので、教えていただけると助かります…

4
hatena 2020/10/22 (木) 17:15:26 修正

ファイルの内容を見ました。
間違いは下記の部分です。

Const conSelect = "SELECT テーブル1.社員番号, テーブル1.氏名 FROM テーブル12"
Const conOrderBy = "台帳クエリ2.フリガナ"

テーブル名が間違ってます。下記に修正してください。

Const conSelect = "SELECT テーブル1.社員番号, テーブル1.氏名 FROM テーブル1"
Const conOrderBy = "テーブル1.フリガナ"

これで正常動作するのを確認しました。

3

ファイルの方送信致しましたので宜しくお願い致します。

2
まだまだ勉強中。 2020/10/22 (木) 15:57:01 dfb63@96e2f >> 1

早急にご回答頂きありがとうございます。
Formatで書式をし、動作確認を行いました。

 エラーの出る一台を調べたところ、そのPCだけ日付書式設定が 和暦となっており、
こんなところに原因が!と考えてしまいました。
思うように動くようになり、本当に助かりました。
ありがとうございました。😊

1

OSの日付書式設定が他のPCと異なっているのが原因だと思われます。

OSの日付書式設定の影響を受けないようにFormatで書式を設定するといいでしょう。

    If Me.期間至 > Format(Date, "yy/mm") Then
        strFilter = strFilter & " AND 処理日 < #" & DateAdd("m", 1, "19" & Me.期間至) & "#"
    Else
        strFilter = strFilter & " AND 処理日 < #" & DateAdd("m", 1, "20" & Me.期間至) & "#"
    End If

この部分を下記に修正

    If Me.期間至 > Format(Date, "yy/mm") Then
        strFilter = strFilter & " AND 処理日 < #" & Format(DateAdd("m", 1, "19" & Me.期間至), "yyyy/mm/dd") & "#"
    Else
        strFilter = strFilter & " AND 処理日 < #" & Format(DateAdd("m", 1, "20" & Me.期間至), "yyyy/mm/dd") & "#"
    End If
3

TMGさんの回答で解決済みですが、下記のような方法もあります。

UPDATE T部署 SET T部署.チェック = False
WHERE 管理番号 Like "*3??";
2

オプショングループで50音選択 高速版 - hatena chips

上記のサンプル通りに設定すれば動くはずです。
動かないならどこか間違っていると思います。

どうしてもわからなければ、このページの右カラムの下の方に「ファイル送信フォーム」がありますので、該当ファイルを送付してもらえればそれをみて原因を探れます。
ファイルには関係するテーブル、クエリ、フォームのみにしたものを送付してください。

1

追記です。
もう一度確認したところOp段選択の更新後処理が間違っていました。
訂正すると、レコードに検索キーがないと出たり、式に未定義関数・・・というのは出なくなりましたが、今だにクリックしてもなんの反応もありません・・・

2
nankyoku 2020/10/22 (木) 12:35:01 0029a@1c915

なるほど…1文字だけ抽出しないといけなかったですね。ウッカリしていました。
また、選択クエリで確認すべきというアドバイス、ありがとうございました。

1

選択クエリでRight([管理番号],3)がどんな値を取得しているのか確認すると状況がつかめるかと思います。
おそらくやりたいことは下記の式になるのではないでしょうか?

Left(Right([管理番号],3),1)="3"
2

ありがとうございます。参考にさせて頂きます。

8
hiroton 2020/10/21 (水) 10:30:50 989d9@f966d >> 3

その「ID」は本当に必要ですか?
例えば「タイトル」は主キーになりませんか?

任意の並び順が欲しいのであればそのまま「並び順」フィールドを作って数値で管理し並び替えればいいと思います

これ以上は「ID」をどう使いたいのかも分かりませんし、当初の質問の内容ともずれているので運用の想定も含めて新しく質問を作ってもらえればと思います

7
hiroton 2020/10/21 (水) 10:17:34 989d9@f966d

次月にTODOを持ち越した際、別のTODOが追い越す可能性はないため、年月を変更する際はリセット(リセットボタンを押す)してから変更する予定です。

「年月を変更する際は~変更する」だと、それ以外の場合は変更したくないということですよね?データはどこかに記録しておかないと消えてしまいます。データの記録が必要ならやはりテーブルを持つべきでしょう

システム上で1つだけあればいいデータを保持したいのならたとえば「TsystemProperty」というテーブルを作って
name(テキスト型・主キー)
num(数値型)

namenum
月TODO開始年2020
月TODO開始月10

とすれば、フォーム上からなら

=DLookup("num","TsystemProperty","name='月TODO開始年'")
=DLookup("num","TsystemProperty","name='月TODO開始月'")

の形で参照することができます。

非連結のコントロールで読み込み、変更もしたいならVBAでフォームの読み込み時にデータの読み込み、各コントロールの更新後処理でテーブルのデータ更新を行えば実現できます

Private Sub Form_Load()
    Me!年 = DLookup("num", "TsystemProperty", "name='月TODO開始年'")
    Me!月 = DLookup("num", "TsystemProperty", "name='月TODO開始月'")
End Sub

Private Sub 年_AfterUpdate()
    CurrentDb.Execute "UPDATE TsystemProperty SET num = " & Nz(Me!年,"NULL") & " WHERE name = '月TODO開始年'"
End Sub

Private Sub 月_AfterUpdate()
    CurrentDb.Execute "UPDATE TsystemProperty SET num = " & Nz(Me!月,"NULL") & " WHERE name = '月TODO開始月'"
End Sub