環境:Excel2013
結合セルの配列化について質問です。
A | B | C | |
---|---|---|---|
1 | 1 | A | あ |
2 | ↑と結合 | B | |
3 | 2 | ↑と結合 | う |
この様な結合セルを配列化した時に、結合セルがブランクにならない様にしたいです。
VBA
1 Dim varList() As Variant 2 3 Cells(1, 1).CurrentRegion.Select 4 varList = Selection
varList の格納値
1 | A | あ |
ブランク | B | ブランク |
2 | ブランク | う |
理想
1 | A | あ |
1 | B | ブランク |
2 | B | う |
セルをループ処理で参照し、MergeAreaの使用することも考えましたが、
処理速度の面から、一括の配列化が出来たらと思っております。
(一括で無くでも、出来るだけセルの参照は減らしたいです)
解決策がありましたら、
御教授いただければ幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
VBA
1Option Explicit 2Sub test() 3Dim varList() As Variant 4 varList = Cells(1, 1).CurrentRegion.Value 5 Dim i As Long, j As Long, Temp As Variant 6 For j = 1 To UBound(varList, 2) 7 For i = 1 To UBound(varList, 1) 8 If IsEmpty(varList(i, j)) Then 9 varList(i, j) = Temp 10 Else 11 Temp = varList(i, j) 12 End If 13 Next i 14 Next j 15End Sub
ではいかが。
投稿2019/12/13 06:02
総合スコア1067
0
解決済ですが、頭の体操で考えてみました。
処理速度の面から、一括の配列化が出来たらと思っております。
(一括で無くでも、出来るだけセルの参照は減らしたいです)
一活 → VBAでループ処理を書かない。
というテーマで書いてみました。
シートのコピーをしてるので、どれくらい時間が掛かるか不明ですが、
高速化が出来ないでしょうか?
時間を測ってもらって、みんなで情報を共有できたら幸いかと思います。
ExcelVBA
1Option Explicit 2 3Sub test002() 4 Dim v() 5 6 v = cnvMeageCellToValue(ActiveSheet.Range("A1").CurrentRegion) 7 8 Stop 9End Sub 10 11Function cnvMeageCellToValue(ByRef Rng As Range) As Variant 12 Const cnsFlag As String = "<空白>" 13 Const cnsBlank As String = "" 14 15 'Application.ScreenUpdating = False 16 17 Rng.Worksheet.Copy 18 With Workbooks(Workbooks.Count).Worksheets(1).Range(Rng.Address) 19 .Replace cnsBlank, cnsFlag 20 .UnMerge 21 On Error Resume Next 22 .SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=R[-1]C" 23 On Error GoTo 0 24 .Replace cnsFlag, cnsBlank 25 cnvMeageCellToValue = .Value 26 .Worksheet.Parent.Close False 27 End With 28 29 'Application.ScreenUpdating = True 30End Function
投稿2019/12/14 02:50
編集2019/12/14 02:51総合スコア2163
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
(一括で無くでも、出来るだけセルの参照は減らしたいです)
解決済みですが、
ttyp03さんのコードは全セルを参照して再代入してるのがちょっと気になります。
ttyp03さんとiruyasさんのコードの折衷案(いいとこどり)のコードを書いてみました。
配列を走査して、空欄(IsEmpty)かつ結合セル(MergeCells)の時のみ代入するようにしてます。
セル参照は空欄セルのみです。
vba
1Sub sample() 2 Dim rng As Range 3 Set rng = Range("A1").CurrentRegion 4 Dim varList() As Variant 5 varList = rng.Value 6 Dim r As Long, c As Long 7 For r = 1 To UBound(varList, 1) 8 For c = 1 To UBound(varList, 2) 9 If IsEmpty(varList(r, c)) Then 10 If rng(r, c).MergeCells Then 11 varList(r, c) = rng(r, c).MergeArea.Item(1).Value 12 End If 13 End If 14 Next c 15 Next r 16End Sub
投稿2019/12/13 10:18
編集2019/12/13 10:23総合スコア34073
0
ベストアンサー
書いてみました。
なるべくセルの状態を気にせずに処理できるコードを目指してみました。
ただデータ量によっては少々遅いかも。
VBA
1Sub sample() 2 Dim varList As Variant 3 Dim r As Range 4 Dim v As Range 5 Set r = Range("A1").CurrentRegion 6 varList = r 7 For Each v In r 8 varList(v.Row, v.Column) = v.MergeArea.Item(1).Text 9 Next 10End Sub
投稿2019/12/13 06:45
総合スコア17000
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/13 06:40