- ベストアンサー
VBA行列操作についてのご質問
- VBAを使用して行列操作を行いたいですが、具体的な方法がわかりません。ワークシートの特定の範囲をコピーしたり、行数が一定でない場合のセルの値の変更を行いたいです。
- 具体的な操作内容として、指定した範囲のセルをコピーしようとするとエラーメッセージが表示され、セルの値の変更もうまく行えません。
- 行数が一定でない場合に、セルを挿入したり、セルの値を変更したりする方法がわかりません。最終行に行を追加したり、新しいワークブックにセルを作成する方法も知りたいです。
- みんなの回答 (6)
- 専門家の回答
関連する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 ---------- 実は経理の帳簿の貸借なのですが、関数かマクロでできないでしょうか? 自分なりに考えてみたのですが、頭がパンクしました・・・ どうかお助け下さい。
- 締切済み
- Visual Basic
- 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 こんなものを考えましたが、これでは一つ右隣しか選択できません。 これを少しいじればいいのではないかと思うのですが、全然違う方法でもかまいません。 どなたか教えていただけないでしょうか? 宜しくお願いします。
- ベストアンサー
- Visual Basic
- 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レベルはこの質問をする程度なのでかなり初級です。
- ベストアンサー
- その他MS Office製品
- エクセル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を使うのだろう、というところまでは判ったのですが、どうにもその先が判りません。 歯抜けの場合の方がマイナーなのか、この方法を具体例を記載しているサイトを見つけることができませんでした。 よろしくお願いいたします。
- ベストアンサー
- その他MS Office製品
- 他のエクセルから目的のデータをもってくる 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まで・・・・。 とここまででものマクロでさえエラーがずっと続き コンパイルが通らず 分からないことだらけです。 言葉足らずで質問内容が分かりにくいかもしれません。 どうぞ宜しくお願い致します。
- ベストアンサー
- Visual Basic
- 選択範囲に関する質問
いつもお世話になっております。 初歩的な質問だと思いますが宜しくお願い致します。 リストでA列にデータが並んでいます。BとC列に数字があり、 B列に新しい列を入れて Range("B2").Select ActiveCell.FormulaR1C1 = "=SUM(RC[1]:RC[2])" こちらをAのデータが入ってる行数までペーストさせたいのですが、 どうしたらデータが入ってる行数までペーストさせるマクロを組み込めるでしょうか? Range("A2").End(xlDown).Rowなどで最終行まで調べることは出来るのですが、 Select、Copyの場合はどのように入れたら宜しいでしょうか? 自分で調べてみていろいろやってみましたのですが上手く行きませんでした…
- ベストアンサー
- Visual Basic
- Excel VBA
Excel VBAを勉強中の者です。 複数のワークブックを開いているため、ワークブックから指定していってセルを選択したいと思い下記のようなコードにしてみたのですができませんでした。 Workbooks(“C:\フォルダ\ワークブック.xls”).Worksheets(“C”).Range(“A1”).Select このようなコードは有り得ないのでしょうか? または、ワークブックを開いて、ワークシートをアクティブにして、セルを選択するというように、ひとつひとつ選択していくのではなく、一文でワークブックからセルまで指定する他の方法はありますでしょうか? 教えてください。よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- 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を使用しています。よろしくお願いします。
- ベストアンサー
- Visual Basic
お礼
ありがとうございました。 質問がゴチャゴチャしてきましたので再度、質問し直します。
補足
ありがとうございました。 ご意見をいただけませんか? 1. 列移動の件は???.Cutメソッド、???.Insertメソッドで解決できました。 Y列("Sheet1"のG列)の最後尾列(Q列)へ移動しました。 2. 提示例が悪くて申し訳ございません。 G列に●をコピーする箇所はY列に値がある行だけです。 今回はY列に値があれば、最後に行の追加処理をしてG列に"★"をコピーします。 Y列("Sheet3")はセル結合しているデータです。 すべての対象行にはG列に"●"をコピーしたいです。 現行コードはセル結合を解除すると対象行毎に新規に一行を追加されてG列に"★"がコピーされてしまいます。 ご提供していただいたサンプルですと対象行を1行見て、G列に"●"をコピーして行の追加処理をしてG列に"★"がコピーします。 だだし、他の対象行のG列には"●"がコピーされません。 対象行のG列すべてに"●"がコピーして、行の追加処理をしたいのです。 方法としては、X列("Sheet3")がY列("Sheet3")に値の有無を見てG列に"●"をコピーして、行の追加処理をしたいのです。 また、行の追加処理ですがY列値が連なっているケースがございますので現在処理の対象としているY列は直下の値を見て 値が異なるならば、その直前で行の追加処理をしたいのです。 変更前(Sheet3); (X列) (Y列) 1 ABC000 テーブル4 2 ABC000 (同上) 3 ABC000 テーブル5 4 ABC000 (同上) . . 変更後(Sheet1); (F列) (G列) 1 ABC000 ● 2 ABC000 ● 3 テーブル4 ★ 4 ABC000 ● 5 ABC000 ● 6 テーブル5 ★ . . ------- コード; Option Explicit Sub Sample() Dim nRow, i Worksheets("Sheet3").Range("D:E,K:K,V:Y,AF:AM").Copy With Worksheets("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列 If .Cells(i, 7) = "" Then .Cells(i, 7) = .Cells(i - 1, 7) 'G列 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, 7) = "●" .Cells(i + 1, 7) = "★" End If Next i 'Y列("Sheet1"のG列)の最後尾列(Q列)への移動 .Range("G:G").Cut .Range("Q:Q").Insert End With End Sub