No.2ベストアンサー
- 回答日時:
以下のマクロを標準モジュールに登録してください。
Option Explicit
Public Sub 出休入れ替え()
Dim ws As Worksheet '対象シート(アクティブシート)
Dim wrow As Long '作業行
Dim wcol As Long '作業列
Dim trg_row As Long '2番目の出の行
Dim exch_row As Long '入れ替え行
Dim exch_col As Long '入れ替え列
Dim dcount As Long '出の数
Dim tmp As String '一時保管
Dim exch_count As Long '入れ替え件数
exch_count = 0
Set ws = ActiveSheet
'全列繰り返し
For wcol = 3 To 9
dcount = 0
'全行繰り返し
For wrow = 4 To 14
'出の数をカウントする。同時に2番目の出の行を記憶する
If ws.Cells(wrow, wcol).Value = "出" Then
dcount = dcount + 1
If dcount = 2 Then
trg_row = wrow
End If
End If
Next
'出の数が3なら、入れ替えを行う
If dcount = 3 Then
'入れ替え候補の列を探す
If find_exchange_col(ws, trg_row, exch_row, exch_col) = True Then
tmp = ws.Cells(trg_row, wcol).Value
ws.Cells(trg_row, wcol).Value = ws.Cells(exch_row, exch_col).Value
ws.Cells(exch_row, exch_col).Value = tmp
exch_count = exch_count + 1
End If
End If
Next
MsgBox ("完了 入れ替え件数=" & exch_count)
End Sub
'交換可能な列を探す
Private Function find_exchange_col(ByVal ws As Worksheet, ByVal trg_row As Long, ByRef exch_row As Long, ByRef exch_col As Long) As Boolean
find_exchange_col = False
Dim wrow As Long
Dim wcol As Long
Dim dcount As Long
'全列繰り返す
For wcol = 3 To 9
dcount = 0
'全行繰り返す(出の数をカウント)
For wrow = 4 To 14
If ws.Cells(wrow, wcol).Value = "出" Then
dcount = dcount + 1
End If
Next
'出の数が1なら
If dcount = 1 Then
'2番目の出の行が休なら、その行、列を交換可能行列として採用する
If ws.Cells(trg_row, wcol).Value = "休" Then
exch_row = trg_row
exch_col = wcol
find_exchange_col = True
Exit Function
End If
'2番目の出の行が休でないなら、その先頭の行から、休の値を探し、それを交換可能行列として採用する
For wrow = 4 To 14
If ws.Cells(wrow, wcol).Value = "休" Then
exch_row = wrow
exch_col = wcol
find_exchange_col = True
Exit Function
End If
Next
'それでも休がないなら(通常あり得ないが出が1個、以外が全部昼の場合等)、次の行を処理する
End If
Next
End Function
ありがとうございます。Public SubとPrivate Functionで世界が広がり、値渡し(ByVal)、参照渡し(ByRef)など学ぶことが多いく、ありがたいです。完璧な内容にただただ脱帽です。
No.1
- 回答日時:
上記例で、
「下表の「出」が3回あるD列の真ん中の「出」Cells(7,4)と「出」が1回だけのE列Cells(7,5)を入れ替えてD列、E列とも「出」を2回にしたい。」
ということですが、もし、E列のCells(7,5)が「出」の場合は、どうしますか。(E列の出の数は1回です)
①E列は使えないので、他の列を探す。
②E列の「休」の行と入れ替える。(例 E列のCells(4,5)が「休」なので、そのセルの「休」と入れ替える)
のどちらでしょうか。
ありがとうございます。②でお願いします。
私の知識では単純に入れ替える下記マクロから先に進めません...
Sub Sample()
Dim swap As Range
Set swap = Cells(7,4)
Cells(7,4)= Cells(7,5)
Cells(7,5)= swap
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- Visual Basic(VBA) シフト表のコマで「ブロック」されている前の時間の「出」を同一列の「休」と入れ替えたいがふぇきません。 2 2023/08/02 18:49
- Excel(エクセル) Excel>マクロ>特定のセルで同じ情報が登録されている行を1行にまとめたい(文字連結) 6 2023/01/05 16:30
- Visual Basic(VBA) 正規表現を用いての並び替え 7 2022/04/04 09:27
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 3 2022/06/12 11:17
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
Excelで、あるセルの値に応じて...
-
vba 2つの条件が一致したら...
-
Cellsのかっこの中はどっちが行...
-
VBAのFind関数で結合セルを検索...
-
複数処理 Worksheet_Change(ByV...
-
B列の最終行までA列をオート...
-
IIF関数の使い方
-
VBAで、特定の文字より後を削除...
-
VBAを使って検索したセルをコピ...
-
エクセル 2つの表の並べ替え
-
Changeイベントでの複数セルの...
-
データグリッドビューの一番最...
-
VBAで、離れた複数の列に対して...
-
VBA UserFormからの転記で
-
マクロ 最終列をコピーして最終...
-
VBA 列が空白なら別のマクロへ...
-
複数の列の値を結合して別の列...
-
VBマクロ 色の付いたセルを...
-
VBAの構文 3列置きにコピーし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Worksheets メソッドは失敗しま...
-
B列の最終行までA列をオート...
-
Excelで、あるセルの値に応じて...
-
vba 2つの条件が一致したら...
-
Cellsのかっこの中はどっちが行...
-
VBAを使って検索したセルをコピ...
-
文字列の結合を空白行まで実行
-
VBA指定行削除
-
VBAのFind関数で結合セルを検索...
-
IIF関数の使い方
-
VBA 何かしら文字が入っていたら
-
マクロ 最終列をコピーして最終...
-
エクセルについて
-
【VBA】2つのシートの値を比較...
-
URLのリンク切れをマクロを使っ...
-
データグリッドビューの一番最...
-
Changeイベントでの複数セルの...
-
空白セルをとばして転記
-
rowsとcolsの意味
-
エクセルVBAにて =A1=B1とすれ...
おすすめ情報