エクセルのマクロでシート名を確認しつつデータ内容の変更を行いたい

このQ&Aのポイント
  • エクセルのマクロを使用して指定した範囲のデータ内容を変更する際、シート名の文字数を指定せずに実行する方法を教えてください。
  • 現在、シート名を指定してデータ内容の変更を行っているため、他の人が操作する際にエラーが発生する可能性があります。
  • changeイベントをやめて、シート名の確認をしてからマクロを実行する方法についても教えてください。
回答を見る
  • ベストアンサー

エクセルのマクロについて

以前、こちらのマクロで Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("a1")) Is Nothing Then Exit Sub Application.EnableEvents = False Range("a3:ba28").Replace What:="=*!", Replacement:=Target.Value, LookAt:=xlPart Application.EnableEvents = True End Sub 指定した範囲を(A1)セルに入力した値に置換するマクロを教えていただいたんですが、現在,、これを使ってsheet1の指定範囲内にある(=あ!$AR$75)などが入力してある部分のシート名を置換してデータ内容の変更を行っています。 しかし、この方法だと、シート名の文字数を指定しなくてはならなくて、自分以外の人が操作すると、エラーを出してしまうことがあり困っています。そこでchangeイベントをやめて、シート名の確認をしてからマクロの実行を行うには、どういったマクロにすればいいですか?? 説明が分かりづらくすみません・・・・・・。 もし他にシートの文字数などにこだわらなくてもよい方法があれば教えてください。 よろしくお願いします。

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

  • ベストアンサー
  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.1

>シート名の確認をしてからマクロの実行を行う とりあえず,こういう事ではありませんか? private sub Worksheet_Change(Byval Target as excel.range)  dim dam  if target.address <> "$A$1" then exit sub ’調査する  on error goto errhandle  dam = worksheets(target.value).range("A1").value  on error goto 0 ’置換する  application.enableevents = false  range("A3:BA28").replace what:="=*!", replacement:="='" & target.value & "'!", lookat:=xlpart  application.enableevents = true  exit sub ’作業を中断し警告する errhandle:  msgbox "'" & target.value & "'というシートはありません。" & vblf & "確認し再入力してください" end sub A1セルには「シート名だけを」記入して貰うようにします。 それとも >シート名の文字数を指定しなくてはならなくて 「シートの文字数を指定する」とは,もうちょい具体的にどういう事ですか? どういった記入だったら(どういう理由で)ダメで,どういう記入なら(どういう理由で)OKなのでしょうか。

otoichihr
質問者

お礼

 お礼が遅れてすみません。 分かりづらい説明にこんなにすばらしい回答ありがとうございます。 さっそく使ってみましたが、自分の予定以上のものができました。 本当にありがとうございました。

関連するQ&A

  • エクセル マクロ 初心者です

    エクセルマクロ初心者です。 以下の2つの Private Sub Worksheet_Change(ByVal Target As Range)を1つのシートで実行させたいのですが、 当方、初心者なので組み合わせ方が分かりません。 よろしくお願いします。 ===No1=== Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Target = StrConv(Target, vbUpperCase) Application.EnableEvents = True End Sub ===No2=== Private Sub Worksheet_Change(ByVal Target As Range) Dim Ans As Integer If Target.Count = 1 Then Ans = MsgBox("コピーは禁止!!", vbCritical) MsgBox "データを消去します。" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If If Target.Count = 1 Then Exit Sub Else MsgBox “複数セルのコピー禁止!" With Application .EnableEvents = False .Undo .EnableEvents = True End With End If End Sub ------------ 上記の2つを1つのシートで動作させたいのですが、うまくいきません。 単体では、動作します。

  • エクセルのマクロコードに付いて教えて下さい。

    下記のマクロコードがありますが、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub x = Target.Value With Application .ScreenUpdating = False .EnableEvents = False .Undo y = Target.Value Target.Value = x + y .EnableEvents = True .ScreenUpdating = True End With End Sub セル位置の指定を変更する場合は、どの様に 書けば良いのですか? このコードですと、セルA1の入力指定でなっていますが A1~A5までとか。A1、B1,C1とかにする場合はどの様に 書けば良いか教えて下さい。 マクロに付いて、殆ど知識が無いものですので 出来れば、分かり易い説明でお願いします。 宜しくお願いします。

  • イベントマクロで「コンパイルエラー 因数は省略できません」

    マクロ初心者です イベントマクロを作りました Sheet2の結合されたB44:E44のセルに入力すると自動的にマクロが働いて Sheet1のW1の値のみがSheet2の結合されたB44:E44のセルに貼り付けられるマクロなのですが 実行すると「コンパイルエラー 因数は省略できません」と表示されます マクロ自体は正しく動いているのですがどういうことなんでしょう Sheet2 Worksheet Change Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target.Range("B44:E44")) Is Nothing Then Exit Sub Application.EnableEvents = False Sheets(1).Select Range("W1").Copy Sheets(2).Select Range("B44:E44").Select ActiveSheet.Paste Application.CutCopyMode = False Application.EnableEvents = True End Sub Private Sub Worksheet_Change(ByVal Target As Range)…この行が黄色になります If Intersect(Target.Range("B44:E44")) Is Nothing Then Exit Sub…intersectのところが青くなります こんな説明でわかってもらえるでしょうか?

  • エクセル 加算 

    1つのセルに数字を入力すると加算されているマクロを探していたら 以下の回答がありました Dim memo Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub If Target.Value <> "**" And IsNumeric(Target.Value) = False Then Exit Sub Application.EnableEvents = False If Target.Value = "**" Then memo = 0 Else memo = memo + Target.Value End If Target.Value = memo Application.EnableEvents = True End Sub このマクロですがA1に入力した場合に適用しますが、このマクロをたとえばA1からC1の範囲で使用した1場合にどのようなマクロをすればよいかわかりません それか、このマクロではそのようなことができるのかもわかりませんので教えて頂けないでしょうか

  • このマクロあっていますでしょうか?よろしくお願いいたします。

    ★sheetA Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$C$14" And Target.Address <> "$C$19" _ And Target.Address <> "$F$19" Then Exit Sub If Target.Address <> "$R$14" And Target.Address <> "$S$14" _ And Target.Address <> "$T$19" Then Exit Sub Application.EnableEvents = False With Sheets("B") .Range("F14").Value = Range("C14").Value .Range("F17").Value = Range("C19").Value .Range("F20").Value = Range("F14").Value .Range("F23").Value = Range("F19").Value End With With Sheets("C") .Range("F13").Value = Range("R14").Value .Range("F14").Value = Range("S14").Value .Range("F18").Value = Range("T19").Value End With Application.EnableEvents = True End Sub ★sheetB Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$F$14" And Target.Address <> "$F$17" _ And Target.Address <> "$F$23" Then Exit Sub Application.EnableEvents = False With Sheets("A") .Range("C14").Value = Range("F14").Value .Range("C19").Value = Range("F17").Value .Range("F19").Value = Range("F23").Value End With Application.EnableEvents = True End Sub ★sheetC Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$F$13" And Target.Address <> "$F$14" _ And Target.Address <> "$F$18" Then Exit Sub Application.EnableEvents = False With Sheets("A") .Range("R14").Value = Range("F13").Value .Range("S14").Value = Range("F14").Value .Range("T19").Value = Range("F18").Value End With Application.EnableEvents = True End Sub

  • 指定範囲のセルが変更されたら

     下記のコードで1つのセル(A1)が変更されたら入力前の元データを別シート(A1)に保存できるようにしたのですが、指定範囲(I10:CW42,2行3列を一升)のセルが変更されたら別シートの指定範囲(I10:CW42)に保存できるようにしたいのですが方法がありましたらお教え下さい。お願いします。 Windows7・SP1 Office2010 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub Application.EnableEvents = False Application.Undo Sheets("Sheet2").Range("A1").Value = Range("A1").Value Application.Undo Application.EnableEvents = True End Sub

  • エクセルのマクロコードについて

    エクセルのマクロコードに付いて教えて下さい。 下記のマクロコードがありますが、 Option Explicit ' Private Sub Worksheet_Change(ByVal Target As Range) '   Static Memo(1 To 3) As Long   Dim Cell As Range '   If Intersect([A1:C1], Target) Is Nothing Then     Exit Sub   End If '   For Each Cell In Target '     If Cell = "" Then       Memo(Cell.Column) = 0     End If   Next Cell   Set Cell = Target(1) '   If Not IsNumeric(Cell) Or Cell = "" Then     Exit Sub   End If '   Application.EnableEvents = False   Memo(Cell.Column) = Memo(Cell.Column) + Target   Target = Memo(Cell.Column)   Application.EnableEvents = True End Sub セル位置の指定を変更する場合は、どの様に書けば良いのですか? このコードですと、セルA1からc1の入力指定でなっていますが A1からAA1までとかにする場合やA1の結果を、A1ではなくA2に表示B1の結果をB2に表示する場合はどのように書くのでしょうか? マクロに付いて、殆ど知識が無いものですので 出来れば、分かり易い説明でお願いします。 宜しくお願いします。

  • エクセル VBAマクロ if文 はどうすれば?

    先ほど質問したのですが、さらにわからなくなったのでお願いします 先ほどの質問 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ http://okwave.jp/qa/q7236338.html >変数と式の両立は難しいでしょうからどうすればよいのでしょう?  ⇒関数では出来無いのはエクセルの常識ですのでマクロ(VBA)組込みになります。 一例です。 対象シートタブ上で右クリック→コードの表示→以下のコード貼り付けてA1に枚数を入力して お試しください。 サンプルコード Private Sub Worksheet_Change(ByVal Target As Range) 単価 = 5 If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub If IsNumeric(Target.Value) And Target.Value > 0 Then  Application.EnableEvents = False  Target.Value = Target.Value * 単価  Application.EnableEvents = True End If End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ↓変更&応用したのですが、、、、 EX:(セル)    セル番号  用紙種類1~3       用紙種類    C12   A3モノクロ1     D12  A3カラー1    C13   A3モノクロ2     D13  A3カラー2    C14   A3モノクロ3     D14  A3カラー3 ※金額の違いは、モノクロとカラーの値段が違うだけ  1~3は金額的な違いはない とあった場合、 ためしに先ほどのを応用して用いたのですが 変更点は、用紙サイズ、カラーの有無による金額        出力先セルの番号 Private Sub Worksheet_Change(ByVal Target As Range) を Private Sub A4_mono_1(ByVal Target As Range) Private Sub A4_mono_2(ByVal Target As Range) ・             ・            ・ と変更したのですがうまく動作しなかったのですが、 どういった点が悪かったのでしょうか? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 最終的な質問↓ 上記のものはVBAマクロ文は基本1つのみなので、if文で作らなくてはいけないということが分かったのですが、そこでさらに疑問が浮かびました、 Private Sub Worksheet_Change(ByVal Target As Range) If or(target.columns = C12:C14) Then 単価1 = 7.6 If Intersect(Target, Range("C12:C14")) Is Nothing Then Exit Sub If IsNumeric(Target.Value) And Target.Value > 0 Then Application.EnableEvents = False Target.Value = Target.Value * 単価1 Application.EnableEvents = True単価1 = 7.6 elseif or(target.columns = D12:D14) Then 単価2 = 30.6 If Intersect(Target, Range("D12:D14")) Is Nothing Then Exit Sub If IsNumeric(Target.Value) And Target.Value > 0 Then Application.EnableEvents = False Target.Value = Target.Value * 単価2 Application.EnableEvents = True End If End Sub としたっ場合全く式になっていません どのようにすればよいのでしょう?

  • EXCEL 消費税の計算で有名なマクロに問題

    EXCEL2003 WINDOWS XP SP3 特定のセル(この例ではK5:K55)に入力した値を自動的に計算するモジュールを使っています。消費税の計算で有名な以下のマクロです。これを応用して、10で割る、という計算をしたところ、小数点以下が切り捨てられてしまいます。 例  66と入力→ 6.0       6.6でないとおかしい・・・ 表示形式は小数点が1桁まででるようにしています。小数点以下を切り捨てられないようにするにはどうしたらいいでしょうか。教えてくださいm--m 問題のマクロ Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("K5:K55")) Is Nothing Then Exit Sub Application.EnableEvents = False Target.Value = Int(Target.Value / 10) Application.EnableEvents = True End Sub

  • ExcelマクロのApplication.EnableEvents

    Sub AAA()   Application.EnableEvents = False   If a = 0 then     処理A   End If   Application.EnableEvents = True End Sub このようなコードを組んでいます。 処理Aは、他シートへの書込みを行っており、 他シートのWorksheet_Changeイベントが動いて欲しくないので、 上記の位置にApplication.EnableEventsのFalseとTrueを入れたのですが、 (FalseとTrueを入れた位置は「If文の前後」ではなく、「コードの最初と最後」です) 処理Aによって他シートのWorksheet_Changeイベントも動きました。 ここで、  Application.EnableEvents = False  処理A  Application.EnableEvents = True のように記述したら、処理Aによる他シートのWorksheet_Changeイベントは止められました。 動かしたくない処理がある場合は、 その処理を行っている部分をピンポイントでFalseとTrueで挟まないといけないのでしょうか。 (最初と最後に宣言するのではダメなのでしょうか) それとも今回のような動作をした要因は別にあるのでしょうか。

専門家に質問してみよう