[[20220129144835]] 『空白セルの選択方法』(ジュンコ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『空白セルの選択方法』(ジュンコ)

初心者です。
すみませんが、どなたか優しい方教えてください。
会社でマクロを使用しようと頑張っているのですが、つまずいています。

A1:A10の間に空白セルがあるか検索し、あればそのセルを選択したいです。
下記のような記述をしたのですが。。。

Dim a As Range

Set a = Range("A1:A10").SpecialCells(xlCellTypeBlanks)

A1:A10の全部セルが空白なのに、A1セルを選択してくれません。

どうしてでしょうか?

< 使用 Excel:Excel2019、使用 OS:Windows10 >


 セルを指定しただけで、指定したセルを選択する
 コードが記述されてません。

 ところで、セルを選択した後どうするのですか?
 たいていはセルを選択しなくても指定したセル
 に対する処理を実行できます。
(通りすがり) 2022/01/29(土) 15:01

 Set a = Range("A1:A10").SpecialCells(xlCellTypeBlanks)

 a.Select '←aの範囲を選択する

(半平太) 2022/01/29(土) 15:12


回答ありがとうございます。
a.selectは、知っているんですが、
該当するセルがありませんってエラーが出てしまいます。
何故でしょうか?
(ケイコ) 2022/01/29(土) 15:17

 >該当するセルがありませんってエラーが出てしまいます。

 それを先に言ってくださいよ。

 そのシートが1度も使われたことがないからです。
 無理やり使ったらどうですか?

 Sub test()
     Dim a As Range

     If ActiveSheet.UsedRange.Row <= 10 Then
         Cells(11, "A") = "Dummy"
         Cells(11, "A") = Empty
     End If

     Set a = Range("A1:A10").SpecialCells(xlCellTypeBlanks)
     a.Select
 End Sub

(半平太) 2022/01/29(土) 15:20


半平太さん。回答ありがとうございます。
記述してくれたものでしたら、A1からA10セルの間で、空白セルを探してくれるんですか?
もし、A1が空白セルだったら、A1セルを選択。
もし、A1セルが埋まっていたら、A2セルを選択するみたいな。
(ジュンコ) 2022/01/29(土) 15:54

初心者なので、汚い記述ですみませんが、
この記述で実行すると、いずれA12までセルが埋まると、
Set d = Range("A1:A12").SpecialCells(xlCellTypeBlanks)で該当するセルがありませんってエラーがでます。希望としては、A1からA12までのセルが埋まったら、B1からB12セルに移動してほしいのに。
それから、Cへ

Sub Macro1()

Dim x, y As String

x = "Sheet1"
y = "Sheet2"

Worksheets(y).Select
Range("A1").Select

sub1:

Dim a, b, c As String

a = ActiveCell.Value
b = ActiveCell.Offset(0, 1).Value
c = ActiveCell.Offset(0, 2).Value

Stop

Sheets(x).Select

Dim d As Range

Set d = Range("A1:A12").SpecialCells(xlCellTypeBlanks)

If d Is Nothing Then

GoTo sub2

End If

d.Select

ActiveCell.Value = a
ActiveCell.Offset(1, 0).Value = b
ActiveCell.Offset(2, 0).Value = c

sub10:

Worksheets(y).Select

ActiveCell.Offset(1, 0).Select

If ActiveCell = "" Then

GoTo sub10

Else

GoTo sub1

End If

sub2:

Dim e As Range

Set e = Range("B1:B12").SpecialCells(xlCellTypeBlanks)

If e Is Nothing Then

GoTo sub4

End If

e.Select

ActiveCell.Value = a
ActiveCell.Offset(1, 0).Value = b
ActiveCell.Offset(2, 0).Value = c

GoTo sub10

sub4:
Dim g As Range

Set g = Range("C1:C12").SpecialCells(xlCellTypeBlanks)

If g Is Nothing Then

GoTo sub100

End If

g.Select

ActiveCell.Value = a
ActiveCell.Offset(1, 0).Value = b
ActiveCell.Offset(2, 0).Value = c

GoTo sub10

sub100:

End Sub
(ジュンコ) 2022/01/29(土) 16:05


似たような質問がありますので、参考に。
[[20220128180229]]
(参考) 2022/01/29(土) 16:24

 断片的な話をされても、解決には中々近づけませんよ(無駄な時間が過ぎるだけです)。

 何をしたいのか、その仕様を明確にしていただく必要があります。

 1.Sheet1とSheet2の初期状態がどうなっているのか
 2.それがどうなればいいのか

 そのサンプルをアップしてください。

(半平太) 2022/01/29(土) 17:29


半平太さん。すみません。
Sheet1には、A1セルに名前、A2セルに日付、A3セルに数字。
そして、A4セルに名前と同じ順番で、A12セルまであります。
また、C列、D列にも同じ順番にあります。
Sheet2には、A1セルに名前、B1セルに日付、C1セルに数字が入っていて、
それらがA15まで入っています。それらを、Sheet1の空白セルになっているB1セル、
B2セル、B3セルに入れ込みたいです。

Sheet1は、縦列フォーマットになっていて、Sheet2は、横列フォーマットなんですよ。
 お手数かけて、すみません。
宜しくお願いします。
(ジュンコ) 2022/01/29(土) 18:02


 初期状態と希望する結果がわかりません。
 全部空白なのか、一部空白なのか(飛び飛びに空白なのか)?

 何故空白にこだわる必要があるのかが伝わってこないです。?

 ご説明からは、こんなものしか思いつかないです。

 <Sheet1>           <Sheet2>
 行  __A__  _B_  _C_     行  ___A___  ___B___  ___C___
  1  名前1                     1  名前1    日付1    数字1  
  2  日付1                     2  名前2    日付2    数字2  
  3  数字1                     3  名前3    日付3    数字3  
  4  名前2                     4  名前4    日付4    数字4  
  5  日付2                     5  名前5    日付5    数字5  
  6  数字2                     6  名前6    日付6    数字6  
  7  名前3                     7  名前7    日付7    数字7  
  8  日付3                     8  名前8    日付8    数字8  
  9  数字3                     9  名前9    日付9    数字9  
 10  名前4                    10  名前10   日付10   数字10 
 11  日付4                    11  名前11   日付11   数字11 
 12  数字4                    12  名前12   日付12   数字12 
                              13  名前13   日付13   数字13 
                              14  名前14   日付14   数字14 
                              15  名前15   日付15   数字15 

 もう一度お聞きします。
 「初期状態」と「希望する結果」を上の様な図の形で示してください。

(半平太) 2022/01/29(土) 18:34


  <Sheet1>                   <Sheet2> 
  行__A__  _B_  _C_  _D_   行___A___  ___B___  ___C___
  1  名前        名前           1  鈴木1    1/28       1  
  2  日付        日付           2  鈴木2    1/28       2  
  3  数字        数字           3  鈴木3    1/28       3  
  4  名前        名前           4  鈴木4    1/28       4  
  5  日付        日付           5  鈴木5    1/29       5  
  6  数字        数字           6  鈴木6    1/29       6  
  7  名前        名前           7  鈴木7    1/29       7  
  8  日付        日付           8  鈴木8    1/29       8  
  9  数字        数字           9  鈴木9    1/29       9  
 10  名前        名前          10  鈴木10   1/29       1 
 11  日付        日付          11  鈴木11   1/29       2 
 12  数字        数字          12  鈴木12   1/30       2 
                               13  鈴木13   1/30       3 
                               14  鈴木14   1/30       4 
                               15  鈴木15   1/30       5 

初期は、上記のようになっています。
これを下記のようにしたいです。

<Sheet1>  <Sheet2> 

  行__A__  _B_   _C_  _D_         行___A___  ___B___  ___C___
  1  名前  鈴木1  名前   鈴木5        1  鈴木1    1/28       1  
  2  日付  1/28   日付   1/29         2  鈴木2    1/28       2  
  3  数字   1     数字   5            3  鈴木3    1/28       3  
  4  名前  鈴木2  名前   鈴木6        4  鈴木4    1/28       4  
  5  日付  1/28   日付   1/29         5  鈴木5    1/29       5  
  6  数字   2     数字   6            6  鈴木6    1/29       6  
  7  名前  鈴木3  名前   鈴木7        7  鈴木7    1/29       7  
  8  日付  1/28   日付   1/29         8  鈴木8    1/29       8  
  9  数字   3     数字   7            9  鈴木9    1/29       9  
 10  名前  鈴木4  名前   鈴木8       10  鈴木10   1/29       1 
 11  日付  1/28   日付   1/29        11  鈴木11   1/29       2 
 12  数字   4     数字   8           12  鈴木12   1/30       2 
                                     13  鈴木13   1/30       3 
                                     14  鈴木14   1/30       4 
                                     15  鈴木15   1/30       5 

(ジュンコ) 2022/01/29(土) 19:08


 冷やかしですけど、
 その例では、半平太さんの質問に真摯に答えたとは思いにくいですよ。
 今回の質問のキモは空白セルですよね?
 上記例では空白を調べる必要は全くないです。
 回答者が知りたいのは、例えば下記B列の様に、
 「名前、日付、数字」のブロックごと空白になっているところに、
 Sheet2のリストから前から順に転記したい、であるとか、
 D列の様に、名前だけ記入されているところに、対応するデータを転記したいだとか、
 そういう具体例だと思いますよ。

 <Sheet1>
   行__A__  _B_   _C_  _D_ 
  1  名前         名前   鈴木1   
  2  日付         日付    
  3  数字         数字        
  4  名前  佐藤1  名前   鈴木2    
  5  日付  1/28   日付     
  6  数字  1      数字        
  7  名前         名前   鈴木3  
  8  日付         日付     
  9  数字         数字         
 10  名前  佐藤2  名前   鈴木4   
 11  日付  1/29   日付    
 12  数字  2      数字   

 提示例を叶えるだけなら、下記マクロでも良いわけですよね。
 Sub Macro1()
    Dim i As Long, r As Long, c As Long
    Dim ws1 As Worksheet, ws2 As Worksheet
    Set ws1 = Worksheets("Sheet1")
    Set ws2 = Worksheets("Sheet2")
    c = 2
    For i = 1 To ws2.Cells(Rows.Count, 1).End(xlUp).Row
        r = ws1.Cells(Rows.Count, c).End(xlUp).Row
        Select Case r
            Case 1
                r = 1
            Case 12
                r = 1
                c = c + 2
            Case Else
                r = r + 1
        End Select
        ws2.Cells(i, 1).Resize(, 3).Copy
        ws1.Cells(r, c).PasteSpecial Transpose:=True
    Next i
 End Sub
(参考) 2022/01/29(土) 20:12

 なるほどです。ようやく分かりました。

 Sub Macro1()
     Dim Ws1 As Worksheet
     Dim Ws2 As Worksheet
     Dim rSource As Range
     Dim rToWrite As Range
     Dim aRow As Range  'Ws2の元データ範囲の一つの行を格納

     Set Ws1 = Worksheets("Sheet1")
     Set Ws2 = Worksheets("Sheet2")

     Set rSource = Ws2.Range("A1:C15") '元データ範囲
     Set rToWrite = Ws1.Range("B1") '第一回書き込み先(先頭セル)

     For Each aRow In rSource.Rows '1行ずつ取り出す

         '行列を入替えてコピペ
         aRow.Copy
         rToWrite.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Transpose:=True

         '次の書き込み先をセットする
         If rToWrite.Row + 3 <= 12 Then  '下限まで余裕あり
             Set rToWrite = rToWrite.Offset(3) '3行下に移動
         Else                            '先頭行に戻って、2列右隣から書き始める必要がある
             Set rToWrite = Ws1.Cells(1, rToWrite.Column + 2)
         End If
     Next
 End Sub

 <Sheet1 シート 実行後結果図>
 行 __A__ __B__ __C__ __D__ _E_ ___F___ _G_ ___H___
  1 名前  鈴木1 名前  鈴木5     鈴木9       鈴木13 
  2 日付   1/28 日付   1/29        1/29        1/30
  3 数字      1 数字      5           9           3
  4 名前  鈴木2 名前  鈴木6     鈴木10      鈴木14 
  5 日付   1/28 日付   1/29        1/29        1/30
  6 数字      2 数字      6           1           4
  7 名前  鈴木3 名前  鈴木7     鈴木11      鈴木15 
  8 日付   1/28 日付   1/29        1/29        1/30
  9 数字      3 数字      7           2           5
 10 名前  鈴木4 名前  鈴木8     鈴木12             
 11 日付   1/28 日付   1/29        1/30            
 12 数字      4 数字      8           2            

(半平太) 2022/01/29(土) 20:45


すごく難しい記述なんで、絶対に初心者の私にはわかりませんでした。
教えて下さり、誠にありがとうございます。
厚かましいですが、質問させてください。
例えば、Sheet1のA15までになった場合は、
どの記述を変更すれば、いいのでしょうか?
また、例えばですが、Sheet2が名前、日付、数字、内容
Sheet1も、名前、日付、数字、内容の4項目になった場合は、
どの記述を変更すれば、いいのでしょうか?
勉強しますので、教えて頂きたいです。
宜しくお願いします。

(ジュンコ) 2022/01/29(土) 21:20


 >例えば、Sheet1のA15までになった場合は、

 >        '次の書き込み先をセットする
 >        If rToWrite.Row + 3 <= 12 Then  '下限まで余裕あり
                                  ↓
          If rToWrite.Row + 3 <= 15 Then  '下限まで余裕あり

 >また、例えばですが、Sheet2が名前、日付、数字、内容
 >Sheet1も、名前、日付、数字、内容の4項目になった場合は、

 >  Set rSource = Ws2.Range("A1:C15") '元データ範囲
                 ↓
     Set rSource = Ws2.Range("A1:D15") '元データ範囲

 >  Set rToWrite = rToWrite.Offset(3) '3行下に移動
                  ↓
     Set rToWrite = rToWrite.Offset(4) '4行下に移動

(半平太) 2022/01/29(土) 21:46


勉強になりました。本当にありがとうございました😭
(ジュンコ) 2022/01/30(日) 08:50

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.