履歴を取るのに「更新者=使用者」これは、currentuserですよね!
「テーブル全体を履歴に残す」バージョンでテーブルの更新者の規定値にcurrentuser()と入れればできる!と思ったのですが、テーブルではその式は利用できませんでした。モジュールに何か書き込まないとできないのでしょうか?
現在のモジュールは以下の通りです。
Sub History_a()

Dim Ctr As Control
Dim strSQL As String

For Each Ctr In Me.Controls
If Ctr.ControlType = 109 Then
If Ctr.OldValue <> Ctr.Value Then
strSQL = "insert into あ履歴 select * FROM あ " & _
"where 顧客コード = " & Me.顧客コード
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True
Exit Sub
End If
End If
Next Ctr
End Sub

ここで作成した使用者を顧客コードをキーに最終更新日の更新者を取り出すという、ややこしくてわけがわからなくなりそうなことも可能でしょうか?

A 回答 (6件)

>strSQL = "insert into 履歴 values('担当者情報','" & Me.顧客コード & _


"','" & Ctr.ControlSource & "','" & Ctr.OldValue & "',#" & Now() & "#,'" & currentuser() & "','履歴ID')"としています。

上記「履歴ID」がオートナンバー型に相当すると思いますが、オートナンバー型は文字通り自動的に与えられます。
とって、履歴IDを指定する必要はありません。

strSQL = "insert into 履歴 values('担当者情報','" & Me.顧客コード & _
"','" & Ctr.ControlSource & "','" & Ctr.OldValue & "',#" & Now() & "#,'" & currentuser() & "')"
    • good
    • 0

確認はしていないのですが、取り急ぎ・・・



=DLookUp("更新者","履歴","((顧客コード='" & [顧客コード] & _
  "') AND (更新日 = #" & [最新更新日] & "#))"

でどうですか?

オートナンバー型を使用する場合のSQLは後ほど・・・
    • good
    • 0
この回答へのお礼

m(__)m できました(^o^)丿

本当にいろいろありがとうございました。(T_T)
これで、やっと安らかな眠りにつくことができます(^.^)

watapo3さんに鍛えられて?少しは成長したかな~??(~_~;)
とっても、とっても助かりましたm(__)m
ありがとうございましたm(__)m
お礼として、1万pointぐらい差し上げたいところですが、何分手持ちが20pointしかないもので・・・・、申し訳ありませんm(__)m

お礼日時:2001/11/24 19:54

ちょっと紛らわしい表記があった為修正です。



>以前、最新の更新日を得るDLookUpは成功したと思いますので、

DMaxを使用して抽出したんでしたね!

>=DLookUp("更新者","履歴","顧客コード=" & [顧客コード] & _
  " AND 更新日時 = #" & [最新更新日] & "#"

更新日というフィールド名で作成していると思いますので・・・以下に変更

=DLookUp("更新者","履歴","顧客コード=" & [顧客コード] & _
  " AND 更新日 = #" & [最新更新日] & "#"


以上です。m(_ _)m

この回答への補足

ほにゃ~!できませーん(*_*)エラーなのです。
挿入したテキストボックスのコントロールソースにwatapo3さんの教えてくれた式をコピーし、名前を「最新更新日」をしたのに・・・。
そうそう、急遽「顧客コード」が数値型からテキスト型に変更になったため、「'」の入力を必要とするんですよね!
この式だと、下記のようになるんですよね?これでだめでした。
=DLookUp("更新者","履歴","顧客コード='" & [顧客コード] & _
  "' AND 更新日 = #" & [最新更新日] & "#"
(ちなみに顧客コードのテキスト型に伴う履歴の書き出し等にエラーがでたので、「']を導入して今までの所(今回の以外)は、無事解決しました!

どうも、AND以降の式を認識していないようです。
上記の式を記入すると、「AND」は、「and」になってしまいます。(コピーで貼り付けたら大文字で入力できたのですが、やはりエラーです。)
認識されていれば、通常「and」は、「And」とaが大文字になりますよね??
何か、もっと基本的なところで私が間違いをしているのでしょうか?

現在、テキストに「履歴ID」←(オートナンバー)を追加して、やってみているのですが、ちゃんと最新更新者名を取ってきました!ただし、問題は、履歴が取れなくなってしまったことなのです。
変更を行うと、「実行時エラー3464、抽出条件でデータ型が一致しません」とでます。デバックを選ぶと、「履歴ID」の書き出しのところ?がエラー?みたい?
DoCmd.RunSQL strSQL
ここが、黄色くなってました。

プロシージャーのところで、
strSQL = "insert into 履歴 values('担当者情報','" & Me.顧客コード & _
"','" & Ctr.ControlSource & "','" & Ctr.OldValue & "',#" & Now() & "#,'" & currentuser() & "','履歴ID')"としています。
コントロールソースのところで、
=DLookUp("更新者","履歴","履歴ID=" & DMax("履歴ID","履歴"))としています。
プロシージャーの履歴IDの指定の仕方が違っているのだと思います。(T_T)が、オートナンバー型のデータに対してどのような入力をすれば良いのかわかりません。
(オートナンバーは使用できるのでしょうか?)
教えてください。よろしくお願い申し上げます。

補足日時:2001/11/24 01:04
    • good
    • 0

うぅ~む、自力での解決は無理でしたか・・・(^ ^;



以前、最新の更新日を得るDLookUpは成功したと思いますので、
そのコントロールの値を使用します。(コントロール名「最新更新日」と仮定)

=DLookUp("更新者","履歴","顧客コード=" & [顧客コード] & _
  " AND 更新日時 = #" & [最新更新日] & "#"

補足:
日付型は「#」で囲んでやる必要があります。

では、頑張って下さい。m(_ _)m・・・ちなみに更新者名の記録は成功したのだろうか(?_?)

この回答への補足

自力で頑張ろう!!と頑張ってはいるものの・・・。

>ちなみに更新者名の記録は成功したのだろうか(?_?)
これは成功しております(^o^)丿

変更箇所のみの履歴をとるプロシージャーは、
strSQL = "insert into 履歴 values('担当者情報','" & Me.顧客コード & _
"','" & Ctr.ControlSource & "','" & Ctr.OldValue & "',#" & Now() & "#,'" & CurrentUser() & "')"

テーブル全体の履歴を取るプロシージャーは、
strSQL = "insert into DM履歴 select * , '" & CurrentUser & "' as 更新者 FROM DM情報 '" & _
"where 顧客コード = " & Me.顧客コード
になっておりますm(__)m

ちなみに、=DLoolkUp("更新者","履歴","履歴ID=" & DMax("履歴ID","履歴"))
で更新者はもってこれたものの・・・、履歴が取れなくなってしまいましたm(__)m

補足日時:2001/11/24 09:54
    • good
    • 0

ははは、またポカをしてしまった(もう笑うしかない)



strSQL = "insert into あ履歴 select * , '" & CurrentUser & "' as 更新者 FROM あ " & _
  "where 顧客コード = " & Me.顧客コード

「*」と「'」の間に「,」を入れるのを忘れてしまったみたい(単純なタイプミス・・・・別に前後の半角スペースはあっても無くても結構です。)

申し訳ありませんでした。m(_ _)m

この回答への補足

watapo3さーん!
(T_T)(*_*)(@_@)(T_T)

>これは本当にDLookUpで出来るでしょう(最終更新日を先に抽出していると仮定して)。顧客IDと最終更新日でユニークになるはずですので・・・。

「最終更新日を先に抽出していると仮定して」というのは、どこを見たら確認できるのでしょうか????
最終更新者を表すテキストボックスを挿入し、
=DLookUp("更新者","履歴","顧客コード=" & [顧客コード])
と、書いたのですが、最初に見つけたものを拾ってきてしまいます(T_T)
これって、最終更新日を先に抽出していないということですか?
以前言われたように、履歴IDを作成する必要がありますでしょうか?

補足日時:2001/11/22 22:52
    • good
    • 0
この回答へのお礼

ひぇ~。watapo3さん(*_*)Please Help me!m(__)m
あれから、数時間・・・。思い当たる式を書いてみました。。
とにかく思い当たる式を色々と・・・、でも、できなかった・・・(T_T)・・・
後、履歴IDを取る方法を試してみました。履歴テーブルに「履歴ID」というテーブルを作成し、フォームに挿入したテキストのコントロールに、
=DLookUp("更新者","履歴","顧客コード=" & [顧客コード] & " AND 履歴ID = " & Max([履歴ID]))
と書いてみたものの、これもダメだと・・・・。
この時に挿入したテキストのコントロール表記を削除して実行すると、今度は!履歴を取ることができなくなる・・・。テキストに履歴IDを追加したのが原因と言うことは判明したものの、これでは・・・履歴IDというテーブルを挿入できない(T_T)ほにゃ~(*_*)
ちなみに現在、watapo3さんから教わった、変更されたところだけの履歴を取る方法と、変更されたときに全てのテーブルの履歴を取る方法、両方とも使用しておりますm(__)m
何とかなりますか?

お礼日時:2001/11/23 02:08

「あ履歴」テーブルに「更新者(テキスト型)」を作成します。



で、以下に変更
strSQL = "insert into あ履歴 select * '" & CurrentUser & "' as 更新者 FROM あ " & _
  "where 顧客コード = " & Me.顧客コード

でOK(^ ^)

そんでもって、
>ここで作成した使用者を顧客コードをキーに最終更新日の更新者を取り出すとい
>う、ややこしくてわけがわからなくなりそうなことも可能でしょうか?

これは本当にDLookUpで出来るでしょう(最終更新日を先に抽出していると仮定して)。顧客IDと最終更新日でユニークになるはずですので・・・。

この回答への補足

watapo3さん、変更をかけてみました(T_T)しかし、
DoCmd.RunSQL strSQL
で「ダメ」と言われてしまいます。なぜ~??でしょうか?
エラーメッセージは、実行時エラー3075
クエリ式'*"'admin"の構文エラー:演算子がありません。
でした。
よろしくお願い申し上げますm(__)m

補足日時:2001/11/22 19:01
    • good
    • 0

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

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

Qエクセル・マクロでIf Thenの使い方

このような質問は、ルール(エチケット、マナー)違反になるでしょうか?
もしそうならお許し下さい。
名前ボックスに表示される名前を、マクロで非表示にし、元に戻す、という操作を次の二つのボタンで実行するように作りました。エクセル2003です。

Private Sub CommandButton1_Click()
Dim tname As Name
For Each tname In ThisWorkbook.Names
tname.Visible = False
Next
End Sub

Private Sub CommandButton2_Click()
Dim tname As Name
For Each tname In ThisWorkbook.Names
tname.Visible = True
Next
End Sub
これを一つのボタンで、If Then Elseを使い実行できるようにしたいのですが If ・・・ Then の間の書き方が分からずうまくいきません。
  If Names.Visible = False Then
  If ThisWorkbook.Names.Visible = False Then
If ThisWorkbook.tname.Visible = False Then

Private Sub CommandButton3_Click()
Dim tname As Name
If Names.Visible = False Then 'これでは駄目
For Each tname In ThisWorkbook.Names
tname.Visible = False
Next
Else
For Each tname In ThisWorkbook.Names
tname.Visible = True
Next
End If
End Sub
苦し紛れにこんなことをやってごまかそうとしているのですがこれって邪道ですしかっこうわるいですよね。
Private Sub CommandButton3_Click()
Dim tname As Name
If Range("g1").Value = " " Then
  For Each tname In ThisWorkbook.Names
  tname.Visible = False
  Next
Range("g1").Value = "1"
Else
  For Each tname In ThisWorkbook.Names
  tname.Visible = True
  Next
Range("g1").Value = " "
End If
End Sub
ど素人ですがよろしくご教導ください。

このような質問は、ルール(エチケット、マナー)違反になるでしょうか?
もしそうならお許し下さい。
名前ボックスに表示される名前を、マクロで非表示にし、元に戻す、という操作を次の二つのボタンで実行するように作りました。エクセル2003です。

Private Sub CommandButton1_Click()
Dim tname As Name
For Each tname In ThisWorkbook.Names
tname.Visible = False
Next
End Sub

Private Sub CommandButton2_Click()
Dim tname As Name
For Each tname In ...続きを読む

Aベストアンサー

こんばんは。

Names は、コレクション名ですから、Visible プロパティは存在しないはずです。

こうすれば、トグルになります。

Private Sub CommandButton1_Click()
Dim tName As Name
For Each tName In ThisWorkbook.Names
 tName.Visible = Not tName.Visible
Next
End Sub

Private Sub CommandButton3_Click()
>Dim tname As Name
>If Range("g1").Value = " " Then

    ↓

Private Sub CommandButton3_Click()
Dim tName As Name
Dim flg As Boolean
For Each tName In ThisWorkbook.Names
 tName.Visible = Not tName.Visible
 flg = Not tName.Visible '最後のフラグで決定
Next
CommandButton3.Caption = IIf(flg, "非表示", "表示")
End Sub

こんばんは。

Names は、コレクション名ですから、Visible プロパティは存在しないはずです。

こうすれば、トグルになります。

Private Sub CommandButton1_Click()
Dim tName As Name
For Each tName In ThisWorkbook.Names
 tName.Visible = Not tName.Visible
Next
End Sub

Private Sub CommandButton3_Click()
>Dim tname As Name
>If Range("g1").Value = " " Then

    ↓

Private Sub CommandButton3_Click()
Dim tName As Name
Dim flg As Boolean
For Each tName In Thi...続きを読む

Q定数の宣言ってdimは使えないのですか?

VBAです。
標準モジュールに

Option Explicit
Public Const フォルダ名 As String = "新しいフォルダー"
Sub aaaa()
End Sub

はできるのですが、

Option Explicit
dim Const フォルダ名 As String = "新しいフォルダー"
Sub aaaa()
End Sub

は、エラーになってしまいます。

Option Explicit
Sub aaaa()
dim Const フォルダ名 As String = "新しいフォルダー"
End Sub

もダメみたいです。

定数を使うときは、必ずPublicで宣言しなけらばいけないのでしょうか?

Aベストアンサー

ちょっと意味が分からないのですが
Dim は変数
Constは定数 なので
一緒に指定することはないと解釈するのですが

Sub aaaa()
Const フォルダ名 = "新しいフォルダー"
End Sub

ではダメなのでしょうか。

QDocmd.RunSQL 文で 追加時の確認メッセージの省略出来ますか

QNo.3140739,QNo.3141094の追加質問です。

テーブルへ追加書き込み処理に
DoCmd.RunSQL "insert into 介護メモ values(ID,利用者,日付,身体単位,生活単位,開始時刻)", 0
としましたところ、確認メッセージが出て,OKをクリックすると書き込んでくれるのですが、一度に2000件前後のデータを追加します。
この確認メッセージを省略する方法を教えてください

Aベストアンサー

DoCmd.SetWarnings False

QエクセルVBAのWith~End With構文

Win2000エクセル2000です。
下記のMacro11はTEST11のようにWith~End Withでくくれると思うのですがエラーになります。
どこがおかしいのでしょうか?

Sub Macro11()
ActiveSheet.Shapes.AddShape(msoShapeSun, 450, 150, 120, 120).Select
Selection.ShapeRange.Line.Weight = 0.75
Selection.ShapeRange.Line.ForeColor.SchemeColor = 64
Selection.ShapeRange.Fill.ForeColor.SchemeColor = 10
Selection.ShapeRange.Fill.OneColorGradient msoGradientFromCorner, 1, 0.59
Selection.ShapeRange.Adjustments.Item(1) = 0.3016
Selection.ShapeRange.ThreeD.SetThreeDFormat msoThreeD7
Selection.ShapeRange.ThreeD.PresetMaterial = msoMaterialMetal
Selection.ShapeRange.ThreeD.Depth = 144#
End Sub

Sub TEST11()
With ActiveSheet.Shapes.AddShape(msoShapeSun, 450, 150, 120, 120)
.ShapeRange.Line.Weight = 0.75
.ShapeRange.Line.ForeColor.SchemeColor = 64
.ShapeRange.Fill.ForeColor.SchemeColor = 10
.ShapeRange.Fill.OneColorGradient msoGradientFromCorner, 1, 0.59
.ShapeRange.Adjustments.Item(1) = 0.3016
.ShapeRange.ThreeD.SetThreeDFormat msoThreeD7
.ShapeRange.ThreeD.PresetMaterial = msoMaterialMetal
.ShapeRange.ThreeD.Depth = 144#
End With
End Sub

Win2000エクセル2000です。
下記のMacro11はTEST11のようにWith~End Withでくくれると思うのですがエラーになります。
どこがおかしいのでしょうか?

Sub Macro11()
ActiveSheet.Shapes.AddShape(msoShapeSun, 450, 150, 120, 120).Select
Selection.ShapeRange.Line.Weight = 0.75
Selection.ShapeRange.Line.ForeColor.SchemeColor = 64
Selection.ShapeRange.Fill.ForeColor.SchemeColor = 10
Selection.ShapeRange.Fill.OneColorGradient msoGradientFromCorner, 1, 0.59
...続きを読む

Aベストアンサー

こんにちは。maruru01です。

>出来ればSelectしないでShapeRangeの属性を一括変更したいのですが・・・。
Selectしないならこうです。


Sub TEST12()
With ActiveSheet.Shapes.AddShape(msoShapeSun, 450, 150, 120, 120)
.Line.Weight = 0.75
.Line.ForeColor.SchemeColor = 64
.Fill.ForeColor.SchemeColor = 10
.Fill.OneColorGradient msoGradientFromCorner, 1, 0.59
.Adjustments.Item(1) = 0.3016
.ThreeD.SetThreeDFormat msoThreeD7
.ThreeD.PresetMaterial = msoMaterialMetal
.ThreeD.Depth = 144#
End With
End Sub

QValueで値を貼り付けコピー時Escキー連続押下

現在業務で以下のようなマクロを記述しています。
(Xはダミー文字です)

Function XXX()

(略)

On Error GoTo OUTPUT_ERROR

Application.EnableCancelKey = xlErrorHandler

(略)

'別ブックからの値貼り付けコピー
XXX.Value = XXX.Value

(略)

OUTPUT_ERROR:

XXXXXXXXXXX


(略)

End Function


この処理において、Valueを用いた値の貼り付けが膨大なデータを対象としており長時間処理がかかる場合、その貼り付け処理中にEscキーを1回押下した時は、エラートラップが正常に働き、値の貼り付けの途中で終了しているようなのですが、同じ状況でEscキーを連続で押下し続けた場合、2回目の押下以降で「実行時エラー '18':」という表記のウィンドウが表示され処理が止まってしまいます。


上記ウィンドウにてデバッグボタンを押下すると、「OUTPUT_ERROR」の最初の行(XXXXXXXXXX
)で止まっています。


尚、同じ処理をValueではなくCopyにて実装したところ、Escキー連続押下しても、Copy処理が完了するまで割込み処理が走っていないようで、Copy終了後に「OUTPUT_ERROR:」以降の処理が走っているようでした。ただ、Valueよりも処理時間が格段に長くなってしまうため、こちらの案は出来る限り採用しない方向で検討しています。


実現したいことは、処理時間の短縮の為、Valueにて値を貼り付けコピーを実施しつつも、それが長時間に渡る場合はEscキー押下でキャンセル処理を実装することなのですが、Escキーを連続押下された場合も考慮して動作確認をしたところ、上記の現象が出てしまっており、解決の糸口が見つかっていません。

この場合、Escキーが連続で押された場合も正常にキャンセル処理を走らせるには、どのようにしたら実現できますでしょうか?よろしくお願い致します。

現在業務で以下のようなマクロを記述しています。
(Xはダミー文字です)

Function XXX()

(略)

On Error GoTo OUTPUT_ERROR

Application.EnableCancelKey = xlErrorHandler

(略)

'別ブックからの値貼り付けコピー
XXX.Value = XXX.Value

(略)

OUTPUT_ERROR:

XXXXXXXXXXX


(略)

End Function


この処理において、Valueを用いた値の貼り付けが膨大なデータを対象としており長時間処理がかかる場合、その貼り付け処理中にEscキーを1回押下した時は、エラートラップが正常に働き、値の貼り...続きを読む

Aベストアンサー

こんにちは。

まず、アプリケーションは、書かれていませんが、Excelということでしょうか?

ふつうは、.Value = .Value で、そのようなインターラプトさせるコードにはしないものですし、Excelでなぜ、Function プロシージャなのか、よく分かりません。つまり、他のマクロから呼び出ししているということでしょうか?

基本的に

Application.EnableCancelKey = xlErrorHandler
と入れるなら、
Application.EnableCancelKey = xlInterrupt
と戻さなくてもよいのかな?(場合によるようですが)

それから、大量ということは、ループしているのでしょうか?
もし、そうでしたら、DoEventsで割り込みさせたほうが無難だと思います。

EnableCancelKey を使う時は、処理条件が相手任せで、無限ループになる可能性がある場合などに施すのであって、注意して使うことが要求されます。これを使う場合は、イレギュラーなコードの方が多いです。質問内容では、隠れている所がよく分からないです。

そもそも、値コピーに時間が掛かるという部分に、解決の要素がないのか、現在の質問の中では分かりません。量的な問題の場合は、カウンターをつけて、1万回とか10万回とかループした時に、カウンターが回数を越えたということで、途中で止まるように作ります。また、別に、フラグで割り込みを入れるようにも作ります。

> OUTPUT_ERROR:
については、問題はありませんが、
通常は、

OUTPUT_ERROR:
If Err.Number = 18 Then
  MsgBox "途中終了します。"
  '別の処理があるなら、ここに入れます。
End If
'Application.EnableCancelKey = xlInterrupt

というようなスタイルにしますね。

こんにちは。

まず、アプリケーションは、書かれていませんが、Excelということでしょうか?

ふつうは、.Value = .Value で、そのようなインターラプトさせるコードにはしないものですし、Excelでなぜ、Function プロシージャなのか、よく分かりません。つまり、他のマクロから呼び出ししているということでしょうか?

基本的に

Application.EnableCancelKey = xlErrorHandler
と入れるなら、
Application.EnableCancelKey = xlInterrupt
と戻さなくてもよいのかな?(場合によるようですが)

それから、大量と...続きを読む


人気Q&Aランキング

おすすめ情報