プロが教える店舗&オフィスのセキュリティ対策術

現在下記の様なコードを作成しています。

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 を超える行継続文字があります。
いくつかの行を物理的に長くして必要な行継続文字数を減らすか、複数のステートメントに分割します。

どの様に対処したらよろしいでしょうか?

A 回答 (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

この回答への補足

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

補足日時:2006/10/30 19:24
    • good
    • 0
この回答へのお礼

何度もありがとうございます。

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

お礼日時:2006/10/30 18:56

再び#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さんの書かれたプログラムの方針を尊重するなら、こんな感じになると思います。

他の方が書かれているやり方でも良いと思います。
どういう方法でやるかは、ご自由に。
    • good
    • 0
この回答へのお礼

わざわざありがとうございます。

時間が許す限り使わせていただきます。

ありがとうございました。

お礼日時:2006/10/30 18:25

80kaiさんこんばんは、merlionXXです。



> この場合でも上記のもので対応かのうなのでしょうか?

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

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

いつもありがとうございます。

お礼日時:2006/10/30 18:17

こんにちは。



こういう場合は、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
これは同時に複数のセルを変更したかどうかの判断ですので入れておいたほうがベターです。
 
    • good
    • 0

80kaiさんこんにちは、merlionXXです。


行継続文字とはコードを改行する際に使った、半角スペースとアンダースコア _ の組み合わせのことです。
これが24を超えるとエラーになるんですか。
そんなにたくさんコードを改行したことがないので存じませんでした。

で、80kaiさんのコードで24を超えるということは、入力した値を他のシートに転記させるセルがそれだけたくさんあるってことですね。
それならいちいち対象セルを列記するのはやめにして、対象とする複数のセル範囲に「名前の定義」で名前をつけてしまいましょう。

そうすれば列記せずに
If Intersect(Target, Range("定義した名前")) Is Nothing Then Exit Sub
の一行で足りてしまいます。
これは入力したセルがRange("定義した名前")のところでなかったらマクロは作動しないという意味です。

セルの転記作業の
With Sheets("部材表")

End With
の間は、何行あってもエラーにはなりません。
    • good
    • 0
この回答へのお礼

いつもありがとうございます。

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

お礼日時:2006/10/30 17:25

#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する。
    • good
    • 0

>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
の部分は増やしても問題ないでしょう。
    • good
    • 0

こんにちは。



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

では。
    • good
    • 0
この回答へのお礼

お返事ありがとうございます。

つなげ方なのですが

And Target.Address <> "$F$15" And Target.Address <> "$F$16" _

.Range("T14").Value = Range("F15").Value.Range("R19").Value = Range("F16").Value

という感じでよろしいのでしょうか?

よろしくお願いいたします。

お礼日時:2006/10/30 16:26

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