Excel (VBA)

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

 
(Windows 10 Home : Excel 2016)
選択せるの操作で 
投稿日時: 20/07/04 15:13:11
投稿者: rinahana

いつもお世話になっております。
地域の集まり(約100名)があり、普段なら椅子をぎっしり詰めて
5列20行(エクセルのシートで例えると5Columns、20rowsとなりますが)
このコロナ騒動で、市松模様風に各前後を1席を空席にして座るように
椅子の配列をかんがえました。
1行目は1-1,1-3,1-5,1-7,1-9,1-11
2行目は2-2,2-4,2-6,2-8,2-10,2-12
〜〜〜〜〜〜〜〜〜〜〜〜〜〜
のように奇数行は1奇数列、偶数行は偶数列として、椅子に座ってもらう
ことにしました。
そして、プログラムですが、シート1には該当セルに椅子の番号(1-5 etc)を
シート2には座席する方の情報(例えば町番号etc)番号(86 など)を入力する
(シート1とシート2は全く同じセル位置を使っている)
 各行は空白行を1行をとってあり、使用している行はコードでもわかる通り
 4〜36行となっています。
として、VBAで以下のコードを考えました。
シート1には
座っていな椅子の位置のセルは空白セル
座ることになているセルはその行と列を組み合わせた文字が入力したあります。
 
問題はシート1に文字が入力されているセルと同じセル番地をシート2に表現したいことです。
 EのコードでのSelectionのアクティブセルは結局セルB11のままで、プログラムが進んでも
 アクティブセルはB4のままであることです。
必要なセルの宣言はしてあります。( i、row2、coll2はlong、そのほかはVariant )
@ Set sht_2 = Sheets(2)
A i = 39
B Sheets(1).Select
C Range("B4:N36").Select
D For Each cell9 In Selection
E If cell9 <> "" Then
F i = i + 1
G Cells(i, 2).Value = i - 64
H Cells(i, 3).Value = cell9
I row2 = ActiveCell.Row
J col2 = ActiveCell.Column
K Cells(i, 4).Value = sht_2.Cells(row2, col2).Value
L End If
M Next 
 
結局 row1は4、とcol1は2のまま 全く移動しませんでした。
色々上級者の皆さんから考えれば「なにしとるのかなぁ」というところでしょうが、
まず、これを解決して次に進みたいと思っています。
また、こうすれば簡単に2つのシートのセル位置を同じに移動できるということがあったら、
教えてください。お願いします。

回答
投稿日時: 20/07/04 19:57:33
投稿者: 半平太

正直言って、何をやりたいのか分からないですが、
同じセル位置と言う部分だけ
 
>K Cells(i, 4).Value = sht_2.Cells(row2, col2).Value
 ↓
 Cells(i, 4).Value = sht_2.Range(cell9.Address).Value

回答
投稿日時: 20/07/05 06:13:55
投稿者: WinArrow
投稿者のウェブサイトに移動

>結局 row1は4、とcol1は2のまま 全く移動しませんでした。

>row1
は、row2 の間違いですよね?
 
なぜか?
をきちんと理解する必要があります。
 
>C Range("B4:N36").Select
でB4〜N36を選択しています。
これが、ActiveCellです。
そして、IJでActiveCellを参照しています。
>I row2 = ActiveCell.Row
>J col2 = ActiveCell.Column
この時の
>.Row
>.Column
は、ActiveCellの左上の行、列を指します。
>アクティブセルはB4のままであることです。
は、当たり前のことです。
 
※セルを選択することをやめない限り、こういった錯覚を招きます。
※コードは、インデントをきちんとつける
※セルのValueプロパティを付けたり/つけなかったり・・・一貫性がない。
※可読性を高めることh非常に大事なことです。
 
 

回答
投稿日時: 20/07/05 06:25:08
投稿者: WinArrow
投稿者のウェブサイトに移動

参考までに、
インデントを付けたコード:Sample1

Selectをしないコード:Sample2
を掲示しておきます。
 
Sub Sample1()
    Set sht_2 = Sheets(2)
    i = 39
    Sheets(1).Select
    Range("B4:N36").Select
    For Each Cell9 In Selection
        If Cell9 <> "" Then
            i = i + 1
            Cells(i, 2).Value = i - 64
            Cells(i, 3).Value = Cell9
            row2 = ActiveCell.Row
            col2 = ActiveCell.Column
            Cells(i, 4).Value = sht_2.Cells(row2, col2).Value
        End If
    Next
End Sub
 
Sub Sample2()
    Set sht_2 = Sheets(2)
    i = 39
    With Sheets(1)
        For Each Cell9 In .Range("B4:N36")
            If Cell9 <> "" Then
                i = i + 1
                .Cells(i, 2).Value = i - 64
                .Cells(i, 3).Value = Cell9
                row2 = Cell9.Row
                col2 = Cell9.Column
                .Cells(i, 4).Value = sht_2.Cells(row2, col2).Value
            End If
        Next
    End With
End Sub

投稿日時: 20/07/05 07:02:53
投稿者: rinahana

半平太さん、WinArrowさんありがとうございます。
色々と気を付けるべきマナーなどのご指摘ありがとうございました。全くの素人で済みませんでした。
半平太さんのAddressは、今現在のセル位置を現すのですか?
お陰様でやろうとしていることができました。ありがとうございました。