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

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

mt2008の回答

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

(1) > ↓を実行するとエラーメッセージ"インディクスが有効範囲内にありません。"が表示されます。 > 理由が分かりません。 > > Worksheets("Sheet1").Range("A", "C").Copy 定義が違います。 Worksheets("Sheet1").Range("A:A,C:C").Copy (2) A列の全てって、104万8576行までですか? 以下の様なコードでA列を埋めるしかないと思います。 Sub Macro2()   For i = 2 To Rows.Count     If Range("A" & i) = "" Then Range("A" & i) = Range("A" & i - 1)   Next i End Sub 本当に必要ですか? (3) > 最終行に行を追加したのですが定義が分かりません。 A列にデータがある最終行なら↓ nRow = Cells(Rows.Count, 1).End(xlUp).Row Rows(nRow + 1).Insert Shift:=xlDown (4) > (3)で追加した最終行のセルCにはA列の直前値を挿入したいのですが定義が分かりません。 nRow = Cells(Rows.Count, 1).End(xlUp).Row Rows(nRow + 1).Insert Shift:=xlDown Range("C" & nRow + 1) = Range("A" & nRow) (5) > 追加した最終行の直前まではすべて●、最終行のセルには▲を挿入したいのですが定義が分かりません。 やりたいことが良く見えないですが、こういう事かな? nRow = Cells(Rows.Count, 4).End(xlUp).Row Range("D1:D" & (nRow - 1)) = "●" Range("D" & nRow) = "▲" もう少し、何をやりたいのか整理した方が良いように思われます。

noname#187796
質問者

補足

ありがとうございました。 実施したいことは、↓のような事です。 行数は一定ではありません。 教えていただいたループ回数、"For i = 2 To Rows.Count"ではオーバーフローでした。 ご意見をいただけませんか? 質問は赤字箇所です。 変更前(Sheet3); (D列) (E列) (K列) (V列)  (W列) (X列) (Y列) 1 ABC123 テーブル1 ABC456 テーブル2 ABC789 ABC000 テーブル4 2 ABC123 ABC456 ABC789 ABC000 3 ABC123 ABC456 テーブル3 ABC789 ABC000 4 ABC123 ABC456 ABC789 ABC000 変更後(Sheet1); (A列) (B列)  (C列) (D列)  (E列) (F列) (G列) 1 ABC123 テーブル1 ABC456 テーブル2 ABC789 ABC000 ● 2 ABC123 テーブル1 ABC456 テーブル2 ABC789 ABC000 ● 3 ABC123 テーブル1 ABC456  テーブル3 ABC789 ABC000  ● 4 ABC123 テーブル1 ABC456 テーブル3 ABC789 ABC000 ● 5 ABC123 テーブル1 -   テーブル3 ABC789 テーブル4 ★ ← 最終行追加 行数は一定ではありません。 教えていただいたループ回数、"For i = 2 To Rows.Count"ではオーバーフローでした。 ご意見をいただけませんか? 質問は>箇所です。 Option Explicit Dim i As Integer Dim nRow As Integer Sub prcCopyPasteColumns() 'D → A列 Worksheets("Sheet3").Range("D:D").Copy Worksheets("Sheet1").Range("A:A").Insert >コピー元、コピー先の列番号が異なっていました。 'E → B列 Worksheets("Sheet3").Range("K:K").Copy For i = 2 To Range("A65535").End(xlUp) If Range("K" & i) = "" Then Range("K" & i) = Range("K" & i - 1) Worksheets("Sheet1").Range("B:B").Insert Next i >無現ループしてしまいます。 'K → C列 Worksheets("Sheet3").Range("K:K").Copy For i = 2 To Range("A65535").End(xlUp) If Range("K" & i) = "" Then Range("K" & i) = Range("K" & i - 1) Worksheets("Sheet1").Range("C:C").Insert Next i 'V → D列 Worksheets("Sheet3").Range("V:V").Copy Worksheets("Sheet1").Range("D:D").Insert 'W → E列 Worksheets("Sheet3").Range("W:W").Copy For i = 2 To Range("A65535").End(xlUp) If Range("W" & i) = "" Then Range("W" & i) = Range("W" & i - 1) Worksheets("Sheet1").Range("E:E").Insert Next i 'X → F列 Worksheets("Sheet3").Range("X:X").Copy Worksheets("Sheet1").Range("F:F").Insert '最終行 nRow = Cells(Rows.Count, 1).End(xlUp).Row Rows(nRow + 1).Insert Shift:=xlDown Range("C" & nRow + 1) = "-" '"-" → Cセル Worksheets("Sheet3").Range("Y:Y").Copy Range("F" & nRow + 1) = Range("Y" & nRow).Insert 'Y直前値 → Fセル 'G列 nRow = Cells(Rows.Count, 4).End(xlUp).Row Range("G1:G" & (nRow - 1)) = "●" '"最終行-1"まで Range("G" & nRow) = "▲" '最終行 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を使用しています。よろしくお願いします。