• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA)

VBA行列操作についてのご質問

mt2008の回答

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.5

こんな感じですかね。 あとはご自身で手を加えて下さい。 Sub Sample()   Dim nRow, i   Sheets("Sheet3").Range("D:E,K:K,V:Y").Copy   With Sheets("Sheet1")     'Y列もSheet1にコピー(G列)     .Range("A1").PasteSpecial Paste:=xlPasteValues     nRow = .Cells(Rows.Count, 1).End(xlUp).Row 'データのある最終行     '最初にブランクを埋める(埋めるのは5行目から)     For i = 5 To nRow       If .Cells(i, 2) = "" Then .Cells(i, 2) = .Cells(i - 1, 2) 'B列       If .Cells(i, 4) = "" Then .Cells(i, 4) = .Cells(i - 1, 4) 'D列     Next i          'Y列(Sheet1のG列)のデータ分行を追加     For i = nRow To 4 Step -1       'Y列(Sheet1のG列)にデータがあるか       If .Cells(i, 7) <> "" Then         .Rows(i).Copy         .Rows(i).Insert         .Cells(i + 1, 3) = "―"         .Cells(i + 1, 6) = .Cells(i, 7)         .Cells(i + 1, 7) = "★"       End If       .Cells(i, 7) = "●"     Next i   End With End Sub

noname#187796
質問者

補足

サンプルをありがとうございます。 ご意見をいただけませんか? (1) ●は、Sheet3(変更前)Y列に値があるときだけSheet1(変更後)G列にコピーをしたいです。 Y列に値がないときはブランクにします。(混乱させて申し訳ございません。) V列にはセル結合している箇所がいくつかあり、対象行のすべてのセルGにコピーできません。 ↓定義を追加しましたがうまくいきません。 .Cells(i, 14).MergeCells = False 'G列のセル結合箇所の削除 出来る限るオリジナル書式を変更したくありません。 (2) AM-AF列を追加しました。 AM-AF間のセル情報はコピーするだけでセルに値がなくても構いません。 Gの結果を最後列へ追加したいのですがうまくいきません。 ------- コード; Option Explicit Sub Sample() Dim nRow, i 'Worksheets("バッチ帳票一覧(勘定系)").Range("D:E,K:K,V:Y").Copy Worksheets("バッチ帳票一覧(勘定系)").Range("D:E,K:K,V:X,AF:AM,Y:Y").Copy With Worksheets("編集後") 'Y列も"編集後"にコピー(G列) .Range("A1").PasteSpecial Paste:=xlPasteValues nRow = .Cells(Rows.Count, 1).End(xlUp).Row 'データのある最終行 '最初にブランクを埋める(埋めるのは5行目から) For i = 5 To nRow If .Cells(i, 2) = "" Then .Cells(i, 2) = .Cells(i - 1, 2) 'B列 If .Cells(i, 4) = "" Then .Cells(i, 4) = .Cells(i - 1, 4) 'D列 Next i 'Y列("編集後"のG列)のデータ分行を追加 For i = nRow To 4 Step -1 'Y列("編集後"のG列)にデータがあるか If .Cells(i, 14) <> "" Then .Rows(i).Copy .Rows(i).Insert .Cells(i + 1, 3) = "-" .Cells(i + 1, 6) = .Cells(i, 14) .Cells(i, 14).MergeCells = False .Cells(i, 14) = "●" .Cells(i + 1, 14) = "★" End If Next i End With End Sub

関連するQ&A

  • エクセルVBAで範囲の指定をしたいです(初心者)

    エクセルVBAで範囲の指定をしたいです(初心者) 列AからJがデータが入る範囲です。 列AとBとCには必ず数値等が何かしら入ります。 列Dは常に空白です。 列E以降は何か入ることも入らないこともあります。 7行目までデータがある場合、 A1セルからこの場合はJ7セルまでを範囲指定したいのですが 行数は未定なので、 Range("A1").Select Range(Selection,Selection.End(xlDown)).Select でA列のデータ最終行まで下がり、そこから9つ右の列までを 範囲指定するというのがよくわかりません。 自動記録で絶対参照と相対参照を切り替えてやってみたのですが、 どうしても Range(Selection, Selection.End(xlDown)).Select ActiveCell.Range("A1:J7").Select と常にA1からJ7が指定になってしまいます。 バージョンは2003です。 つたない質問文で申し訳ありませんが、 どなたか宜しくお願いいたします。

  • エクセル関数、またはVBA

    どなたか教えてください。 B列に半角数字か空セルがあります。 A列にB列の一定の行数(下記だと4行)の数字の和があります。 ---------- A B C 3 1     1     1         4 0     1     3     0   3 0           2     1   ---------- これを以下のようにA列の数字を対応する4行中のB列がゼロでも空セルでもない行に移動させたいのです。 ---------- A B C 3 1     1     1           0   4 1     3     0     0         3 2     1   ---------- 実は経理の帳簿の貸借なのですが、関数かマクロでできないでしょうか? 自分なりに考えてみたのですが、頭がパンクしました・・・ どうかお助け下さい。

  • Excel2003でのVBA

    WindowsXPでExcel2003を使っています。 Excelにある表をマクロを使って編集したいと思ったのですが、セルの選択の設定で教えてほしい事があります。 まず、横A列~F列、縦1行~6行までの表があります。 A1セルは、空白。 B1セル~F1セルには、1~5の数字が入っています。(見出しなので全て入ってます。) A2セル~A6セルには、a~eのアルファベットが入っています。(見出しなので全て入ってます。) 表の中のデータは、ところどころにしか入っていなくて、全て埋まっていません。 また、横A列~F列というのは固定なのですが、縦1行~6行までという行数は変動します。 この表で、A2セルからF6セルまでを選択したいのですが、行が変動するのでA6とかF6とかでは指定できません。 Range("A2").Select Selection.End(xlDown).Select これで、A2セル~一番下の行(ここではA6セル)まで選択した後、F列まで(列の数は固定です。)選択するにはどうしたらよいのでしょうか? 右下のセルは、空白なので困っています。 Range(Selection, Selection.Next).Select こんなものを考えましたが、これでは一つ右隣しか選択できません。 これを少しいじればいいのではないかと思うのですが、全然違う方法でもかまいません。 どなたか教えていただけないでしょうか? 宜しくお願いします。

  • Excel VBAの繰り返し構文について

    A列に日付、B列に曜日、C列に休、D列に1直、E列に2直、という形の年間シフトを作成しています。 初期値としてA2セルに数字を入力→C列が空白の時だけD列に記入するマクロを作成したと思っています。 現在仮として、 Sub C列のセルが空白の行のD列に数値を入力() 下端行 = Range("A" & Rows.Count).End(xlUp).Row '下端検出 For 行 = 3 To 下端行 '1行目から下端行まで1行ずつ繰り返す If Range("C" & 行).Value = "" Then 'その行のC列のセルの値が空白の時 Range("A2").Copy 'A2をコピーする Range("D" & 行).PasteSpecial Paste:=xlPasteFormulas 'その行のA列のセルを起点に 'して数式を貼り付ける End If Next End Sub というマクロを置いていますが、「Range("A2").Copy」の部分を 「A2を初期値として、最初にC列が空白でなくなる時まで初期値を繰り返し、次にC列が空白になった場合は初期値+1の数をD列に入力する。 ただし初期値+1の最大数は6までとする(要するに1~6の繰り返しです)」 という感じに変更したいのですが、どうすればいいのかさっぱりです…。 VBAレベルはこの質問をする程度なのでかなり初級です。

  • エクセル2003のVBAの範囲選択について質問です。

    エクセル2003のVBAの範囲選択について質問です。 OSはXPです。 Range("B1:C" & Range("A" & Cells.Rows.Count).End(xlUp).Row).Select この意味は、B1セルからC()の範囲指定をするのに、()をA列の最終行を探すことによって指定する、ということだと思います。いろいろなサイトを参照させてもらいました。 この場合のA列の最終行を探す方法は、A列のデータが歯抜けの場合に正しく探せないので、一旦最終行を探し、そこから上に見に行って最初にデータが入っている行を探している、で正しいと思います。 私が知りたいのは、逆に歯抜けの場合はそこを最終行として指定する方法です。つまり、一旦最終行を探し、上に見に行くのではなく、A列の上から下に見に行って、空白(歯抜け)が見つかったところを最終行と指定する方法です。xlDownを使うのだろう、というところまでは判ったのですが、どうにもその先が判りません。 歯抜けの場合の方がマイナーなのか、この方法を具体例を記載しているサイトを見つけることができませんでした。 よろしくお願いいたします。

  • 他のエクセルから目的のデータをもってくる VBA

    VBAの初心者で、なかなか思うようにいきません。 とても恐縮ですが、どなたかにご指導頂きたくこちらに投稿させていただきました。 環境はExcel2010です。 ワークブック「DATA]、ワークシート名「data」にあるデータを ワークブック「TEST」、ワークシート名「test」に張り付ける。 また、元データのワークブック名はこのマクロを行う際に選択出来るようにしたいです。 張り付けるデータは、図の 「数値2」欄に記述されている数字の行に対して 「数値1」欄の数値と、「名前」欄の(カッコ内)のローマ字のみを エクセル名TESTに張り付けたいです。 その際「数値1」はA列、「名前」はB列にそれぞれ行の1から。 また、「数値1」欄が”0”であったり”=H10+I10”のような式の場合、 その行の「数値1」欄の値と「名前」欄の文字を 張り付けないようにしたいです。 画像のようになるのが目標です。 今現在私の考えている方法では 「数値2」を LAST = ActiveSheet.Range("D3").End(xlDown).row で空白セルの一つ上のセルの行数を出す。(この場合⇒7=LAST) 「数値1」欄のコピー、貼り付けを if文でC3からLASTまで・・・・。 とここまででものマクロでさえエラーがずっと続き コンパイルが通らず 分からないことだらけです。 言葉足らずで質問内容が分かりにくいかもしれません。 どうぞ宜しくお願い致します。

  • 選択範囲に関する質問

    いつもお世話になっております。 初歩的な質問だと思いますが宜しくお願い致します。 リストでA列にデータが並んでいます。BとC列に数字があり、 B列に新しい列を入れて Range("B2").Select ActiveCell.FormulaR1C1 = "=SUM(RC[1]:RC[2])" こちらをAのデータが入ってる行数までペーストさせたいのですが、 どうしたらデータが入ってる行数までペーストさせるマクロを組み込めるでしょうか? Range("A2").End(xlDown).Rowなどで最終行まで調べることは出来るのですが、 Select、Copyの場合はどのように入れたら宜しいでしょうか? 自分で調べてみていろいろやってみましたのですが上手く行きませんでした…

  • Excel VBA

    Excel VBAを勉強中の者です。 複数のワークブックを開いているため、ワークブックから指定していってセルを選択したいと思い下記のようなコードにしてみたのですができませんでした。 Workbooks(“C:\フォルダ\ワークブック.xls”).Worksheets(“C”).Range(“A1”).Select このようなコードは有り得ないのでしょうか? または、ワークブックを開いて、ワークシートをアクティブにして、セルを選択するというように、ひとつひとつ選択していくのではなく、一文でワークブックからセルまで指定する他の方法はありますでしょうか? 教えてください。よろしくお願いします。

  • エクセルのVBAで

    ある列(仮にA列とします)の最終行がA30であり A25までは空白だとします。 この時に、A30の値をA29~A25=データの入力されていないセルに入力(コピー)するにはVBAでどのように記述すればいいのでしょうか? 最終行から、上にその最終行の値をデータの入力されているセルに達するまで入力(コピー)したいのですが。 分りづらい表現で申し訳ありませんが、よろしくお願い致します。

  • vba なぜこうなるのか・・・。

    こんばんは、よろしくお願いします。 A1セルにデータが入っている状態で、以下の変数を使いA列の最終データが入っている行を調べると、(65536)が表示されます。なぜ、(1)にならないのでしょうか? ためしにA1及びA2セルにデータを入れマクロを実行すると、正確に2が表示されました。 Sub 練習() dim maxrow as long maxrow = Sheets(1).Range("a1").End(xlDown).Row   msgbox maxrow End Sub EXCEL2000を使用しています。よろしくお願いします。