• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:エクセルVBAで複数列データを1列に配列替えしたい)

エクセルVBAで複数列データを1列に配列替えする方法

DOUGLAS_の回答

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.5

>ちなみにこの":*/"を"■"に書き換えてみたのですが、 >VBAが砂時計のまま進まなくなってしまいました。  そういう場合は、VBE において [F8] キー により、ステップ イン デバッグ すると原因がよく判ります。  つまり、   Do Until endRow = FirstLine    TitleLines = TitleLines & " " & endRow    endRow = Columns(1).FindNext(after:=Range("A" & endRow)).Row   Loop で 無限ループ に陥っているのですね。  それで、内容をよく吟味していないので分かりませんが、 Do Until endRow = FirstLine ではなくて、 Do Until endRow < FirstLine ではないかと思いますね。  それと、 >":*/"を"■"に ではなくて「■*」に書き換えた方がよいかと存じますが、さらに「■*SD*」の方が良いような気がいたします。

noro6857
質問者

お礼

ありがとうございました。 Do Until endRow < FirstLineと■*を置き換えたらうまくゆきました。 (第2グループ以下の1行目はSDが入らないため「■*」だけにしました。) そこでひとつ質問です。 VBAは次のとおり(途中まで)ですが 配列の対象がH~P列の場合と、I列~P列の場合があります。 そこで矩形の左上1セル目からスタートさせたい場合、下記のVBAでは セル列をあらかじめ記述してしまっていますが、 カーソル位置から右の矩形を対象にする場合、ここの列名を書き換えなくて済むようにできればと思います。すなわちこの例だとH列からの場合とI列の場合の矩形になります。 'データ読み込み列の順列の設定 '▼書き出し列の増減・順序の変更はここで▼ strCols = "HIJKLMNOP" *************************************** Sub Group_for_each_Title_Line0827A05() '変数の宣言 Dim objFSO As Object 'FileSystemObject オブジェクト Dim objTS As Object 'TexobjTStream オブジェクト Dim g As Long 'グループカウンタ Dim DataChecker As Variant 'グループの内容確認用のデータ Dim strFullPath As String 'ファイル の フルパス Dim strSaveFol As String '保存先フォルダ名 Dim strFileName As String 'ファイル名 Dim strAddName As String '追記文字 Dim strCols As String '列番号の順列 Dim TitleLines As Variant 'タイトル行番号の配列 Dim FirstLine As Long '第1開始行 Dim startRow As Long '開始行 Dim endRow As Long '終了行(一時流用) Dim i As Integer '列カウンタ Dim j As Long '行カウンタ 'A列最終行より後のセルがアクティブのときは即終了 If ActiveCell.Row > Range("A" & Rows.Count).End(xlUp).Row Then MsgBox "データがありませんので、終了します。" Range("A1").Select Exit Sub End If '■■■【1】下準備 'オブジェクト の準備 Set objFSO = CreateObject("Scripting.FileSystemObject") 'データ読み込み列の順列の設定 '▼書き出し列の増減・順序の変更はここで▼ strCols = "HIJKLMNOP" 'ファイル保存先フォルダの指定 strSaveFol = "H:\" '■■■【2】タイトル行の割り出し '第1開始行 FirstLine = Range("A1").End(xlDown).Row 'アクティブ行が FirstLine 未満の場合は検索開始行を FirstLine に If ActiveCell.Row < FirstLine Then Range("A" & FirstLine).Select 'アクティブ行のA列が空白セルの場合は検索開始行を直下のタイトル行に If Range("A" & ActiveCell.Row).Value = "" Then _ Range("A" & ActiveCell.Row).End(xlDown).Select 'アクティブ行がタイトル行の場合は、TitleLines に含め 'その他の場合は、上方向にタイトル行を探す If Range("A" & ActiveCell.Row).Find("■*") Is Nothing Then TitleLines = Columns(1).Find(What:="■*", after:=Range("A" & ActiveCell.Row), _ LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:= _ xlPrevious, MatchCase:=False, SearchFormat:=False).Row Else TitleLines = ActiveCell.Row End If '以下、アクティブ行からA列最終行まで、タイトル行を探す endRow = Columns(1).Find(What:=":■*", after:=Range("A" & ActiveCell.Row), _ LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns, SearchDirection:= _ xlNext, MatchCase:=False, SearchFormat:=False).Row Do Until endRow < FirstLine TitleLines = TitleLines & " " & endRow endRow = Columns(1).FindNext(after:=Range("A" & endRow)).Row Loop **********************************

noro6857
質問者

補足

ファイル名の入力について 「A1&■+10文字+続く文字」になるように作っていただいていますが 実際には「続く文字」というのはほとんどなく、A1+各1行目がファイル名になります。 そしてこの1行目はファイル名に使うとき若干加工する必要があるため、 この1行目をテキストボックスにデフォルトであらかじめ表示させてこれを修正するようにできるとありがたいです。 (「○○特集」の「特集」を削除したり、長すぎタイトルを分かりやすく一部削除したりです) ただ、「入力がないため終了」とあるので、デフォルトで入っていると終了する場合判断できなくなってしまいますね。 テキストボックスのデフォルトを全削除で終了というふうになりますか。

関連するQ&A

  • 6列を配列に取込し1列を検索値、2列を書出ししたい

    シート(抜取マスタ)のA列と シート(マスタ全部)のA列をぶつけてヒットしたら シート(マスタ全部)の該当行のE列を抜取マスタのF列に転記 するマクロを ヒットしたら シート(マスタ全部)の該当行のE,F列を抜取マスタのF,G列に転記 とか シート(マスタ全部)の該当行のD,F列を抜取マスタのF,G列に転記 シート(マスタ全部)の該当行のE,F列を抜取マスタのF,H列に転記 に改造したいです。 ●部分を修正しなければと思っていますが 思ったように動きません。教えてください。 よろしくお願いします。 Sub 検索貼付() 'シート(抜取マスタ)のA列と 'シート(マスタ全部)のA列をぶつけてヒットしたら 'シート(マスタ全部)の該当行のE,F列を抜取マスタのF,G列に転記 'データは2列目から開始 'ヒットしない場合は 無し と記入 Dim dic As Object Dim i As Long Dim v, w Dim t As Single t = Timer With Sheets("マスタ全部") 'シート(マスタ全部)のデータを配列に取込 '(F2の部分とCount, 1の部分 →A~F列となる) With .Range("F2", .Cells(.Rows.Count, 1).End(xlUp)) 'Vに代入する事となる、検索する列の指定.Columns(1)=A列 v = .Columns(1).Value 'Wに代入する事となる、書出す値のある列の指定 (5)=E列 ●w = .Columns(5).Value End With End With Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(v) dic(v(i, 1)) = i Next With Sheets("抜取マスタ") '検索値のある列指定(A2の部分とCount, 1の部分→A列~A列) With .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)) v = .Value For i = 1 To UBound(v) If dic.exists(v(i, 1)) Then v(i, 1) = w(dic(v(i, 1)), 1) Else 'ヒットしない場合 v(i, 1) = "無" End If Next '書き出しする列を指定(Offset(, 5)=検索値のA列より右5つ→F列) ●With .Offset(, 5) .ClearContents .NumberFormat = "@" .Value = v End With End With End With Set dic = Nothing Debug.Print Timer - t End Sub

  • Excel VBAを使った重複行の抜き出しについて教えてください

    以下のような2シートから、重複する「商品番号」のあるsheet1の行を抜き出して、別シートに書き出したいと思っております。 sheet1  |  A   |  B   | C -+--------+-------+----- 1|      |      | -+--------+------+-------- 2|商品番号|商品名|責任者 -+--------+------+-------- 3|  123456|  ガム|山田太郎 -+--------+------+-------- 4| 2345678| チョコ|田中花子 ・・・ sheet2  |  A   |  B   | C -+--------+-------+----- 1|      |     | -+--------+------+-------- 2|商品番号|商品名|責任者 -+--------+------+-------- 3| 3987624|     | -+--------+------+-------- 4| 193678|      | ・・・ そこでVBAを作成したのですが、例えば商品番号「222011001」の行を抜き出したいのに、「22011001」の行も一緒に抜き出してしまいます。 どこがいけないのか、教えて頂けないでしょうか。 作成したVBAは以下の通りです。 VBA初心者で本を見ながら作ったため、大変見にくくなっているかと思います。申し訳ありませんが、どなたかおわかりになる方がいらっしゃいましたら、どうぞ宜しくお願い致します。 Option Base 1 Option Explicit Sub 重複データ抽出書き直し() Dim シート(2) As Worksheet Dim 比較列(2) As Integer Dim 一致セル As Range Dim 検索範囲 As Range Dim i As Integer Set シート(1) = Sheets("sheet1") Set シート(2) = Sheets("sheet2") 比較列(1) = 1: 比較列(2) = 1 シート(2).Activate ActiveCell.CurrentRegion.Select Selection.Offset(1, 比較列(2) - 1) _ .Resize(Selection.Rows.Count - 1, 1) _ .Select Set 検索範囲 = Selection Sheets.Add After:=Sheets(Sheets.Count) シート(1).Activate ActiveCell.CurrentRegion.Select Selection.Resize(1).Copy With Sheets(Sheets.Count).Range("A1") If Application.Version >= 9 Then .PasteSpecial 8 End If .PasteSpecial End With For i = 2 To Selection.Rows.Count Set 一致セル = 検索範囲.Find(Selection.Cells(i, 比較列(1)).Value) If Not 一致セル Is Nothing Then Selection.Offset(i - 1).Resize(1) _ .Copy Sheets(Sheets.Count) _ .Range("A65536").End(xlUp) _ .Offset(1) End If Next i Sheets(Sheets.Count).Activate End Sub

  • vba エクセル

    2行目から、最終行までEmptyにしたいのにならないです。 1行目はフィールド行なのに、そのままにしたいのですが 2行目から最終行は空白にしたいです。 なので Sub TEST() With Sheets("log") lastRow = .Cells(.Rows.Count, "b").End(xlUp).Row LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column .Range(.Cells(2, LastCol), .Cells(lastRow, LastCol)) = Empty End With End Sub としたのですが、何も起こりません。 lastRowは100、LastColは5なのですが、 このマクロを実行しても何も起こらないです。 なぜでしょうか?

  • 二つのマクロで一気に処理したい

    以下のようなことができるのかお伺い致します。よろしくお願い致します。  やりたいこと   ※ 前提として、sheet1にすでにA列に通し番号で奇数の数字が入っている。    1.sheet1からsheet2へコピペーストする。しかし、A列からO列のすべてにデータがあった場合のみコピー貼り付けさせたい。     (前提で示したように、A列に通し番号で奇数の数字が入っていて、A列のみ数字があり、以外が空欄の行があるため)    2.下記のコピー貼り付けのコードと重複削除のコードを合体させて、一つの処理で動かしたい。 Sub コピー貼り付けつけ()  'コピー貼り付けつけのコード Dim lastRow As Long 'Sheet1のA3から最終行までをコピー With Sheets("sheet1") .Range("A3:O" & .Cells(Rows.Count, "A").End(xlUp).Row).Copy End With 'Sheet2のA列の最終行の次の行に貼付け Sheets("sheet2").Cells(Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial Application.CutCopyMode = False End Sub Sub 重複データを一括削除する() ' Macro1 Macro Dim i As Long, lastRow As Long, myRng As Range LastRow = Cells(Rows.Count, "A").End(xlUp).Row For i = 1 To lastRow - 1 If WorksheetFunction.CountIf(Range(Cells(i + 1, "O"), Cells(lastRow, "O")), Cells(i, "O")) > 0 Then If myRng Is Nothing Then Set myRng = Cells(i, "O") Else Set myRng = Union(myRng, Cells(i, "O")) End If End If Next i If Not myRng Is Nothing Then myRng.EntireRow.Delete End If End Sub

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

  • VBAのソートで

    お世話になります。 初歩的な質問なのですが・・。 表のソートをしたいのですが、 表は2行目に見出しがあり3列で100行の構成です。 下記の様な記述で表の範囲をセットするところでエラー がかかってしまうのですが、どうしたらうまくいくでしょうか。 どなたかご教示頂きたく宜しくお願い致します。    記 Sub ソート() Dim myrhg As Range Dim myar As Variant Dim i As Long Sheets("台帳").Range("A1").CurrentRegion.Select Selection.Offset(1, 0).Select Set myrng = Selection.Resize(Selection.Rows.Count - 1).Select myar = Array(1, 2, 3) With myrng For i = 0 To UBound(myar) .Sort key1:=Cells(1, myar(i)), Order1:=xlAscending, header:=xlYes Next End With Set myrng = Nothing End Sub

  • VBAの配列について

    初めまして、VBAの配列の入力方法について質問させてください。 大量のデータの処理を高速化するため、配列を使用して以下のVBAを入力しました。 インターネットで調べ、見よう見まねで入力してみたものです…(T_T) 内容は、シート「資料」のC列とシート「Sheet1」のG列の文字列が同じ かつ、シート「資料」のL列から最終列(そのときによって変化します) とシート「Sheet1」のE列の文字列が同じ場合、 シート「資料」のA列~D列及びL列から最終列で文字列の一致したセルを 着色するというものです。 変数「アイス」と「チョコ」にそれぞれシート「資料」のデータと シート「Sheet1」のデータを格納したつもりなのですが、 実行したところ「配列がありません。」というエラーメッセージが 表示されました。 どうやらデータを配列として格納できていないときに表示される エラーメッセージのようなのですが、変数の型を変更してみたり、 配列をアイス(2)にしてみたりと、色々方法を変えて試してみたものの、 処理は成功しませんでした(T_T) 一体何が原因で処理が成功しないのか、どなたかご教授いただけると とても嬉しいです…!よろしくお願いいたします。 ちなみに、配列を使用しない場合の処理は、時間が15分ほどと かなりかかりますが、成功しています。 Application.ScreenUpdating = True Dim アイス, チョコ As Long Dim i As Integer, j As Integer, k As Integer アイス = Sheets("資料").Cells(Rows.Count, 1).End(xlUp).Row チョコ = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row For i = 3 To Sheets("資料").Cells(Rows.Count, 1).End(xlUp).Row For j = 12 To Sheets("資料").Cells(i, 12).End(xlToRight).Column For k = 2 To Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row If アイス(i, 3).Value = チョコ(k, 7).Value And アイス(i, j).Value = チョコ(k, 5).Value Then Sheets("資料").Range("A" & i & ":D" & i).Interior.ColorIndex = 22 アイス(i, j).Interior.ColorIndex = 22 End If Next k Next j Next i

  • VBAのファインドメソッドで検索すると対象外のデータが選択されることがある

    CDのリスト表(12列で、現在2269行 範囲名"収録表")Sheets("データ")から,キーワードで該当ディスクを検索し、 結果をSheets("検索")に転記する、プログラムを作りましたが、 仮に、該当データが10件、転記されたとして そのデータを見ると、中に1件、対象外のデータがはいっている事が たまにあります、いろんな原因を考えてみましたがわかりません。 もともと、VBAのファインドメソッドが、こんなエラーを起こしやすいのか、、、(そんな事、ないよね) どなたか、教えてください。 下が、プログラムです Sub 新規検索() Application.ScreenUpdating = False Dim myData, myRng As Range Dim myWord As String myWord = InputBox("キーワードを入力してください") データ処理中F.Show vbModeless データ処理中F.Repaint Set myData = Range("収録表") Set myRng = myData.Find(What:=myWord, LookIn:=xlValues, _ Lookat:=xlPart, MatchCase:=False, MatchByte:=False) If myWord = "" Then MsgBox ("キーワードを入力してください") Exit Sub End If If Not myRng Is Nothing Then Application.Goto Cells(myRng.Row, 1), True Else: Unload データ処理中F MsgBox ("該当データはありません") Exit Sub End If Sheets("検索").Range("K1") = myRng.Row '一番最初の検索値のRow Call コピー1 Do Until Range("K1") = Range("L1")   Call 次を検索 Loop Call 検索終了 Unload データ処理中F Application.ScreenUpdating = True End Sub Sub 次を検索() Dim myData, myRng As Range Sheets("データ").Select Set myData = Range("収録表") Set myRng = Cells.FindNext(after:=ActiveCell.Offset(1)) If myRng <> "" Then Application.Goto Cells(myRng.Row, 1), True End If Sheets("検索").Range("L1") = myRng.Row '2番目以降の検索値のRow   Call コピー2 End Sub Sub コピー1() Sheets("検索").Range("A3:L5000,L1").ClearContents Dim myData As Range Set myData = Range("収録表") Set motorng = Application.Intersect(myData, ActiveCell.EntireRow) Set sakiRng = Sheets("検索").Range("A65535").End(xlUp).Offset(1) motorng.Copy sakiRng Sheets("検索").Visible = True Sheets("検索").Activate End Sub Sub コピー2() Dim myData As Range Set myData = Range("収録表") Set motorng = Application.Intersect(myData,   ActiveCell.EntireRow) Set sakiRng = Sheets("検索").Range("A65535").End(xlUp).Offset(1) motorng.Copy sakiRng Sheets("検索").Visible = True Sheets("検索").Activate End Sub Sub 検索終了() Dim r As Long r = Range("A65536").End(xlUp).Row Range("A" & r).Select ActiveCell.FormulaR1C1 = "=COUNTA(R3C:R[-1]C)" MsgBox "全部で" & Range("A" & r).Value & "件ありました" Range("A65535").End(xlUp).EntireRow.ClearContents Call 行頭表示 End Sub

  • VBAデータ元から新規ブックに出力

    現在のブック内に出力されるとメモリの都合上時間がかかりすぎますそこで新規ブック1個に出力する構文を教えていただきたいのですが、宜しくお願いします。 Sub 1111() Dim c As Range Dim i As Integer, LastRow As Long Dim NewSheetName As String, MatchFlag As Boolean Application.ScreenUpdating = False NewSheetName = "" With Sheets("データ元") For Each c In .Range(.Cells(3, "B"), .Cells(Rows.Count, "B").End(xlUp)) MatchFlag = False If NewSheetName <> Year(c.Value2) & "年" & Month(c.Value2) & "月" Then NewSheetName = Year(c.Value2) & "年" & Month(c.Value2) & "月" For i = 1 To Worksheets.Count If Sheets(i).Name = NewSheetName Then Sheets(i).Cells.ClearContents MatchFlag = True Exit For End If Next i If MatchFlag = False Then Worksheets.Add after:=Worksheets(Worksheets.Count) ActiveSheet.Name = NewSheetName End If End If LastRow = Sheets(NewSheetName).Cells(Rows.Count, "A").End(xlUp).Row Sheets(NewSheetName).Cells(LastRow + 1, "A").Resize(1, 6).Value = .Cells(c.Row, "A").Resize(1, 6).Value Sheets(NewSheetName).Columns("A:F").EntireColumn.AutoFit '↑A列からF列まで自動幅調整してます Next .Activate End With Application.ScreenUpdating = True MsgBox "終了しました", vbInformation End Sub

  • エクセルVBAで(続)

    前日も質問(http://okweb.jp/kotaeru.php3?q=1480399)を出していたものですが、続きがあります。下記は今現在のコードです。 Sub 得意先追加()  Sheets("一覧").Unprotect Dim myRng As Range, a Sheets("新規").Copy before:=Sheets(4) With ActiveSheet .Unprotect 得意先シート登録.Show .Name = .Range("A4").Value & .Range("A3").Value .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True   Set myRng = Sheets("一覧").Range("A65536").End(xlUp).Offset(1) myRng.Value = .Range("A4").Value & .Range("A3").Value Sheets("一覧").Hyperlinks.Add _ Anchor:=myRng, _ Address:="", _ SubAddress:=myRng.Value & "!A1", _ TextToDisplay:=myRng.Value End With Sheets("一覧").Select Range("A4").Activate Selection.End(xlDown).Select ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub 実は一覧シートのA列はコード&得意先名ですが、B列には今期の売上合計(各得意のシートのP10をリンク貼付),D列には前期の売上合計(各得意先のP9よりリンク貼付)があります。 それで,得意先追加を実行しているときに一覧シートのB列・D列にシートの各セルをリンク貼付するにはということなんですが、教えていただけますでしょうか。 宜しくお願いします。