• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ExcelのVBAについて(再掲))

ExcelのVBAについての問題点と修正案

このQ&Aのポイント
  • シート1のA3に入力したデータを自動でシート2に転記し、またシート1に戻り入力する単純動作を実現したい。しかし、シート1の時間列が変更されたり、行を削除すると時間記録が正しく表示されない問題がある。この問題はなぜ発生するのか?修正案はどのようなものがあるか?
  • シート1の動作に関する問題点と修正案
  • シート1でのデータ入力とシート間の転記における問題点と修正案

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.3

No1の一部訂正と補足 Cells(にシート指定がなかったので以下のように訂正してください。 str_Left = Left(ws1.Cells(4, 5), ws1.Cells(4, 8)) MsgBox str_Left & vbCrLf & " " & "OKボタンを押してください!" ws1.Range("A3").Select ws2.Activate シート2を表示したい場合はws2.Activateを上記の所に付加してください。

seijiadb07
質問者

補足

ありがとうございます。単純明快というか理想のコードです^^ 作成中な為に敢えてそのまま使えるのは使います。 後日参考にします! '///Sheet1/// Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim time7 As Range For Each time7 In Target If time7.Column = 1 Then time7.Offset(0, 4).Value = Format(Now, "Short Time") & vbCrLf & _ Format(Now, "yyyy/mm/dd hh:nn:ss AM/PM") Application.EnableEvents = False Application.EnableEvents = True End If Next time7 '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") '(2)シートを指定してデータを転記 ws2.Range("A3:H3").Value = ws1.Range("A3:H3 ").Value End Sub Private Sub Worksheet_Activate() ' ' 新規行挿入 ' ' Worksheets("Sheet2").Range("3:3").Insert Application.Goto ActiveSheet.Range("A3"), True Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove Sheets("Sheet1").Range("H3").Select ActiveCell.FormulaR1C1 = "5" Sheets("Sheet1").Range("E3").Select Selection.ClearContents Dim str_Left As String 'セルE4に文字列、セルH4に数字を予め入れておくこと。 str_Left = Left(Cells(4, 5), Cells(4, 8)) MsgBox str_Left & vbCrLf & " " & "OKボタンを押してください!" Sheets("Sheet1").Range("A3").Select End Sub ' ///Sheet2/// Private Sub Worksheet_Activate() '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") ws1.Activate End Sub

その他の回答 (3)

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.4

> (1)この問題はなぜ発生するのか? A列に変更があったら time7.Offset(0, 4).Value = Format(Now, "Short Time") & vbCrLf & _ Format(Now, "yyyy/mm/dd hh:nn:ss AM/PM") が実行されるからです。ので、A3変更限定動作にしました。 またシート1及びシート2の Worksheet_Activate で何も制御していないのでシートを移動するたびに行挿入になっています。多分それはまずいと思います。

seijiadb07
質問者

補足

前者は優れた考えですね。後者は実はまだ思案してて、今あるシートに更にシート3群を作れないか、、。そして、シート3以降を見た場合に閲覧記録と明記できないか悩んでいます。ハードルを上げてしまいすみません。 参考になります、ありがとうございます^^

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.2

No1の補足です。 実行中になにがしかのエラーで止まった場合Changeイベントが無効のままになっている可能性がある(A3にデータを入れても反応しないなど)のでイミディエイトウィンドウに Application.EnableEvents = True と記載してエンターしてください。

  • kkkkkm
  • ベストアンサー率66% (1719/2589)
回答No.1

> シート1のA3に入力、手動でシート2に移動自動で転記し、手動でシート1に移動し、また入力する シート1のA3に入力したらシート2自動で転記し(移動はしない)確認メッセージを出しシート1のA3に再度入力できるようにする。入力は常時シート1のA3である。シート1のA3以外の入力では何も起こらない。 Private Sub Worksheet_Activate() はシート1、シート2とも不要です。 以下のような感じでいかがですか。 Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim ws1 As Worksheet Dim ws2 As Worksheet Dim str_Left As String Application.EnableEvents = False Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") If Target.Address = ws1.Range("A3").Address Then Target.Offset(0, 4).Value = Format(Now, "Short Time") & vbCrLf & _ Format(Now, "yyyy/mm/dd hh:nn:ss AM/PM") ws2.Range("A3:H3").Value = ws1.Range("A3:H3 ").Value Application.Goto ws2.Range("A3"), True Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove Application.Goto ws1.Range("A3"), True Selection.EntireRow.Insert , CopyOrigin:=xlFormatFromLeftOrAbove ws1.Range("H3").Value = "5" ws1.Range("E3").ClearContents 'セルE4に文字列、セルH4に数字を予め入れておくこと。 str_Left = Left(Cells(4, 5), Cells(4, 8)) MsgBox str_Left & vbCrLf & " " & "OKボタンを押してください!" ws1.Range("A3").Select End If Set ws1 = Nothing Set ws2 = Nothing Application.EnableEvents = True End Sub

関連するQ&A

専門家に質問してみよう