VBAによるEXCELセルの値の移動方法

このQ&Aのポイント
  • VBAを使用してEXCELのセルの値を移動させる方法を教えてください。具体的には、(1)のセル集合を(2)のセル集合に移動したい場合の方法を知りたいです。
  • 移動後のセル配置では、(2)のセル集合が(1)のセル集合と結合された形で表示されます。また、セル列Rを越える値は切り捨てるようにしたいです。
回答を見る
  • ベストアンサー

VBAにてセルの値を移動させる方法を教えてください。

VBAを使用しEXCELのセルの値を移動させたいのですが、たとえば下記のように●と▲で構成された同じワークシート内のセルの集合に対し(1)の集合を(2)の集合を維持したまま(2)に移動させたいのです。      (1)            (2) ABCDEFGHI    JKLMNOPQR 1▲●           ● 2●            ▲● 3▲ ●          ▲▲● 4●●●●         ●● 5▲▲▲●●        ●▲ 6▲●           ●●▲ 移動後     (2)((1)+(2)) JKLMNOPQR 1●▲● 2▲●● 3▲▲●▲● 4●●●●●● 5●▲▲▲▲●● 6●●▲▲● (1)の異動元のB3の空白は移動後には左に詰めるようにし、移動後の内容でセル列Rを越える値は切り捨てるようにもしたいのです。こんな形でのマクロをご教授いただきたいのですが、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • _Kyle
  • ベストアンサー率78% (109/139)
回答No.3

#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 '---------------↑ ココマデ ↑---------------

FUKUYAMA28
質問者

お礼

ありがとうございました!!私が思っていた通りに動作しました。初心者の私には全く思いつきようのないマクロです。本当にありがとうございました。

その他の回答 (3)

  • hige_082
  • ベストアンサー率50% (379/747)
回答No.4

一例です 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 参考まで

FUKUYAMA28
質問者

お礼

ご親切にありがとうございます。こちらも試して勉強させていただきます。

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

単純に左から見て行って、値が空白でなければコピーしてあげればよいだけではないのかな。(意味が違っていたら無視願います) こんな感じ?(あとは適当に修正してください) 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

FUKUYAMA28
質問者

お礼

ご親切にありがとうございます。こちらも試して勉強させていただきます。

  • _Kyle
  • ベストアンサー率78% (109/139)
回答No.1

とりあえずこんな感じでいかがでしょうか。 ●動作の概要  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で動作確認。

FUKUYAMA28
質問者

補足

ありがとうございます。移動元、移動先の行に全く何も入力されていない空白があるとその下の行からは移動しないので『インデックスが有効な範囲にありません』と表示しますが、移動元、移動先の行が空白でも移動可能に出来ますか?後、1行目から(A列の)最終行まででなくて何行目までとかも指定はできますか?もし可能でしたらお教えいただきたいのです。ご無理を言いますがよろしくお願いいたします。

関連するQ&A

  • VBAでセルの移動方法

     エクセルのVBAでセルが何処にあっても、その行の一番左端の列に移動するようにしたいのですが(行は変えずに列だけ)、どうすれば良いのでしょうか?  Selection.End(xlToLeft).Select と打ってみたのですが、一番左まで行かず、途中の空白行等で止まってしまう事があります。  どなたか教えて頂けませんか。

  • VBA 固定セルから可変セルへのハイパーリンク

    VBA、マクロの記述方法を教えてください ハイパーリンク元:ワークシート1のA1セル ハイパーリンク先:ワークシート2のcells(リンク先セルの行番号,リンク先セルの列番号) リンク先セルの行番号、リンク先セルの列番号はいずれもINTEGERの変数名、でハイパーリンクを張ろうとする時点(段階)でマクロによって値が定義(付与)されているもの、とします

  • エクセルでの値の自動代入

    エクセルでワークシートのセルからでもユーザーフォームからでもいいのですが、違うワークシート上の表(列が項目、行が日付)の当日日付のセルにマクロで作ったボタンを押すと値が挿入されるような方法はありますか? アクセスで値の代入のようにできればいいのですが。 マクロでもVBAでもいいのですが、できる方法はあるでしょうか?

  • カンマで区切られた二つの数値を分けてセルにコピー

    XPのOffice2003のエクセルです。ある二つの数値が文字列として一つのセルに例えば「375, 934」という風に、半角カンマと空白で区切られて入っています。これを二つのセルに数字「375」「934」と分けてコピーしたいのです。 ワークシートのセルで数式処理、あるいはVBAマクロのどちらかで、できる方法を教えていただけないでしょうか。

  • VBA セルの値を別セルにコピーするには

    VBAでPastespecialでセルの値を別セルにコピーするマクロを組みたいです。 以下は参考にしたソースコードです。 Worksheets("Sheet1").Range("A1:B10").Copy Worksheets("Sheet2").Range("A1").PasteSpecial _                  Paste:=xlPasteValues, _                  Operation:=xlNone, _                  SkipBlanks:=False, _                  Transpose:=False あるExcelマクロの入力フォームSheetに、製品リストと使用している場所のマスタデータをクエリで読み込んで、製品IDと場所のコードを入力したらINDEX関数で抽出し、マクロ実行ボタンを押すと抽出結果を入力フォームの入力欄に貼り付けします。 上記のマクロだと貼り付けする元セルを移動させたら内容がずれた値がそのまま貼り付けされてしまうと思われますが、地道にコードのコピー元のセルを書き直さないといけないのでしょうか。 Excelの関数だと参照範囲を固定したら掴んで移動させてもセル番地が連動して移動してくれますが、マクロの場合どのようにすれば良いでしょうか。 また、複数個所のセルをコピーするので Paste:=xlPasteValues, _ Operation:=xlNone, _ SkipBlanks:=False, _ Transpose:=False をコピーするセルの箇所に毎回入れていますが、コピー元のセル・コピー先のセル番地を一括して実行する方法はありますでしょうか。 VBAはソースコードを参考に当てはめているだけで、自力でコードを書くスキルは皆無です。 Excelは2016です。 詳しい方いましたらご教授ください。よろしくお願い致します。

  • エクセルでVBA起動とともにセルの移動

    セルがどこにいてもユーザーホームを起動したら、最初いた行の左から3番目(C列)にセルが移動するVBAを教えて下さい。よろしくお願いします。

  • [マクロ]値に変換しても、空白のセルがカウントされてしまいます。

    式が入っているセルを値に変換し、値が入ってるセルだけをカウントさせたいのですが、もともと式が入っていた空白になっているセルもカウントしてしまいます。 値の変換の仕方が間違っているのでしょうか? それともカウントの仕方が良くないのでしょうか。 値に変換するのは自動記録のマクロを作成しました。 カウントは、COUNTA関数をVBAで使用しています。 空白のセルをカウントさせない方法を教えてください。 マクロ・VBA初心者なので、値に変換するVBAも合わせて教えていただけると勉強になります。 よろしくお願いいたします。

  • Excel VBA セルの値を変更後にVBA作動

    Excel VBAを活用して、特定のセルの値が変更されたときに、VBA処理を発動させることになりました。 処理といたしましては、C列(3列目)の4行目以下の空白セルに数値を入力するか、セルに入力されている数値を変更した場合にVBAを発動させたいです。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 3 And Target.Row >= 4 Then MsgBox "セルの値が更新されました" End If End Sub 上記のコードを実行してみたところ、3列目(C列)の4行目を選択した段階でVBAが作動してしまいます。 セルの値変更後に作動するようにするには、どう修正すればよろしいでしょうか?

  • VBA 今日の行にあるセル コピー 別シートへ

    (1)sheet1にボタン button1 があり、そのボタンを押すと、マクロが起動する。 (2)データは sheet2 貼り付け先は sheet3 sheet2 F列に日付が入っています。   F列は、日付(過去~本日まで ※未来の日付はありません)か、空白の場合があります。 F列の日付が本日のとき、 sheet2 A列のセルの値を sheet3 B列へ。  A列には連番。 sheet2 D列のセルの値を sheet3 C列へ。 sheet2 G列のセルの値を sheet3 D列へ。 sheet2 F列のセルの値を sheet3 E列へ。 それぞれ、Sheet3の各行の一番下に貼り付ける形をとりたいのです。 こちらでマクロはどうしたらよいのでしょうか。

  • エクセルVBA「コンボボックスの値をワークシートに代入」

    エクセルVBA「コンボボックスの値をワークシートに代入」 連日質問してしまい申し訳ありません。・・・ 今回は「コンボボックス」にリストアップされている値をセルに入力したいのです。 画像を見て頂ければと思いますが、コンボボックス(左ウィンドウ画像)には25の文字列がリストアップされています。 このリストアップされている文字列をすべてワークシートのセルB4からの"4"列に入力したいのです。 なんだか滅茶苦茶ですが、ご理解頂ければご協力お願いします。

専門家に質問してみよう