• ベストアンサー

マクロの行不足対処法を教えてください。

現在下記の様なコードを作成しています。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$F$13" And Target.Address <> "$F$14" _ And Target.Address <> "$F$15" _ And Target.Address <> "$F$16" _ And Target.Address <> "$F$17" _ And Target.Address <> "$F$18" Then Exit Sub Application.EnableEvents = False With Sheets("部材表") .Range("R14").Value = Range("F13").Value .Range("S14").Value = Range("F14").Value .Range("T14").Value = Range("F15").Value .Range("R19").Value = Range("F16").Value .Range("S19").Value = Range("F17").Value .Range("T19").Value = Range("F18").Value End With Application.EnableEvents = True End Sub このコードの And Target.Address <> "$F$16" _ 部分と .Range("R19").Value = Range("F16").Value 部分を増やしていくと、行継続文字 () の使いすぎとの事で、 ヘルプに下記の文章があります 行継続文字で継続されている行が、25 行を超えているか、または 1 つの論理行に 24 を超える行継続文字があります。 いくつかの行を物理的に長くして必要な行継続文字数を減らすか、複数のステートメントに分割します。 どの様に対処したらよろしいでしょうか?

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

こんばんは。 >1シートと18のシートをリンクさせようとしておりまして、 >セルの組み合わせは200位になりそうなのですが・・・。 少し、今のコードの感じですと、アイデアがわかないかもしれませんね。 複雑な処理の場合は、一旦、ワークシートで、その対応表を作って、そのデータを、VBAに呼んだほうがよいです。ベテランの方たちは、こういう処理を隠して作るようですが、基本的な考え方は、私の知る範囲では、みなさん同じようです。 しょせん、これは、Excelのワークシートを利用するしかないと思います。これは、先人の知恵なのです。 他にもあることはありますが、ものすごく煩雑になってしまいます。簡単に言えば、シートの代わりに、二次元で配列を作ってあげるのです。昔は、私は、そういうように作ったほうが偉いような気がしていましたが、素直にシートに作ることにしました。^^;それは、修正が早いからです。 シート名 「Temp」を設けます。(確認できたら、隠しシート(Hidden)にしてしまってください。)なお、私は、Match を多く多様しますが、人によっては、Vlookup などを使うこともあるようです。Match は、VBAの配列データも読むので、私は、主に、こちらを使っています。また、Application.Match と、Application オブジェクトのXL95スタイルにしないのは、今後の継続的な使用法が疑問視されているからです。 (必ず、1行目から)  A    B      C ソース  シート名  相手セル F13   部材表    R14 F14   部材表    S14 F15   部材表    T14 F16   部材表    R19 F17   部材表    S19 F18   部材表    T19 'シートモジュール Private Sub Worksheet_Change(ByVal Target As Range)  Dim i As Variant  Dim shName As String  Dim strRngName As String    If IsEmpty(Target.Value) Then Exit Sub  On Error Resume Next  i = WorksheetFunction.Match(Target.Address(0, 0), Worksheets("Temp").Range("A1:A200"), 0)  On Error GoTo 0  If i = 0 Then Exit Sub  shName = Worksheets("Temp").Cells(i, 2).Value  strRngName = Worksheets("Temp").Cells(i, 3).Value  Application.EnableEvents = False '同じシートに入れなければ本来いりません  If strRngName <> "" And strRngName <> "" Then 'Tempデータ入力にミスがなければいらない   Worksheets(shName).Range(strRngName).Value = Target.Value  End If  Application.EnableEvents = True End Sub

80kai
質問者

お礼

何度もありがとうございます。 Tempシートを作り、コードをコピペさせていただき、2・3対応表を作りましたが作動いたしません>< なにが原因かわかりますでしょうか?

80kai
質問者

補足

作動しました^^ この方法で進めてみます。 本当にありがとうございました。感謝感謝感謝です;;

その他の回答 (7)

noname#22650
noname#22650
回答No.7

再び#2です 動作確認しました。 Private Sub Worksheet_Change(ByVal Target As Range) Dim flg As Boolean '変数宣言忘れてました flg = True If Target.Address = "$F$13" Then flg = False If Target.Address = "$F$14" Then flg = False If Target.Address = "$F$15" Then flg = False If Target.Address = "$F$16" Then flg = False If Target.Address = "$F$17" Then flg = False If Target.Address = "$F$18" Then flg = False If flg Then Exit Sub Application.EnableEvents = False With Sheets("部材表") .Range("R14").Value = Range("F13").Value .Range("S14").Value = Range("F14").Value .Range("T14").Value = Range("F15").Value .Range("R19").Value = Range("F16").Value .Range("S19").Value = Range("F17").Value .Range("T19").Value = Range("F18").Value End With Application.EnableEvents = True End Sub 変数宣言忘れてましたので足しました。 条件を増やしても問題ありません。 最初に80kaiさんの書かれたプログラムの方針を尊重するなら、こんな感じになると思います。 他の方が書かれているやり方でも良いと思います。 どういう方法でやるかは、ご自由に。

80kai
質問者

お礼

わざわざありがとうございます。 時間が許す限り使わせていただきます。 ありがとうございました。

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.6

80kaiさんこんばんは、merlionXXです。 > この場合でも上記のもので対応かのうなのでしょうか? どんなに組み合わせがあろうが、おのおののシートでは、入力させる場所は決まっているんでしょう?(場所はシートごとに異なっていてもかまいません) セルも連続してなくともかまいません。 入力があればマクロが走るようにしたいセルをすべて選択して名前を付ければいいんです。

80kai
質問者

お礼

80kaiです。 名前の設定を一部してみました。 下記の様な入力でよろしいのでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("範囲1")) Is Nothing Then Exit Sub Application.EnableEvents = False With Sheets("部材") .Range("C17").Value = Range("D10").Value .Range("C23").Value = Range("G10").Value .Range("C29").Value = Range("J10").Value .Range("C35").Value = Range("M10").Value .Range("F14").Value = Range("C14").Value .Range("F17").Value = Range("C19").Value .Range("F20").Value = Range("F14").Value .Range("F23").Value = Range("F19").Value .Range("F26").Value = Range("I14").Value .Range("F29").Value = Range("I19").Value .Range("F32").Value = Range("L14").Value .Range("F35").Value = Range("L19").Value End With With Sheets("件数") .Range("F13").Value = Range("R14").Value .Range("F14").Value = Range("S14").Value .Range("F15").Value = Range("T14").Value .Range("F16").Value = Range("R19").Value .Range("F17").Value = Range("S19").Value .Range("F18").Value = Range("T19").Value .Range("F19").Value = Range("U14").Value .Range("F20").Value = Range("V14").Value .Range("F21").Value = Range("W14").Value .Range("F22").Value = Range("U19").Value .Range("F23").Value = Range("V19").Value .Range("F24").Value = Range("W19").Value .Range("F25").Value = Range("X14").Value .Range("F26").Value = Range("Y14").Value .Range("F27").Value = Range("Z14").Value .Range("F28").Value = Range("X19").Value .Range("F29").Value = Range("Y19").Value .Range("F30").Value = Range("Z19").Value End With Application.EnableEvents = True End Sub いつもありがとうございます。

  • myCat
  • ベストアンサー率60% (9/15)
回答No.5

こんにちは。 こういう場合は、Intersectメソッドが簡単です。 -------------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range)  If Target.Count > 1 Then Exit Sub  If Intersect(Target, Range("F13:F18")) Is Nothing Then Exit Sub   '以降代入処理 End Sub --------------------------------------------------------- ●If Target.Count > 1 Then Exit Sub これは同時に複数のセルを変更したかどうかの判断ですので入れておいたほうがベターです。  

  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.4

80kaiさんこんにちは、merlionXXです。 行継続文字とはコードを改行する際に使った、半角スペースとアンダースコア _ の組み合わせのことです。 これが24を超えるとエラーになるんですか。 そんなにたくさんコードを改行したことがないので存じませんでした。 で、80kaiさんのコードで24を超えるということは、入力した値を他のシートに転記させるセルがそれだけたくさんあるってことですね。 それならいちいち対象セルを列記するのはやめにして、対象とする複数のセル範囲に「名前の定義」で名前をつけてしまいましょう。 そうすれば列記せずに If Intersect(Target, Range("定義した名前")) Is Nothing Then Exit Sub の一行で足りてしまいます。 これは入力したセルがRange("定義した名前")のところでなかったらマクロは作動しないという意味です。 セルの転記作業の With Sheets("部材表") 略 End With の間は、何行あってもエラーにはなりません。

80kai
質問者

お礼

いつもありがとうございます。 セル範囲に「名前の定義」とありますが1シートと18のシートをリンクさせようとしておりまして、セルの組み合わせは200位になりそうなのですが・・・。 質問タイトルの10こ下を見ていただければわかると思うのですがかなりセルの組み合わせがばらばらに設定してます。シートにはつながってる場所もありますが、1セルごとに入力したい数値が違ってきてしまいます。 この場合でも上記のもので対応かのうなのでしょうか?

noname#22650
noname#22650
回答No.3

#2です 補足説明 行継続文字とは行末のアンダーバー _ です。 複数の行を一つの行として扱うためのものです。 条件が多すぎて1行に収まらないようなので、複数行に分ける必要があります。 Target.Address が "$F$13"~ "$F$18" 以外なら Exit Subするように書かれてあるので、逆にTarget.Addressが"$F$13"~ "$F$18"のどれかならOKという事です。 変数 flgをTrueに初期化 Target.Addressが範囲内ならflgをFalseに 最後にflgがTrueならExit Subする。

noname#22650
noname#22650
回答No.2

>If Target.Address <> "$F$13" And Target.Address <> "$F$14" _ >And Target.Address <> "$F$15" _ >And Target.Address <> "$F$16" _ >And Target.Address <> "$F$17" _ >And Target.Address <> "$F$18" Then Exit Sub この部分を flg = true If Target.Address = "$F$13" Then flg = false If Target.Address = "$F$14" Then flg = false 中略 If Target.Address = "$F$18" Then flg = false If flg Then Exit Sub と1行ずつにする。 >.Range("R19").Value = Range("F16").Value の部分は増やしても問題ないでしょう。

  • akina_line
  • ベストアンサー率34% (1124/3287)
回答No.1

こんにちは。  おそらく、「With~End With」の行数が多すぎると思うので、エラーが出ない行数で一度「End With」を書き、次の行にまた「With~」を書いたらいいと思います。 では。

80kai
質問者

お礼

お返事ありがとうございます。 つなげ方なのですが And Target.Address <> "$F$15" And Target.Address <> "$F$16" _ や .Range("T14").Value = Range("F15").Value.Range("R19").Value = Range("F16").Value という感じでよろしいのでしょうか? よろしくお願いいたします。

関連するQ&A