現在下記の様なコードを作成しています。
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 を超える行継続文字があります。
いくつかの行を物理的に長くして必要な行継続文字数を減らすか、複数のステートメントに分割します。
どの様に対処したらよろしいでしょうか?
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
何度もありがとうございます。
Tempシートを作り、コードをコピペさせていただき、2・3対応表を作りましたが作動いたしません><
なにが原因かわかりますでしょうか?
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さんの書かれたプログラムの方針を尊重するなら、こんな感じになると思います。
他の方が書かれているやり方でも良いと思います。
どういう方法でやるかは、ご自由に。
No.6
- 回答日時:
80kaiさんこんばんは、merlionXXです。
> この場合でも上記のもので対応かのうなのでしょうか?
どんなに組み合わせがあろうが、おのおののシートでは、入力させる場所は決まっているんでしょう?(場所はシートごとに異なっていてもかまいません)
セルも連続してなくともかまいません。
入力があればマクロが走るようにしたいセルをすべて選択して名前を付ければいいんです。
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
いつもありがとうございます。
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
これは同時に複数のセルを変更したかどうかの判断ですので入れておいたほうがベターです。
No.4
- 回答日時:
80kaiさんこんにちは、merlionXXです。
行継続文字とはコードを改行する際に使った、半角スペースとアンダースコア _ の組み合わせのことです。
これが24を超えるとエラーになるんですか。
そんなにたくさんコードを改行したことがないので存じませんでした。
で、80kaiさんのコードで24を超えるということは、入力した値を他のシートに転記させるセルがそれだけたくさんあるってことですね。
それならいちいち対象セルを列記するのはやめにして、対象とする複数のセル範囲に「名前の定義」で名前をつけてしまいましょう。
そうすれば列記せずに
If Intersect(Target, Range("定義した名前")) Is Nothing Then Exit Sub
の一行で足りてしまいます。
これは入力したセルがRange("定義した名前")のところでなかったらマクロは作動しないという意味です。
セルの転記作業の
With Sheets("部材表")
略
End With
の間は、何行あってもエラーにはなりません。
いつもありがとうございます。
セル範囲に「名前の定義」とありますが1シートと18のシートをリンクさせようとしておりまして、セルの組み合わせは200位になりそうなのですが・・・。
質問タイトルの10こ下を見ていただければわかると思うのですがかなりセルの組み合わせがばらばらに設定してます。シートにはつながってる場所もありますが、1セルごとに入力したい数値が違ってきてしまいます。
この場合でも上記のもので対応かのうなのでしょうか?
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する。
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
の部分は増やしても問題ないでしょう。
No.1
- 回答日時:
こんにちは。
おそらく、「With~End With」の行数が多すぎると思うので、エラーが出ない行数で一度「End With」を書き、次の行にまた「With~」を書いたらいいと思います。
では。
お返事ありがとうございます。
つなげ方なのですが
And Target.Address <> "$F$15" And Target.Address <> "$F$16" _
や
.Range("T14").Value = Range("F15").Value.Range("R19").Value = Range("F16").Value
という感じでよろしいのでしょうか?
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Visual Basic(VBA) 【再投稿】VBAで動作しなくて困っています 2 2022/10/11 11:05
- Visual Basic(VBA) VBAのトグルボタンでのマクロについて質問です 3 2022/10/10 17:23
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/02/02 09:25
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- Visual Basic(VBA) Worksheet_Change 4 2023/03/12 21:54
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
- Visual Basic(VBA) countifsについての質問 3 2023/03/08 13:45
- Visual Basic(VBA) エクセル VBAで複数セル選択時エラーになる問題 3 2022/10/04 02:40
- Visual Basic(VBA) 配列の勉強をしています。使用する変数の意味、検索条件の書き方が難しいです。 2 2022/09/15 14:06
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
数学 Tan(θ)-1/Cos(θ)について...
-
4つのパターンを表示するEXACT...
-
エクセルの数式で教えてください。
-
エクセルで指定した日付、店舗...
-
Excel:一部のフォントでセルの...
-
Excel初心者です。 詳しい方、...
-
Excel初心者です。 詳しい方、...
-
Excel 2019 のピボットテーブル...
-
スマートな関数を教えて下さい。
-
Excelのグラフ軸について
-
EXACT関数とIF関数の組み合わせ...
-
Excel ウインドウ枠の固定をす...
-
エクセルで日付の入ったセルの...
-
excelの不要な行の削除ができな...
-
INDIRECTを使わず excelで複数...
-
各ページの1番上の表示について
-
スプレッドシートの関数VLOOKUP...
-
エクセルでセルに「氏名を入力...
-
関数を教えて下さい。
-
Excelのif関数で文字が見えなく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ファイル内にある数字の出現回...
-
Excel関数の先頭に「@」が入っ...
-
エクセルの気味悪い不思議
-
Excel VBAで、実行時にsheet上...
-
表示されている人数だけを数え...
-
他人が作ったマクロの理解
-
Excelの関数について質問です。
-
Excel 集計表
-
エクセル 日時の計算式について
-
Excelの関数に関して質問です。...
-
エクセル:セル内の文字列の下...
-
絞り込み検索
-
エクセルの関数で
-
エクセルの書式設定について教...
-
余分なEXCELファイルに印刷され...
-
VBA 同一シート内での転記の仕方
-
長期休みの関数はありますか
-
Excelの空のセル
-
エクセルで入力してある文を別...
-
Excelのマクロで、セルを結合し...
おすすめ情報