質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

2649閲覧

VBA Excel 連続していない行を複数行選択し、書式を変更したい

takamak

総合スコア7

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2020/07/27 05:39

編集2020/07/27 05:42

【やりたいこと】
連続してない行を複数行選択し、一括で書式を変更したい

【詳細】
画像のようなテンプレートファイルを開き、accessで作成したデータを貼り付け
体裁を整えて別名にして保存するという処理で5ファイルほど同じように作成しています。

画像の4行までが書式のコピー元になる行です。
A列を配列(Arr)に格納し、For~Nextで該当する書式によって
同じ書式にしたい行をunionで配列(FormatCopy)に格納していき
最後に書式を貼り付けするという処理を行っています。

【エラー内容】
1ファイル目は問題なく作成(保存)されますが、2ファイル目の一番最初の
「Set FormatCopy(1) = Union(FormatCopy(1), .Cells(i, "A"))」でエラーになります。
<実行時エラー '1004':
'Union'メソッドは失敗しました。 '_Global'オブジェクト>

イミディエイトウィンドウで各変数を確認すると下記のようになっています。
FormatCopy(1) → A
.Cells(i, "A") → A
また、実行すると
<実行時エラー '1004':
アプリケーション定義またはオブジェクト定義のエラーです。>

【参考にしたURL】
参考にしたURL
findだと遅かったため配列にしました。

【環境】
win7 64bit office2010
イメージ説明

Function Change_Format(ByRef xlApp As Excel.Application, ByRef ws As Excel.Worksheet) As Boolean Dim Arr As Variant Dim i As Long Dim FormatCopy(1 To 4) As Variant With ws Arr = .Range("A1:A" & .Cells(.Rows.Count, 1).End(xlUp).Row) For i = 1 To 4 Set FormatCopy(i) = .Cells(i, "A") Next i For i = 7 To UBound(Arr) DoEvents Select Case Arr(i, 1) Case "A" Set FormatCopy(1) = Union(FormatCopy(1), .Cells(i, "A")) Case "B" Set FormatCopy(2) = Union(FormatCopy(2), .Cells(i, "A")) Case "C" Set FormatCopy(3) = Union(FormatCopy(3), .Cells(i, "A")) Case "D" Set FormatCopy(4) = Union(FormatCopy(4), .Cells(i, "A")) End Select Next i '書式を貼り付け For i = 1 To 4 .Rows(i).Copy FormatCopy(i).EntireRow.PasteSpecial (xlPasteFormats) Next i End With End Function

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

外してたらすみません。

下記のYouTubeの動画解説(Office Tanakaさん)で、
VBAのオートフィルターを使用して、A列などから特定の項目を絞り込んで
書式を一括して変更する、という例題を解説しています。

・【VBA】セルのOffsetプロパティとResizeプロパティを自在に使えるようになったら、
実務レベルのマクロでも困らない
https://www.youtube.com/watch?v=cbD1r2oojEk&t=7s

ちょっと長い動画なのですが、14分目あたりから再生して
オートフィルターの解説が参考になるかチェックしてみてはいかがでしょうか?

投稿2020/07/27 06:04

autumn_nsn

総合スコア335

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takamak

2020/07/27 06:41

autumn_nsnさん ご回答ありがとうございます! 外してないです!!! 14分からの動画とても参考になりました。 今から作り直してみてまたご報告いたします。
takamak

2020/07/27 08:19

autumn_nsnさん 色々試してみました。 先ほどご回答いただきましたmattuwanさんへのご返事と同様に 実際は200列ほどあり、途中に空白列も存在します。 また、ところどろこグループ化もされているため、行ごとコピーして 行ごと貼り付けが望ましいのですが、それができませんでした。 A6セルに"書式"という文字を追加し下記のコードで実行しました。 Dim CopyArea As Range Range("A6").AutoFilter 1, "A" Set CopyArea = Range("A6").CurrentRegion.Offset(1, 0) ws.Rows(1).Copy CopyArea.Resize(CopyArea.Rows.Count - 1).EntireRow.PasteSpecial (xlPasteFormats) Range("A6").AutoFilter グループ化されている列がコピーされず、書式を貼り付けたときに歯抜けのような状態になってしまったり グループ化をいったんすべて展開(手動で)してからコピペしてみたところ、オートフィルタが解除してしまったり・・・ 苦戦しております。
guest

0

自己解決

autumn_nsnさん
mattuwanさん

貴重なヒントをくださりありがとうございました。
試行錯誤しエラーが出ずに実行できるようになりました。

今回実施したことをきちんと記載させていただきます。

<やりたいこと>
テンプレートファイルを開き、ACCESSで作成したデータを貼り付け、
A列の書式に該当する1~3行の行をコピーし一括で貼り付ける。
※わかりやすくするために、フォーマットの画像のA7~C16に文字が入力されていますがデータを貼り付ける前は何も入力されていません。

(補足)
・A7セル以降の書式はデータの最後まで必ず何かしらの文字が入っています
・書式をコピーした後に違う書式との間の罫線などは、後続処理で行っています

<今回苦戦したこと>
・unionで該当行のアドレスを結合し、一気に貼り付けを行ったところ 1ファイルは正しく作成されたが
2ファイル目作成時の最初のunionのところで"'Union'メソッドは失敗しました。 '_Global'オブジェクト"になってしまった。(最初のソース)
・CurrentRegionでは空白列/行があるとそれ以降が対象外となってしまったため使用できなかった
・グループ化されていると 複数行を一気に貼り付けるときにエラーとなった

ものすごく苦戦しましたが来上がってみれば貼り付けの処理自体は3行程度で済みました(^^;)

イメージ説明
イメージ説明
イメージ説明

Function Main(ByRef xlApp As Excel.Application, ByRef ws As Excel.Worksheet)  With ws  'フィルタが設定されている場合はいったん解除  If .AutoFilterMode = True Then .Rows(18).AutoFilter  '書式(行)コピーが正しく実行されないので、グループ化をすべて展開  .Outline.ShowLevels ColumnLevels:=3  Call RowPaste(xlApp, ws, "A", 6, 1)  Call RowPaste(xlApp, ws, "B", 6, 2)  Call RowPaste(xlApp, ws, "C", 6, 3)  .Rows(18).AutoFilter 'フィルタ解除  .Outline.ShowLevels ColumnLevels:=1 'グループ化の省略  End With End Function Function RowPaste(ByRef xlApp As Excel.Application, ByRef ws As Excel.Worksheet, ByVal FindString As String, ByVal FindRow As Integer, ByVal CopyRow As Integer)  With ws   'オートフィルタ実行   .Rows(FindRow).AutoFilter 1, FindString   'フィルタの結果がない場合もあるのでIF文で判定   If .Cells(.Rows.Count, 1).End(xlUp).Row <> FindRow Then    .Rows(CopyRow).Copy    'フィルタの結果が、フィルタ行の次の行の1件しかない場合にエラーになるための回避処理    If FindRow + 1 = .Cells(.Rows.Count, 1).End(xlUp).Row Then     .Rows(FindRow + 1).SpecialCells(xlCellTypeVisible).EntireRow.PasteSpecial (xlPasteFormats)    Else     .Range(.Range("A" & FindRow + 1), .Cells(.Rows.Count, 1).End(xlUp)).SpecialCells(xlCellTypeVisible).EntireRow.PasteSpecial (xlPasteFormats)    End If   End If  End With End Function

投稿2020/07/28 10:30

takamak

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

空白セルだと簡単に複数を検索できるので、
一旦、空白にして検索し書式を貼り付けてみました。
参考になれば。

VBA

1Option Explicit 2 3Sub test() 4 Dim rngFormat As Excel.Range 5 Dim rngData As Excel.Range 6 7 With Excel.Application.Workbooks(1).Worksheets(1) 8 Set rngFormat = .Range("A1").CurrentRegion.Resize(, 11) 9 Set rngData = .Range("A7").CurrentRegion 10 End With 11 12 CopyFormat rngFormat, rngData 13End Sub 14 15Function CopyFormat(ByRef rngFormat As Excel.Range, _ 16 ByRef rngData As Excel.Range) As Boolean 17 Dim r As Range 18 Dim sKey As String 19 20 CopyFormat = True 21 22 For Each r In rngFormat.Rows 23 sKey = r.Cells(1).Value 24 25 With rngData 26 .Replace sKey, "" 27 r.Copy 28 On Error GoTo ErrHandler 29 With .SpecialCells(xlCellTypeBlanks) 30 .PasteSpecial xlPasteFormats 31 .Value = sKey 32 End With 33 On Error GoTo 0 34 End With 35 Next 36 Exit Function 37 38ErrHandler: 39 CopyFormat = False 40 Resume Next 41End Function

修正しました。

ExcelVBA

1Option Explicit 2 3Sub test() 4 Dim rngFormat As Range 5 Dim rngData As Range 6 7 With Worksheets(1) 8 Set rngFormat = .Range("A1").CurrentRegion.Resize(, 200) 9 Set rngData = .Range("A7").CurrentRegion 10 End With 11 12 CopyFormat rngFormat, rngData 13End Sub 14 15Function CopyFormat(ByRef rngFormat As Range, _ 16 ByRef rngData As Range) As Boolean 17 Dim r As Range 18 Dim sKey As String 19 20 CopyFormat = True 21 22 For Each r In rngFormat.Rows 23 sKey = r.Cells(1).Value 24 25 With rngData.Columns(1) 26 .Replace sKey, "" 27 r.Copy 28 On Error GoTo ErrHandler 29 With .SpecialCells(xlCellTypeBlanks) 30 Intersect(.EntireRow, rngFormat.EntireColumn).PasteSpecial xlPasteFormats 31 .Value = sKey 32 End With 33 On Error GoTo 0 34 End With 35 Next 36 Exit Function 37 38ErrHandler: 39 CopyFormat = False 40 Resume Next 41End Function

オートフィルターでやってみました。

ExcelVBA

1Sub SetTableShaping(ByRef ws As Worksheet) 2 Dim rngfromat As Range 3 Dim rngTable As Range 4 Dim r As Range 5 6 With ws 7 Set rngfromat = .Range("A1:AH3") 8 Set rngTable = .Range(.Range("A7"), .Cells(.Rows.Count, "A").End(xlUp)) _ 9 .Resize(, rngfromat.Columns.Count) 10 End With 11 12 ws.Outline.ShowLevels ColumnLevels:=3 13 For Each r In rngfromat.Rows 14 Copy2Format r, rngTable 15 Next 16 ws.Outline.ShowLevels ColumnLevels:=1 17End Sub 18 19Private Sub Copy2Format(ByRef prngformat As Range, ByRef prngTable As Range) 20 With prngTable 21 .AutoFilter 1, prngformat.Cells(1).Value 22 23 If .Columns(1).SpecialCells(xlCellTypeVisible).Count > 1 Then 24 prngformat.Copy 25 Intersect(.Cells, .Offset(1)).PasteSpecial xlPasteFormats 26 End With 27 28 .AutoFilter 29 End With 30End Sub

小計行と合計行に色を付けるのがテーマなら、
ABCをあえて入力しなくても、
他のやり方もありそうですが、
もう、おなかいっぱいでしょうね。

投稿2020/07/27 07:48

編集2020/07/29 02:32
mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takamak

2020/07/27 08:09

mattuwanさん ご回答ありがとうございます。 早速試してみました。 が、説明不足で申し訳ございません。 画像はサンプルのためシンプルにしましたが、実際は200列ほどあり 途中に空白列も存在します。 また、ところどろこグループ化もされているため、 行ごとコピーして 行ごと貼り付けが望ましいのですが、それができません。 CurrentRegionでは 空白行や空白列がある場合 難しいですよね??
mattuwan

2020/07/28 00:19

>CurrentRegionでは 空白行や空白列がある場合 難しいですよね?? んー今回の件の場合は、結局「1列目」が判断の対象になるので、 1列目に空白セルがなければ、特に問題にならないでしょう。 >また、ところどろこグループ化もされているため、 グループ化とコピペとがどう影響するのか、 実際のシートで試さないと何とも言えませんが、 直感的には特に関係ないかと思ってます。 提示のコードは少し雑でしたので、も少し丁寧に書いて追記してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問