[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『空白セルの選択方法』(ジュンコ)
初心者です。
すみませんが、どなたか優しい方教えてください。
会社でマクロを使用しようと頑張っているのですが、つまずいています。
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
>該当するセルがありませんってエラーが出てしまいます。
それを先に言ってくださいよ。
そのシートが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
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
断片的な話をされても、解決には中々近づけませんよ(無駄な時間が過ぎるだけです)。
何をしたいのか、その仕様を明確にしていただく必要があります。
1.Sheet1とSheet2の初期状態がどうなっているのか 2.それがどうなればいいのか
そのサンプルをアップしてください。
(半平太) 2022/01/29(土) 17:29
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
(ジュンコ) 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
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.