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
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
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
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
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
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
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
レコードソースのテーブルに並び順用のフィールドを追加します。そこにお好みの並び順になるように数値を入力して、そのフィールドで並べ替えればいいでしょう。
下記は上記をVBAで自動化したサンプルになります。
帳票サブフォームで行番号フィールドの連番を維持する - hatena chips
これは、やっぱりユニオンクエリで解決しそうですね…
検索して調べながら作ってみます。失礼しました。
ごめんなさい…
VBAに間違いがあります。修正します。
スミマセン!同じくワードの表からテキストボックスへのコピペなのですが、セル内に改行がなく、レコード途中で改行があったので、下記加工して、1行のテキストのようにして扱っていました。そのことを書けばよかったです。
新規スレ立てようか悩んだんですが、わかりづらくなってしまい申し訳ありません。
上記の上、教えていただいたコードを部分的に修正してうまく動きました!
他の方が参考にされるかもしれないので載せておきます。
大変助かりました。ありがとうございました!
ワードの表データではなく、別のテキストデータということなのかな。
だとしたら、まったく別の質問になるので新規に質問を立ててもらった方がいいですね。
あとから見た人にとっても利用しやしすですので。
単純に1データ1行のテキストデータですかね?レコード(列数)という情報なしの
ちょっと、どのようなデータなのかこの説明だけではわかりません。
「レコード内の列の区切りで途中で改行が入っている」というのが「セル内に改行が入っている」とどう違うのか分かりません。
ワードの表ではないのですか。
ワードの表ならば、前の回答で紹介した下記のリンク先の方法で
エクセルのセルに代入する部分を、テーブルに代入するように書き換えるだけです。
【VBA】Word文書内の表をエクセルに取り込む | あじゅWeb
これが比較的シンプルで確実な方法だと思います。
>列数に対応しているのはUBound(Datas)のほうです
本当ですね…すみません。
>aはAddData()内でDim aした変数なのでデータ追加_Click()では使えないです。
なるほど…
取り込みデータにいくつか種類があり、ボタンを分けているのですが、
全部同じ汎用関数で行けるかなとかんがえていました
分けた方が良さそうですね、勉強になりました。ありがとうございます。
VBA記述的な話
a = Split(s, vbNewLine)
は改行で区切りにした配列なのでUBound(a)
は行数=レコード数ですね。列数に対応しているのはUBound(Datas)
のほうですa
はAddData()
内でDim a
した変数なのでデータ追加_Click()
では使えないです。やるとすればのように定数を宣言してあげる形でしょうか。このくらいならわざわざ宣言しなくてもいいですが
個人的な感想だと
UBound(Datas)
をiUp
に置き換えるメリットは感じないですね。汎用性が落ちる分やらなくていいんじゃないかなとすごい!完璧です!
本当にありがとうございました。
またお力を貸して頂けると嬉しいです。
紛らわしくてすみません。
これは前回質問したものとは別データになり、
セル内に改行が存在しないデータになります。
セル内には改行が存在しないのですが、同じレコード内の列の区切りで途中で改行が入っているので
一括で改行を外して、固定の列数でレコードを区切りたく思っています。
いろんな種類のデータがあり、明確に分別できるのでそのように取り扱いたく…紛らわしくてすみません。
列数が固定でも、例えば最後の列のセルや1列目のセルに改行がある場合、どの改行がレコード区切りなのか判断つかないので、無理ですね。例えば1列目がIDとかで改行がないということが保障されているなら方法はありそうです。
開いたときだけでいいのなら、値集合ソースを下記に変更すればいいでしょう。
50音選択で抽出したあとも、社員番号順にしたいなら、さらに、コードの下記の部分を
下記に修正すればいいでしょう。
あ、ちなみにiUpをvariantにしたら、引数で「UBound(a)」としても対応できますでしょうか。
VBAの初歩的な質問で恐れ入ります…
この件と絡み、別データになるのですが、改行を外して対応したいデータについて
列数が定数のデータがあり、以前教えていただいたVBAを修正して対応できないかと考えたのですが
うまくいきません。
以前hatena様に教えていただいたVBAです。
こちらの「UBound(a)」の部分を変数にして
下記修正してみたのですが、うまく動きません。
「インデックスが有効範囲にありません」とエラー。
スミマセン。教えていただけると助かります。
ありがとうございます!!めんどくさそうということなので、時間を取って確認させていただきます。
ありがとうございました。
とても勉強になりました!!
[氏名(フリガナ)]に直すときちんと動くようになりました。
これからフィールド名に()を使うのは控えたいと思います。
本当にありがとうございました。
1つ直したいところがあるのですが、今のフォームでは開いたときから名前の順で表示されるのですが、開いた時点では社員番号順に並べ替えたいのですがこちらは可能でしょうか?
すみませんが教えて頂きたいです。
ファイル見ました。原因はフィールド名に
(
)
を使っているのが原因ですね。このような記号や半角空白が含まれるフィールド名はSQLで使うときは
[
]
で囲む必要があります。下記のように、
氏名(フリガナ)
の部分を[氏名(フリガナ)]
と修正してください。このような記号や半角空白はトラブルの元になりますので、最初からフィールド名やオブジェクト名には使わないようにするのが吉ですね。
例えば、
氏名(フリガナ)
ではなくて氏名_フリガナ
とするとか。_
(アンダースコア)は使用しても問題ない数少ない記号の一つです。回答ありがとうございます。
あれからこちらで修正しましたが、サンプルファイルは正常に作動するのですが、実際使っているファイルは作動せずです・・・
新たにファイルを送信しましたのでご確認お願い致します。
めちゃくちゃめんどくさそうですがクリップボードのデータを直接取得してあれこれやればできないこともなさそうな感じはありました
クリップボードを操作する方法 (YU-TANG's MS-Access Discoveryさん)
※すでにページはないのでInternet Archive(web.archive.org)です
Wordでコピーした状態からだとHTMLDocumentとしてアクセスすることができ、テーブル構造を取得できるようです
ただし、TABとか改行とかはHTML用に変換されてしまうようなので内容を解析して再変換みたいなことをする必要がありそうです
おっしゃるとおり、セル内にも改行があります…
やはりレコード区切りの改行とは区別がつかないのですね。ワードからエクセルにはうまく貼り付けられるから、何かしら区別の方法があるのかもと思っていました…
accessにはxmlからなんとか抜き出す方法を考えてみたいと思います。
wordからexcelのvbaも参考にさせていただきます。ありがとうございました。
ひょっとして、Wordの表データは、セル内で改行があるものですか。
だとすると、テキストボックスにコピペしたものでは、ちょっと難しいですね。
セル内改行とレコード区切りの改行の区別がつかないので。
下記にWordの表をエクセルに取りこむVBAコードのサンプルがあります。
【VBA】Word文書内の表をエクセルに取り込む | あじゅWeb
Tableオブジェクトを使って、Wordの表をExcelに貼り付ける:VBA/マクロ便利Tips - @IT
上記をAccess用改造すれば、ワードファイルのパスと何番目のテーブルかを指定すれば取り込むことは可能だと思います。
↑タグ部分がすっかり消えていたので書き直します
xmlに変換して確認したのですが、
で区切られている部分をフィールドに分けて
で区切られている部分をテーブルに分けたいです。
今回の件がwordの中の、表の中身を抜き取ってアクセスにインポートしたいという作業になるので
一旦xmlに変換してそこから表の部分だけコピペというのも手間がかかるように思い、
やはりwordから表の部分を目視でコピペで完結したいのですが…VBAでの処理は難しいでしょうか…?
xmlに変換して確認したのですが、
で区切られている部分をフィールドに分けて今回の件がwordの中の、表の中身を抜き取ってアクセスにインポートしたいという作業になるので
一旦xmlに変換してそこから表の部分だけコピペというのも手間がかかるように思い、
やはりwordから表の部分を目視でコピペで完結したいのですが…VBAでの処理は難しいでしょうか…?
思ったより問題が単純ではなかったので新しくスレッドを立てます。
上記コードで、別データを扱うことになり、10列ごとに改行してレコードを新しくしたいです。
現在は全てタブ区切りになっています。
spritstrという関数を見つけましたが、accessでは使えなそうです?
どのようにコード指定すればよいでしょうか。
ごめんなさい。そもそもクエリで設定すれば良かったですね…クエリで設定し、解決しました。
しかし、プロパティで指定する条件とマクロで指定する条件が異なることは勉強になりました…
お騒がせしました。
以前教えていただいた、並べ替え条件のプロパティ設定について
更新ボタンにも設置したく、マクロに組み込もうとしたのですが
エラーが出てしまいます。
マクロ>並べ替えの設定>「並べ替え」に下記条件をセット>「式を解析できません」とエラーが出る。
1つずつつまずいて、申し訳ありません。
VBAでもよいので、教えていただけると助かります…
ファイルの内容を見ました。
間違いは下記の部分です。
テーブル名が間違ってます。下記に修正してください。
これで正常動作するのを確認しました。
ファイルの方送信致しましたので宜しくお願い致します。
早急にご回答頂きありがとうございます。
Formatで書式をし、動作確認を行いました。
エラーの出る一台を調べたところ、そのPCだけ日付書式設定が 和暦となっており、
こんなところに原因が!と考えてしまいました。
思うように動くようになり、本当に助かりました。
ありがとうございました。😊
OSの日付書式設定が他のPCと異なっているのが原因だと思われます。
OSの日付書式設定の影響を受けないようにFormatで書式を設定するといいでしょう。
この部分を下記に修正
TMGさんの回答で解決済みですが、下記のような方法もあります。
オプショングループで50音選択 高速版 - hatena chips
上記のサンプル通りに設定すれば動くはずです。
動かないならどこか間違っていると思います。
どうしてもわからなければ、このページの右カラムの下の方に「ファイル送信フォーム」がありますので、該当ファイルを送付してもらえればそれをみて原因を探れます。
ファイルには関係するテーブル、クエリ、フォームのみにしたものを送付してください。
追記です。
もう一度確認したところOp段選択の更新後処理が間違っていました。
訂正すると、レコードに検索キーがないと出たり、式に未定義関数・・・というのは出なくなりましたが、今だにクリックしてもなんの反応もありません・・・
なるほど…1文字だけ抽出しないといけなかったですね。ウッカリしていました。
また、選択クエリで確認すべきというアドバイス、ありがとうございました。
選択クエリでRight([管理番号],3)がどんな値を取得しているのか確認すると状況がつかめるかと思います。
おそらくやりたいことは下記の式になるのではないでしょうか?
ありがとうございます。参考にさせて頂きます。
その「ID」は本当に必要ですか?
例えば「タイトル」は主キーになりませんか?
任意の並び順が欲しいのであればそのまま「並び順」フィールドを作って数値で管理し並び替えればいいと思います
これ以上は「ID」をどう使いたいのかも分かりませんし、当初の質問の内容ともずれているので運用の想定も含めて新しく質問を作ってもらえればと思います
「年月を変更する際は~変更する」だと、それ以外の場合は変更したくないということですよね?データはどこかに記録しておかないと消えてしまいます。データの記録が必要ならやはりテーブルを持つべきでしょう
システム上で1つだけあればいいデータを保持したいのならたとえば「TsystemProperty」というテーブルを作って
name(テキスト型・主キー)
num(数値型)
とすれば、フォーム上からなら
の形で参照することができます。
非連結のコントロールで読み込み、変更もしたいならVBAでフォームの読み込み時にデータの読み込み、各コントロールの更新後処理でテーブルのデータ更新を行えば実現できます