- ベストアンサー
VBAによるEXCELセルの値の移動方法
- VBAを使用してEXCELのセルの値を移動させる方法を教えてください。具体的には、(1)のセル集合を(2)のセル集合に移動したい場合の方法を知りたいです。
- 移動後のセル配置では、(2)のセル集合が(1)のセル集合と結合された形で表示されます。また、セル列Rを越える値は切り捨てるようにしたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 >移動先の行に全く何も入力されていない空白があると… なんか(いろいろと)変なことしてましたね。 すみません。修正しました。 >何行目までとかも指定はできますか? 下記コードで999となっている部分を書き換えてください。 なお、#1のコードで「9」を直接埋め込んでましたが、 それだとああいう書き方をした意味がありませんでした。 その辺も直しました。 もし遅すぎるようでしたらまた直しますので補足してください。 '---------------↓ ココカラ ↓--------------- Sub Sample0906112() Dim myRng1 As Range Dim myRng2 As Range Dim i As Long Dim j As Long Dim k As Long Set myRng1 = Range("A:I") 'A:I列を移す Set myRng2 = Range("J:R") 'J:R列に移す For i = 1 To 999 '1行目から999行目まで For j = myRng2.Columns.Count To 1 Step -1 If myRng2(i, j).Value <> "" Then Exit For Next j j = j + 1 For k = 1 To myRng1.Columns.Count If j > myRng2.Columns.Count Then Exit For If myRng1(i, k).Value <> "" Then myRng2(i, j).Value = myRng1(i, k).Value j = j + 1 End If Next k myRng1.Rows(i).ClearContents Next i End Sub '---------------↑ ココマデ ↑---------------
その他の回答 (3)
- hige_082
- ベストアンサー率50% (379/747)
一例です Sub test() Dim i As Long, ii As Long '----------------------------------------- ii = 100 '←処理最終行を指定指定してください '----------------------------------------- For i = 1 To ii If Range("s" & i).End(xlToLeft).Column < 10 Then Cells(i, 1).Resize(1, 9).Copy Range("j" & i).Resize(1, 9) Else Cells(i, 1).Resize(1, 9).Copy Range("s" & i).End(xlToLeft).Offset(, 1).Resize(1, 9) End If Next i Columns("S:AA").ClearContents If WorksheetFunction.CountBlank(Range("J1:R" & ii)) = 0 Then Exit Sub Range("J1:R" & ii).SpecialCells(xlCellTypeBlanks).Delete Shift:=xlToLeft End Sub 参考まで
お礼
ご親切にありがとうございます。こちらも試して勉強させていただきます。
- fujillin
- ベストアンサー率61% (1594/2576)
単純に左から見て行って、値が空白でなければコピーしてあげればよいだけではないのかな。(意味が違っていたら無視願います) こんな感じ?(あとは適当に修正してください) Sub test() Dim rw As Long, col As Long, ctmp As Long For rw = 1 To 6 ctmp = Cells(rw, Columns.Count).End(xlToLeft).Column + 1 If ctmp < 10 Then ctmp = 10 For col = 1 To 9 If Cells(rw, col).Value <> "" Then Cells(rw, ctmp).Value = Cells(rw, col).Value ctmp = ctmp + 1 End If Next col Next rw End Sub
お礼
ご親切にありがとうございます。こちらも試して勉強させていただきます。
- _Kyle
- ベストアンサー率78% (109/139)
とりあえずこんな感じでいかがでしょうか。 ●動作の概要 1行目から(A列の)最終行までの各行について、 A:I列の値をJ:R列のデータの後方に順序を維持して移動する。 ・J:R列のデータはそのまま維持する ・A:I列について空白がある場合は無視する ・S列以降は使用しない '---------------↓ ココカラ ↓--------------- Sub Sample090611() Dim myAry1 As Variant Dim myAry2 As Variant Dim i As Long Dim j As Long Dim k As Long For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row myAry1 = Range("A:I").Rows(i).Value Range("A:I").Rows(i).ClearContents myAry2 = Range("J:R").Rows(i).Value For j = 9 To 1 Step -1 If myAry2(1, j) <> "" Then j = j + 1 Exit For End If Next j For k = 1 To 9 If myAry1(1, k) <> "" Then myAry2(1, j) = myAry1(1, k) If j = 9 Then Exit For Else j = j + 1 End If End If Next k Range("J:R").Rows(i).Value = myAry2 Next i End Sub '---------------↑ ココマデ ↑--------------- Excel2003で動作確認。
補足
ありがとうございます。移動元、移動先の行に全く何も入力されていない空白があるとその下の行からは移動しないので『インデックスが有効な範囲にありません』と表示しますが、移動元、移動先の行が空白でも移動可能に出来ますか?後、1行目から(A列の)最終行まででなくて何行目までとかも指定はできますか?もし可能でしたらお教えいただきたいのです。ご無理を言いますがよろしくお願いいたします。
お礼
ありがとうございました!!私が思っていた通りに動作しました。初心者の私には全く思いつきようのないマクロです。本当にありがとうございました。