• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:矩形範囲の複数列を縦1列に並べ替えエクセルVBA)

エクセルVBAで矩形範囲を縦1列に並べ替える方法とは?

eden3616の回答

  • eden3616
  • ベストアンサー率65% (267/405)
回答No.21

>範囲の指定さえしておけば、N列でなくとも、最左列が自動的に決まるのですね。 はい、そのように処理されます。 以下の2行は開始値を1から始め、行・列数の数までiを変動させています。 For j = 1 To myRng.Rows.Count For i = 1 To myRng.Columns.Count 範囲がN1:T50の場合、 myRng.Rows.Countの値は1行~50行目の行数なので、50 myRng.Columns.Countの値はN~T列の列数なので、7 が取得されます。 よって行方向ではjが1から50まで変動し、列方向ではiが1から7まで変動します。 実際のセルの値を取得する処理が以下の部分になります word = word & myRng.Cells(j, i).Value ここでmyRngで設定された範囲のうち左上のセルをCells(1, 1)としたとき、 Cells(j, i)のセルのValue(セルの値)を変数wordに代入しています。 (word = word & 追加文字列 とすることでwordの後に追加文字列を結合することができます) N1:T50が対象の範囲とすれば、N1がCell(1,1)に該当し、N2はCell(2,1)、O1はCell(1,2)で取得されます。 つまり N1 O1 P1 N2 O2 P2 ・・・ N3 O3 P3   ・   ・   ・ は以下のようにmyRng.Cell(j,i)が繰り返し処理により変動することで範囲内のセルを全て対象に処理されます。 myRng.Cell(1,1) myRng.Cell(1,2) myRng.Cell(1,3) myRng.Cell(2,1) myRng.Cell(2,2) myRng.Cell(2,3) ・・・ myRng.Cell(3,1) myRng.Cell(3,2) myRng.Cell(3,3)   ・   ・   ・ >関数だと列の数え方が1列めを0として数えることもあった気がしましたが、これだと1から1ずつ増やすということになりましょうか(1 To myRng.Columns.Count) 関数というか、配列でしたらプログラムでは0が開始値になります。 今回の繰り返し処理を行っている「For~Next」は変数の値を開始値から開始値になるまで変動し繰り返し処理します。 繰り返し処理の中で、変動の増減値を省略した場合は1加算されます。 (本来は「For i = 1 To myRng.Columns.Count Step 1」のようにStep ○で増減値を明記しますが上記では省略しています) >今まで「行の削除」とばかり思い込んできましたがテキストに書き出すということで「出力しない」という手法になるのですね。 処理の書き方にもよりけりですが、 今回の処理はテキストデータの加工→テキストファイルへ出力を繰り返しているだけで 出力するときに条件を判断して、出力するかしないかを判定しています。 >エクセル上で同様の処理をする場合、行の削除は下から順に行うと処理をするいうことで覚えていましたので、 はい、そのとうりです。 削除の場合はエクセルの仕様で空白になるのではなくシフト(詰められます)されます。 ご存知の通り、行の削除を若い数から行うと先ほどのForループにより次の行番号を処理しようとしたときに 前のループ内で行を削除すると次の行が上に1行シフトしますので 次の行を処理するときに1つ飛ばしになってしまう事になります。 このため、削除した行を判断して処理する対象の行をそのつど変更する処理を加える必要があります。 この工程を加えず、手軽に行削除する方法は下から順に処理を行うという方法になります。 Forで行番号を指定するときに行の最大値を開始値として、最小値まで「Step -1」で処理を行う事で実現できます。 これでしたら対象行より上は初期のデーたのままですので削除による行シフトが影響しません。 >てっきり行削除するのかと思い、他の列に影響することを避けるため、NからTのデータは元データに影響のない行、 >例えばA1000以下に設定するようなこともしていましたが、書き出しの場合はその必要がないことがわかりました。 必要なものをチョイスして上から順番に書き出すだけですので、不要なものは読み飛ばすだけで良いため 取得元のデータは変わらず、削除の時のように行や列のシフトが発生しませんので気をつける必要はありません。 今回は元のデータを読み取って不要な部分を読み飛ばして出力する処理になりますが 元のデータを作業用として崩しても構わないのであれば、 最終の出力状態へエクセルシートのデータを加工(削除や移動など)を行ったうえで テキストファイルへ1行目から書き出す方法もあります。

関連するQ&A

  • アクティブセルの行のセルを複数指定選択-VBA

    アクティブセルの行のセルを複数指定選択-VBA コマンドボタンを押すとアクティブセルのある行のセルを個別に選択したいのですが、どのようにVBAにコードを入力すればいいのか悩んでいます。 例:選択したい列(セル)A:C,F:I アクティブセルがA2にある時、コマンドボタンを押してA2,B2,C2,F2,G2,H2,I2を選択する。   アクティブセルがA10にある時は、A10,B10,C10,F10,G10,H10,I10を選択する。 ご回答お待ちしています。宜しくお願い致します。

  • ExcelのVBAで複数の範囲を指定したいのですが

     ExcelのVBAの全くの初心者です。(PC全般については、多少はわかるつもりですが)  R1C1参照という形式を使って、複数のセル範囲を色付けするため指定するにはどのようにすれば良いのでしょうか?  例えば、アクティブセルにA25が指定されていて、A4~C7とE4~F10とI4~I8までを色付けしたいなどという場合。  色付けなどは、わかるのですが、複数の範囲指定がわからないのです。よろしくお願いします。

  • エクセルVBAで列の選択

    VBAで通常は、Columns("D").Select でD列が選択されるはずですが、途中にセルが結合している個所があると、選択範囲の列が、すべての行で広がってしまいます。 手動で列番号をクリックするとD列だけの選択ができるのにVBAではなぜ出来ないのでしょう? どうコードを変えればいいのでしょうか? エクセル2000です。

  • 【Excel VBA】複数範囲の並べ替えは可能でしょうか?

    【Excel VBA】複数範囲の並べ替えは可能でしょうか? Excel2003を使用しています。 CSVデータを元に作成された下記のような表があります。 A列…日付、B列…受注番号、C列…摘要(会社名・品名等)、D列…金額となっています。 6行目以下に上記の内容でデータが入力されていますが、会社ごとのデータ内で日付順に並べ替えをしたいのですが、VBAで複数の範囲を選択して、それぞれの範囲内での並べ替えは可能でしょうか?     A     B     C    D 6             ○○会社 7   1/20   123   AAA   1,000 8   1/15   120   BBB   2,000 9 10              計     3,000 11 12            ××会社 13 計の1行上と下は空欄行で、以下、会社名の後にデータが続くというパターンの繰り返しで数十社分あります。 Excelのデータ⇒並べ替えでは複数選択した状態での並べ替えはできないので、VBAで可能であればと思い、質問させていただきました。 よろしくお願いします。

  • エクセル2003VBAで選択範囲

    いつもお世話になっています。 エクセル2003を使用しております。下記を関数又はVBAの組み方・構文を教えて下さい。 (1)E列には、「1」と「.」と「空白」が入っています(「1」が入ってないケースもあります)が、「1」を検索します。もし「1」が無ければ、J列を同様に検索します。(中身はE列と同じです) (2)「1」が入っているセルから見て、「行」の±10の範囲内を選択し、別シートにコピーする。 例1. 1が入っているセルが、「E15」とします。 この場合、コピーしたい範囲は、5行目全部~25行目全部です。 例2. 1が入っているセルが、「E17」とします。 この場合、コピーしたい範囲は、7行目全部~27行目全部です。 分かりにくいかもしれませんが、よろしくお願いします。

  • エクセルVBAで範囲指定の方法をおしえてください

    エクセルVBAで範囲指定の方法をおしえてください こんばんは。 以下のようにデータがあるとします。 222 111 333 555 888 999 454 665 222 111の文字列を含むセルから888の文字列を含むセルまでをVBAで範囲指定したいのですが 方法がわかりません。 エクセルに読み込むファイルによって目的の情報の位置が変わるため、文字列を基に範囲指定したいのです。 本当に困っていますよろしくお願いします。

  • エクセルVBAについてお尋ねいたします。以前、列の検索範囲から指定列中

    エクセルVBAについてお尋ねいたします。以前、列の検索範囲から指定列中の空欄セルが存在した際にその空欄を含む行の削除を実行するマクロを組んだのですが、削除する行の範囲も指定するマクロに組み替えたく望んでおります。 <参照> Private Sub CommandButton1_Click() Dim minRow As Integer Dim maxRow As Integer Dim checkColIndex As Integer ' 初期値1(開始行の値) minRow = 1 ' 初期値2(終了行の値) maxRow = 10 ' 検索列の値(1=A列、2=B列、3=C列...) checkColIndex = 1 Application.ScreenUpdating = False ' 空欄が存在する行の削除処理 For i = maxRow To minRow Step by - 1 ' 指定セルが空欄の場合、その行を削除 If (Len(ActiveSheet.Cells(i, checkColIndex).Value) = 0) Then ActiveSheet.Rows(i).Delete End If Next Application.ScreenUpdating = True End Sub 上記のコマンドを例にすると、 1行目から10行目までのA列に存在する空欄を検索し、空欄が存在したら範囲中の最下(10行目)よりセルを含む行ごと削除・・・ となりますが、この中に <例> ’削除を行う範囲(1=A列、2=B列、3=C列...) ' 開始列値 *** ' 終了列値 *** '範囲内の行を削除 *** など、検索範囲が変わった際にも対応が可能で削除範囲が指定出来るコマンドに変更したく望みます。 宜しくお願い致します。

  • 矩形範囲の複数列を縦1列に並べ替えVBA(続)

    次のVBAは矩形の範囲を縦一列に並べ替えるものでここで教えていただきました。 これはM1~R**のデータをM1-M**/N1-N**/O1-O** …というふうに矩形の範囲内を順に縦一列にするものですが、これを並べる順序を任意にしたい場合にはどこを修正したらいいでしょうか。 すなわちM1-M**の次にP1-P**、N1-N**というような感じです。 当方VBAはよく知らないため教えていただいたままで動かしています。 (Office2013/Windows7) よろしくお願いします。 Sub action() '型宣言 Dim st As String, ed As String Dim stcol As Long, edcol As Long Dim strow As Long, edrow As Long Dim retu As Long, gyou As Long Dim fname As String, tpath As String Dim fcnt As Long 'データの範囲(左上のセルと右下のセル)アドレスを指定 st = "M1" ed = "R200" 'セルアドレスより各行列番号を取得 stcol = Range(st).Column edcol = Range(ed).Column strow = Range(st).Row edrow = Range(ed).Row 'セル範囲が選択中の場合 If Selection.Count > 1 Then stcol = Selection(1).Column edcol = Selection(Selection.Count).Column strow = Selection(1).Row edrow = Selection(Selection.Count).Row End If '出力先のファイル名を処理 If Cells(strow, stcol).Text = "" Then fname = "不明(" & Cells(strow, stcol).Address & ")" Else fname = Cells(strow, stcol).Text End If ngs = Split("■,\,/,:,*,?,"",<,>,|", ",") For Each ng In ngs fname = Replace(fname, ng, "#") Next dpath = "H:\■DATA\DATAB" If Dir(dpath, vbDirectory) = "" Then Debug.Print "dpath = " & dpath MsgBox "パスが不正です" Exit Sub End If tpath = dpath & "\" & fname & ".txt" Do Until Dir(tpath) = "" fcnt = fcnt + 1 tpath = dpath & "\" & fname & "_" & fcnt & ".txt" Loop Open tpath For Output As #1 '列方向にループ For retu = stcol To edcol '行方向にループ For gyou = strow To edrow If Cells(gyou, stcol).Text <> "" Then Print #1, Cells(gyou, retu).Text End If Next gyou Next retu Close #1 Dim objFSO As Object 'FileSystemObject オブジェクト Dim objTS As Object 'TexobjTStream オブジェクト MsgBox tpath & vbCrLf & "に出力しました" End Sub

  • データの一部範囲について、並替等のVBAを作りたい

    データの一部範囲について、並べ替え等のVBAを作りたい。 次のようなVBAを作りたいのですが、当方知識がほとんどないためお力を貸してください。 データの内容 A列たてに2行目「6時台」12行目「7時台」というふうに、10行くらいおきに「○時台」の文字が24時台まで入る B列~C列A列にあわせた行数の文字列が入る E列~N列関数式の入ったデータが入る、A列~C列のからデータにあわせてデータより余分に関数式が入りデータ空白はIF(B="","", )で空白扱い。 処理したい内容 まず例として11時台~12時台の範囲(11時台のセルから13時台の文字の前の行まで)についてのみ対象として E列~J列までを、たて一列にする。E1~Exその下にF1~FxというふうにJ列まで。ただし並べ順はE,G,H,F,I,Jのようになる。 この場合の「E1」とは11時台のセル行位置 次にH~N列の矩形をそのままCopy これらのデータをテキストとして作成保存 時間の範囲は、A1に入るデータの日付(Bookごとに異なる)による曜日によって異なるので 「固定式」をいくつか作ってcaseで選択を予定していますが 汎用性として、最初の時間とうしろの時間を指定する任意の範囲式も作っておきたいです。 現在は、boxで時間を入れ、検索で○時台を見つけその上に空白行を3行入れ 続いてうしろの行も時間指定により3行空白を入れ、データ(関数式)の途切れる範囲内を作り、 その場所に手動でジャンプさせ、並べ替えマクロを動作さテキスト化しています。 また矩形部分はマウスで範囲を反転させたものをCopyしてそのテキストにあとから貼り付けています。 全体を対象としたVBAはここで作成していただいたのですが、途中の一部範囲を対象としたものが必要になったためお知恵をお借りしたいと思います。 よろしくお願いします。 Windows7/Office2013

  • エクセル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です。 つたない質問文で申し訳ありませんが、 どなたか宜しくお願いいたします。