Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Excel 2016)
Unionで指定したセル範囲が意図しない順序で統合されてしまう
投稿日時: 23/05/15 11:18:42
投稿者: ひろと

以下のような表(D13〜Q24のセル範囲想定で記載しています)の数値入力を実施する際に、マウス操作が面倒なのでマクロで範囲選択しようとしています。
表選択操作としてやりたいことは
1.数値選択部分だけを選択
2.エンターでセル送りするときにはD13→D24→E13→…→L24→M16→M20→M24→Oも同じく→P16→Q16
の2点です。
以下のマクロだと1.はOKですが
→…→L24→M16→O16→P16→Q16→M24→…とL24以降は列固定ではなく行固定でセル送りされてしまいます。
 
何か解決策はありませんでしょうか?
 

    D    E    F    G    H    I    J    K    L    M    O    P    Q
13    6.0    167    76    196    82    120    1    0.168    1,880                
14    15.0    158    80    146    50    181    0    0.156    1,810                
15    10.0    180    77    192    50    147    1    0.197    1,900                
16    12.0    194    73    117    72    117    1    0.198    1,860    10.0    20.00    30    40
17    14.0    160    75    199    83    168    0    0.175    1,970                
18    8.0    171    79    127    66    112    1    0.184    1,720                
19    5.0    167    73    175    91    193    1    0.199    1,520                
20    5.0    155    70    166    61    185    1    0.155    1,500    50.0    60.00        
21    7.0    156    72    114    78    136    -1    0.195    1,830                
22    13.0    178    80    147    65    192    0    0.169    1,630                
23    15.0    179    74    200    64    122    1    0.179    1,500                
24    15.0    189    78    148    98    120    -1    0.197    2,000    70.0    80.00        
以下、12行周期で同じフォーマットの表が続く
 
マクロ
If Selection.Row >= 13 And Selection.Column >= Columns("D").Column And Selection.Column <= Columns("L").Column Then
 Set セル = Cells(Int(Selection.Row / 12) * 12 + 1, Selection.Column)
 列補正 = 9 - (セル.Column - Columns("D").Column)
 For i = 0 To 2
  あああ = あああ & セル.Offset(3 + 4 * i, 列補正).Address & ","
  いいい = いいい & セル.Offset(3 + 4 * i, 列補正 + 1).Address & ","
 Next i
 あああ = Left(あああ, Len(あああ) - 1)
 いいい = Left(いいい, Len(いいい) - 1)
 Union(セル.Resize(12, 列補正), _
       セル.Offset(3, 列補正 + 2).Resize(1, 2), _
       Range(あああ), _
       Range(いいい) _
      ).Select
End If

回答
投稿日時: 23/05/15 13:27:57
投稿者: simple

セル選択する動作をマクロ記録して、そのときのRangeをそのまま使用したらいかがですか?
 
> 12行周期で同じフォーマットの表が続く
の部分は、現在のセル位置に応じて、必要なだけOffsetすればよいでしょう。

投稿日時: 23/05/15 13:42:35
投稿者: ひろと

simpleさん
 
ご回答ありがとうございます。
12行周期も含めてセル選択自体は問題なく出来ているのですが、エンターでのセル送りを
 
→L24→M16→M20→M24→Oも同じく→
としたいのに
→L24→M16→O16→P16→Q16→17行目→18行目
とTabキーでセル送りしたような動作になってしまいます。
 
これは仕様上 しかたないことなのでしょうか

回答
投稿日時: 23/05/15 13:53:01
投稿者: simple

私の提案のとおりに実行してみてください。

投稿日時: 23/05/15 14:41:04
投稿者: ひろと

simpleさん
 
ありがとうございました。
マクロの見た目ばかりを優先してしまっておりました。
 
ご提案の方法でやりたいことが出来ました。
 
このマクロをCtrl+Aに割り当てて使用しているので、表範囲外では元の全選択機能を持たせたようなマクロとしました。
 
以下は、今後の同じような悩みを持った方向けです。
 
Sub 選択簡易()
Set 表範囲 = Range("B12").Offset(1, 0).Resize(WorksheetFunction.CountA(Columns("B")) - 5, 18)
If Selection.Row >= 13 And Selection.Column >= Columns("D").Column And Selection.Column <= Columns("L").Column Then
 行 = Int((Selection.Row - 1) / 12) * 12 + 1
 列 = Num2Let(ActiveCell.Column)
 Range(列 & "13:L24,M16,M20,M24,N16,N20,N24,O16,P16").Offset(行 - 13).Select
ElseIf Selection.Column <= Columns("S").Column Then
 If 表範囲.Count = Selection.Count Then
  Cells.Select
 Else
  表範囲.Select
 End If
Else
 Cells.Select
End If
End Sub