• ベストアンサー
  • 困ってます

VBAでセルに変更があったらユーザアカウントを取得

こんにちは。VBA初心者です。 イベントプロシージャを使って、セルに変更があったら、その右隣のセルにWindowsのユーザアカウント名と変更時刻を取得したいと思い、以下のようなコードを書いたのですが、書き込まれたユーザアカウントも「変更」とみなされて無限ループに陥ってしまいます。 どうしたら、この問題が解決できるでしょうか。 あるいは、イベントプロシージャを使用せずに同じことが実現できるでしょうか。 どうか皆さんのお知恵をお貸しください。 よろしくお願いします。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Target.Offset(0, 1).Value = Application.UserName Target.Offset(0, 2).Value = Now End Sub

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数179
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1
  • okormazd
  • ベストアンサー率50% (1224/2411)

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Application.EnableEvents=False Target.Offset(0, 1).Value = Application.UserName Target.Offset(0, 2).Value = Now Application.EnableEvents=True End Sub Eventを受けた時、続くEventを無効にします。1つのEvent処理をしたら、Event処理を有効にします。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

お礼が遅くなり申し訳ありません。 教えていただいた方法でできました。 いくつかVBAの参考書を持っているのですが、意外とこういう基本的な事が書いてないんですね。 VBEのヘルプも、「Application.EnableEvents」から検索すればヒットしますけど、そもそも、そういうものがあることを知らないとなかなか探せないです。 非常に助かりました。

関連するQ&A

  • マクロでシート名を変更を変更したい

    A1セルの値をシート名にするマクロは以下のとおりだと思います。 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = "$A$1" Then Sh.Name = Target.Range("A1").Value End Sub では、E6セルの値をシート名にすることは可能でしょうか? よろしくお願いします。

  • 【Excell VBA】ユーザーフォーム上のスプレッドシートのセルを選択したときのイベント

    Excell VBA にて、 ユーザーフォーム(userForm1)に、スプレッドシートを 1)その他のコントロール 2)Microsoft Spreadsheetを追加 によって追加して、 そのspreadSheet1上のsheet1の任意のセル(D:*)をクリックしたとき、その行のD1:D5k一連の値を変数に代入したいのですが、 まず手始めとして、そのセルを選択したときにイベントを発生させたい。  該当のセルを選択してプロシージャを追加すると Private Sub Spreadsheet1_BeforeContextMenu( _ ByVal x As Long, _ ByVal y As Long, _ ByVal Menu As OWC11.ByRef, _ ByVal Cancel As OWC11.ByRef _ ) となります。 比較のため Private Sub Spreadsheet1_SelectionChange(ByVal Target As Range)   If Target.Address() = "$A$1" Then     MsgBox "このセルはA1です。"   End If End Sub だと、 Error・・・「コンパイル エラー: プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません。」 ・・・どうすればよいのでしょう。 最終的には、「その行のいくつかの値を変数に代入したい」のですが

  • エクセルVBA イベントプロシージャに引数を渡せま

    お世話になります。 エクセル2003/XP 使用です。 イベントプロシージャに引数を渡せまるかどうか教えていただけますでしょうか? 下記のコード中の変数mysheetnameを ユーザーフォーム、→ CommandButton1のプロシージャに 引数として渡して行きたいのですが、 実行すると、一番最初のWorkbook_SheetBeforeRightClickの時点で、 コンパイルエラー:  プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません。 とエラー表示されます。 イベントプロシージャに引数を渡すことはできますでしょうか? ---------- ThisWorkBook内 ---------- Public mysheetname As String Private Sub Workbook_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Range, Cancel As Boolean) mysheetname = ActiveSheet.Name UserForm1.Show (mysheetname)     '←変数mysheetnameの値をユーザーフォームに渡したい。 End Sub ---------- ユーザーフォーム ---------- Private Sub UserForm_Initialize(ByVal mysheetname As String ) 処理 End Sub Private Sub CommandButton1_Click(ByVal mysheetname As String ) 処理 End Sub ’--------- ここまで 引数について少し理解し始めたばかりの者です。 よろしくお願いします。

その他の回答 (1)

  • 回答No.2

たまに見かけますね。無限ループもどきに陥る回答をされて 解決しましたぁ!・・・ての。 回避策は#1さんので十分かと思いますが Application.UserName だとインストール時の名前が返ってくるだけなのでは? 環境が違うと変わるかもしれません。確認してください。 Windowsのユーザアカウント名なら environ("username") が良さそうににも思えますけど?

共感・感謝の気持ちを伝えよう!

質問者からのお礼

なるほど、確かにユーザアカウントを取得するなら environ("username") の方がよさそうです。 ・ユーザアカウントの取得⇒environ("username") ・複数のユーザアカウント持っていて誰だか判らなくなって困る場合⇒Application.UserName で、使い分けようかと思います。ありがとうございました。

関連するQ&A

  • ワークシート上のセルの値を変更したらVBAを実行させる。

    Excelでシートの任意の箇所(FORM)を変更したらVBAを走らせたいのですがやり方がわかりません。 シート上の任意の箇所に「FORM」という名前をつけました。 その中でセルの値を変更したらVBAを走らせるために、以下のテストを作成しました。 ですが、入力したセルの値は消えて、さらに無限ループのようにいくつも値をみて、メッセージボックスも複数表示されます。 実際は無限ループではないので、フリーズはせずかえってくるのですが。 どのように変更したらいいのでしょうか? Private Sub Worksheet_Change(ByVal TARGET As Range) TARGET = Range("FORM") MsgBox Range("条件1") End Sub

  • VBAで別の列のセルにも色付け~2

    WINDOWS XP EXCELL 2003です。 いつもお世話になります。 ご迷惑とは重々と承知しながら再度質問させていただきます。 1 御指導を賜りたいのは、 現在A列には月度を示す 01&#65374;12 が入力され月別にセルの背景色を塗りつぶしていますがこれをA列用のマクロを工夫してF列にも同様に適用したい。 例えば参照図で言うと A7 05 ピンク  A8 05 ピンク A9 06 ライトブルー  A10 07 草色 等のように ※ 参照図のF列のセルには背景色は適用していません。 2 参照図のそれぞれの設定は、   ※ 計画 と 生産はセル位置だけの違いで生産の方は割愛します。 D1 ユーザー定義 mm/dd D2 ユーザー定義 200000 D3 数値 A7 ユーザー定義 mm マクロ ボタン「計画入力」 Sub 計画入力() Dim GYOU '追加 GYOU = Range("C65536").End(xlUp).Row + 1 Cells(GYOU, 2).Value = Range("D1").Value Cells(GYOU, 3).Value = Range("D2").Value Cells(GYOU, 4).Value = Range("D3").Value End Sub ボタン「セルセット」 Sub 計画セル()    Range("D1,D2,D3,D1").Select End Sub A列のセル塗りつぶし Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row >= 8 And Target.Address = Cells(Rows.Count, "C").End(xlUp).Address Then Target.Offset(0, 0).Value = Date End If Dim c As Integer If Target.Column <> 2 Then Exit Sub If Target.Value = "" Then c = 0 Else On Error GoTo line Select Case Month(Target.Value) Case 1: c = 46 Case 2: c = 4 Case 3: c = 39 Case 4: c = 6 Case 5: c = 7 Case 6: c = 8 Case 7: c = 43 Case 8: c = 3 Case 9: c = 44 Case 10: c = 24 Case 11: c = 40 Case 12: c = 17 End Select End If Target.Offset(0, -1).Interior.ColorIndex = c Target.Offset(0, -1).Font.ColorIndex = IIf(c = 1, 2, 0) Exit Sub line: Target.Offset(0, -1).Interior.ColorIndex = 0 Target.Offset(0, -1).Font.ColorIndex = 0 End Sub 御指導よろしく御願いします。

  • セルの値を変更した時に日付けが入るマクロ

    エクセル2010を使っている者です。 19行以内、19列以内の範囲において変更があった場合は、変更のあった行の 20列目に日付けが入るようしたくて、以下のVBAを書いたつもりなんですが、 うまく動きません。 セルの値を変えたり、セルをダブルクリックして編集可能な状態にすると、 日付けは入るのですが、そのセルより右の19列目までのセルが全て 「41602」といった数字に変わってしまいます。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row = Target.Row > 19 Then Exit Sub If Target.Column > 19 Then Exit Sub Target.Offset(0, 1).Value = Date End Sub なお、上記のVBAは以下のサイトを見て作ったものです。 http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html どなたか、どこがおかしいのかお教えください。

  • Excel VBA イベントプロシージャを2つ記述する(基本です)

    基本的な事なのですが、Excelのイベントプロシージャで2つプログラムを作るにはどうやって記述すればよいのでしょうか? 具体的には、worksheetのchangeイベントで、セルC5の値を変えた時と、セルG7の値を変えた時の2通りのマクロを作成したいのです。 Private Sub Worksheet_Change(ByVal Target As Range) C5を変えた時の処理 End Sub Private Sub Worksheet_Change(ByVal Target As Range) G7を変えた時の処理 End Sub このように書けばよいのでしょうか?そうするとTargetがかぶっておかしくなる気がします。。 お願いします。

  • コンパイルエラー Target.Range

    シート上のセルに値を入力したら、 入力した値をイミディエイトに表示させたいのですが Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Debug.Print Target.Range End Sub こうすると、 コンパイルエラー 引数は省略できません。 になります。 .Range の部分がエラーになります。 原因と対策を教えてください。

  • 変化するセルが変更されたら実行、というVBAを組みたい

    たとえば、このセルが変更されたら実行、というのは Private Sub WorkSheet_change (Byval Target As Range) If(Target.Address = "$D$3") Then call *** End If End Sub のようにしますよね? この場合、指定したセルは「D3」ですが、たとえば、 A列、B列、C列、D列のアクティブの行のセルが変更されたらコード実行、 というようにするにはどうしたらいいのでしょうか?

  • VBA:Callステートメントでいつでもイベント発生可能な準備をしたい。

    タイトルどおり、Callステートメントでいつでもイベント発生可能な準備ができるようにしたいと考えています。しかし、Sub 実行準備SUBでエラーが出ています。どこをどう直せばよいのか教えて頂きたいです。 Private Sub Auto_Open() MsgBox "Ctrl + t でイベント実行準備を行います。" Application.OnKey "^{t}", "実行準備SUB" End Sub '--------------------------------------------------- Sub 実行準備SUB() Dim Target As Range Target = Range(Cells(1, 1), Cells(100, 100)) Call Worksheet_Change(ByVal Target) End Sub '--------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim r As Range For Each r In Target If r.Column = 2 Then r.Offset(0, -1).Value = Now End If Next r End Sub イベントは、シートの2列目のセルに変更があれば、1列目に日付時刻を記入するというものです。宜しくお願い致します。

  • オープンオフィスでシート名をセルから参照するには

    マクロ初心者です。 こちらの質問(http://okwave.jp/qa/q2025849.html)と同じような内容ですが、 試行錯誤してもOpenOffice Calcでできなかったため質問させていただきます。 OpenOffice Calcで、セル「A1」に入力されてある文字を対応するシートの名前に自動で設定するには、どのようなマクロを記述すればいいのでしょうか? エクセルで使用できる Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Target.Address = "$A$1" Then Sh.Name = Target.Range("A1").Value End Sub をVBA互換モードで試しましたが、無理そうでしたのでOpenOffice.org Basicで使えるように変換して記述したいところです。 ですが、オープンオフィスのThisWorkbookはどのように使うのかなどさっぱり理解できなかったので、どなたか詳しい方教えてください。 よろしくお願いします。

  • Excel VBAについて

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Intersect(Target, Range("F:F")) Is Nothing Then Exit Sub Application.Goto Worksheets("人件費").Range("A1") Worksheets("人件費").Cells(Rows.Count, "A").End(xlUp).Offset(1).Value = Target.Offset(, -5).Value cancel = True End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, cancel As Boolean) If Intersect(Target, Range("G:G")) Is Nothing Then Exit Sub Application.Goto Worksheets("外注費").Range("A1") Worksheets("外注費").Cells(Rows.Count, "A").End(xlUp).Offset(1).Value = Target.Offset(, -5).Value cancel = True End Sub 上の指令はFの列をダブルクリックすると人件費のシートが開いてAある値を人件費の新しいセルのAに代入する指令ですが それをG列ダブルクリックで外注費シートに同じようにやろうと思いましたが出来ません。 たぶん根本的に書き方が間違っているのかと思われますが、ご指導のほどお願いします。

  • セルの内容をテキストボックスに表示する

    こんにちは。今月からVBAを少しずつ勉強し始めている初心者です。 VBAでA列のセルをダブルクリックすると、そのセルにチェックが入り、 ユーザーフォームを起動させる。といったコードを記述しました。 チェックが入る→フォームが起動までは良いのですが、入力済みのセルをWクリックした時にフォームのテキストボックスににセルの内容を表示させようとしているのですがうまくいきません。不具合の内容は、フォームに表示されるデータが、前回Wクリックした行のデータが表示されます。例えば、 1回目 ID50を選択→表示されない。 2回目 ID70を選択→ID50が表示される。 3回目 ID90を選択→ID70が表示される。といった具合です。 コードは下記です。Targetが前回を参照しているのだと思って調べてみたのですがよく分かりません。すみませんがご教示お願いします。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim lngTop As Long, lngLeft As Long, strTitle As String Const RangeName As String = "領収書" If Not Intersect(Range(RangeName), Target) Is Nothing Then Cancel = True If Target = "レ" Then Target = "" Target.Offset(0, 9).ClearContents Else Target = "レ" End If End If If Target.Count <> 1 Then Exit Sub  If Target.Column <> 1 Then Exit Sub   If Target <> "レ" Then Exit Sub 入力F.Show With Worksheets("送付名簿") 入力F.TextBox1.Value = Target.Offset(0, 1).Value 入力F.TextBox3.Value = Target.Offset(0, 2).Value 入力F.TextBox4.Value = Target.Offset(0, 3).Value 入力F.TextBox5.Value = Target.Offset(0, 5).Value 入力F.TextBox6.Value = Target.Offset(0, 4).Value 入力F.TextBox7.Value = Target.Offset(0, 6).Value 入力F.TextBox10.Value = Target.Offset(0, 7).Value 入力F.TextBox9.Value = Target.Offset(0, 8).Value End With End Sub