• 締切済み

同じフォルダ内における複数ブックの特定項目集計

ExcelVBAにて、同じフォルダ内における複数ブックの特定項目(名前、住所)の集計しようと考えて、以下のように作成しましたが、シートの一行目しか取得できません。2行目以降も取得したいのですが、やり方についてご存じの方がいたら、ご教示ください。 'ボタンをクリックした時の処理 Public Sub sample() Dim wFile As String Dim wFilePath As String Dim i As Long 'Excelファイルが存在していたらファイル名を返す wFile = Dir(ActiveWorkbook.Path & "\*.xlsx") '先頭行を指定 i = 2 'カレントディレクトリに存在するExcelファイルを全て読み込む Do While wFile <> "" '開くExcelファイルのフルパスを取得 wFilePath = ActiveWorkbook.Path & "\" & wFile '名前・住所を取得し配列に格納する(区切り文字:|) strData = Split(File_Load(wFilePath), "|") '名前 Cells(i, 1) = strData(0) '住所 Cells(i, 2) = strData(1) 'ファイル名 Cells(i, 3) = wFile '次のExcelファイルを取得 wFile = Dir() '行数をカウント i = i + 1 Loop End Sub 'Excelファイルを開いてデータを取得 '戻り値:名前|住所 ( | で区切る) Function File_Load(ByVal wFilePath As String) As String Dim CurBookName As Variant Dim ColNo As Long Dim RowNo As Long Dim strValue As String Dim FoundCell As Range Dim i As Long 'ファイルを開く Workbooks.Open wFilePath '開いたExcelのファイル名を取得 CurBookName = Application.ActiveWorkbook.Name '検索する項目を配列に格納 wItem = Array("名前", "住所") Dim s As Long '検索する For i = LBound(wItem) To UBound(wItem) Set FoundCell = Cells.Find(What:=wItem(i)) If FoundCell Is Nothing Then '検索出来なかった場合 If i = 0 Then strValue = "" Else strValue = strValue & "|" End If Else '検索したセルに移動 FoundCell.Select ColNo = ActiveCell.Column '列番号を取得 RowNo = ActiveCell.Row '行番号を取得 '住所を取得する If i = 0 Then '最初の項目 strValue = Cells(RowNo + 1, ColNo).Value Else '2番目以降の項目は|で区切る strValue = strValue & "|" & Cells(RowNo + 1, ColNo).Value End If End If Next i '結果を返す File_Load = strValue '開いたExcelファイルを閉じる Application.DisplayAlerts = False '確認メッセージの非表示 Workbooks(CurBookName).Close Application.DisplayAlerts = True '確認メッセージの表示 End Function

みんなの回答

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.8

『名前』と『住所』双方を検索するコードを思いついて書いている点から、『名前』と『住所』は必ずしも隣り合わないって事なのかな? 例えば離れていたり、或いは逆になっていたりって感じとか? 書式が統一されてないって点で上記は気になる部分ですかね。

  • kkkkkm
  • ベストアンサー率65% (1601/2438)
回答No.7

> VBAをかじった知識しかない 自分でできないのですね。で、なんか半ば無理やりにやらされてる状態ですか。 多分以下のコードでできると思いますが、実際に動かしてみてください。 できるだけ元のコードを残しています。 Public Sub Test() Dim wFile As String Dim wFilePath As String Dim i As Long Dim Row_Count As Long '開いたブックのデータの行数 'Excelファイルが存在していたらファイル名を返す wFile = Dir(ActiveWorkbook.Path & "\*.xlsx") 'カレントディレクトリに存在するExcelファイルを全て読み込む Do While wFile <> "" '開くExcelファイルのフルパスを取得 wFilePath = ActiveWorkbook.Path & "\" & wFile '結果を一気に最終行からセルに代入 データは2列に決め打ち Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Resize(Row_Count, 2).Value = File_Load(wFilePath, Row_Count) 'ファイル名も一気に書き込み Cells(Rows.Count, "A").End(xlUp).Offset(1 - Row_Count, 2).Resize(Row_Count, 1) = wFile '次のExcelファイルを取得 wFile = Dir() Loop End Sub Function File_Load(ByVal wFilePath As String, ByRef Row_Count As Long) As Variant Dim CurBookName As Variant Dim wItem As String Dim FoundCell As Range Dim ColNo As Long Dim RowNo As Long wItem = "名前" Workbooks.Open wFilePath CurBookName = Application.ActiveWorkbook.Name With Workbooks(CurBookName).Sheets(1) .Activate Set FoundCell = .Cells.Find(What:=wItem) If Not FoundCell Is Nothing Then 'ここは直接FoundCellのRowとColumnを取れるのでセルに移動はいらない '検索したセルに移動 'FoundCell.Select 'ColNo = ActiveCell.Column '列番号を取得 'RowNo = ActiveCell.Row '行番号を取得 ColNo = FoundCell.Column '列番号を取得 RowNo = FoundCell.Row '行番号を取得 '行数を計算 Row_Count = .Cells(Rows.Count, ColNo + 1).End(xlUp).Row - RowNo '結果を一気に返す File_Load = .Range(.Cells(RowNo + 1, ColNo), .Cells(Rows.Count, ColNo + 1).End(xlUp)).Value End If End With Application.DisplayAlerts = False '確認メッセージの非表示 Workbooks(CurBookName).Close Application.DisplayAlerts = True '確認メッセージの表示 End Function

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.6

No.5です。 記載方法がどうとかよりも、複数のサイトに質問を上げてしまうと回答する側が違えば回答内容も色んなものが一気に流れ込みます。 経験不足であるならそれらを処理するのも大変でしょ。 更にそれぞれのサイトの回答者がダブっていれば『あっちとこっちとで言ってることが違う』などの混乱~放置になってしまいますからね。 まずは1つのサイトに絞ってどうしても解決しきれないようなら、その質問を閉じてから別のサイトで質問しましょう。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.5

自問自答ではなく『教えて!goo』で問われた事と返信をそのままコピペされているのでしょ。 解決に向けて動いないのか、又は協力業者の中に理解者がいるのか、その後に返信はありませんけどね。

yamato514
質問者

お礼

本当に不快な思いさせて、申し訳ありません。 VBAをかじった知識しかない私が、人数の削減の影響を受け、業務上やらざるを得ない状況になり、少しでもわかるように素人なりにコメントを補足したのですが、不適切な記載方法でした。 お許しください。

  • kkkkkm
  • ベストアンサー率65% (1601/2438)
回答No.4

自問自答してないで、やることやってください(笑)

yamato514
質問者

お礼

おっしゃるとおりです。 不快な思いさせて申し訳ありません。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

質問の標題が、「特定項目集計 」の「集計」とあるので、数字項目を合計するのかと思ったが、質問を読むと、1つのシートにデータ行を「集約」したい、ということのようだ。 紛らわしい。注意。 またコード行数が多すぎる。ここまで長くならない見込み。 この課題は、1か月に1回ぐらい質問が出る課題で、「またか」といったものだ。 ーー ・集約するシートは1ブックあたり1シートである、のかな。 ・シート名は(各ブックで)同じなのかな。共通するシート名部分があるのかな。後者ならその状況を説明が必要だろう。 ーー 集約用のブック以外を読んで、シートを名前で指定し(または探して)、 データをCurrentRegionなどで採ってコピーし、集約シートの(その時点での!)最終行の次の行以下に張り付ければ仕舞いではないか。 ・元データでは、住所・氏名以外の項目もデータ列としてあるのか? ・住所・氏名のある列の位置は、ブックごとにまちまちか? これらを注記すべきだろう。他人には判らないよ。 ーー 集約シートの尾の時点での最下行はEnd(xlIp)などを使うのが、常道だろう。 この手法は、小生などは、毎度使っているものだ(便利)。 ーー データのコピー貼り付けで、(各)別ブック・別シートーー>集約ブック・集約シートの2つか、別世界なので、それを表現する手法を学んだか?

yamato514
質問者

お礼

ご助言ありがとうございます。 また私の質問の仕方が悪く、皆さまにはお手数をおかけするばかりか、不快な思いさせてしました。 大変申し訳ありません。

  • kkkkkm
  • ベストアンサー率65% (1601/2438)
回答No.2

> 大変わかりにくくて申し訳ありません。 いえ、わかりますよ。多分(笑) 回答したコードはファイルを開くとか(すでにできているから)は除いていますので、そこは現在のコードにご自身で当てはめてやってみてくださいということなんです。 回答ではSheet2を参照してSheet2のデータをコードを書いているシートに転記していますので、Sheet2の部分を各ブックのシート1に設定し直すと、必要なデータ(2行目以降全て)が転記されます。1行目は項目名ですから2行目からですよね。

yamato514
質問者

補足

先ほど送付した補足コメントですが、シートとブックを取り違えて記載しておりましたので、一部修正いたします。 後、補足の説明を追加いたしました。 大変わかりにくくて申し訳ありません。 最終的には、集計用の一覧.xlsx(xlsm)ブックに集計ボタンを置いて、それをクリックすると各ブック(名前.住所 1.xlsx,名前 住所 2 xlsx)のシート1のデータが、一覧.xlsx(xlsm)ブックに転記されるようにしたいのです。 添付画像でいうと、名前.住所 1.xlsx シート1から、1行目 氏名 岡島 博・住所 東京都、2行目 山田 隆・堺市を転記するようにしたいのですが、一行目の氏名 岡島 博・住所 東京都しか上記のVBAでは転記されません。なお、岡田 敦 大阪狭山市は、名前 住所 2 xlsx シート1の一行目となります。 なお、名前.住所 .xlsxのブックは画像では1~2しかないですが、今後増えていきます。 補足説明 (1)「一覧.xlsm」と同じフォルダにある「○○○.xlsx」の「名前」と「住所」の列データとその「ファイル名」を「一覧.xlsm」にまとめるだけのような感じですが間違いありませんか? (2) 重複データはどうするのでしょうか?  (a) そのまま全て載せる  (b) どれか1つだけ載せる  (c) その他(具体的に説明して下さい) (3) 載せる順番になにかルールはありますか? (4) 実行ごとに1度データはクリアした方が良いですか?  (d) 毎回クリアする  (e) クリアせず追加していく  (f) その他(具体的に説明して下さい) (5) シートに関して  (g) 一番左のシートのみ処理する  (h)「○○○.xlsx」は全てのシートから1行目に「名前」と「住所」が有る物を使う  (i) その他(具体的に説明して下さい) (6) Excel のバージョンは何ですか?。 (1)お見込みのとおりです。 (2)重複データはそのままのせる形です。 (3)のせる順番は、前に日付か番号をつけ、その順序。 (4)クリアせずに追加していく。 (5)シートに関しては、一番左のシートのみで構いません。 (6)Excel 職場のものは2013なので、2013を使用します。

  • kkkkkm
  • ベストアンサー率65% (1601/2438)
回答No.1

こんな感じというものです。 Sheet2を対象にしていますが開いたブックを対象にしてください。 ブックを開かないのでwFilePathは""にしてその操作は除外しています。 Sub Test() Dim Row_Count As Long '開いたブックのデータの行数 '結果を一気に最終行からセルに代入 データは2列に決め打ち Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Resize(Row_Count, 2).Value = File_Load("", Row_Count) End Sub Function File_Load(ByVal wFilePath As String, ByRef Row_Count As Long) As Variant wItem = "名前" With Sheets("Sheet2") .Activate Set FoundCell = .Cells.Find(What:=wItem) If Not FoundCell Is Nothing Then '検索したセルに移動 FoundCell.Select ColNo = ActiveCell.Column '列番号を取得 RowNo = ActiveCell.Row '行番号を取得 '行数を計算 Row_Count = .Cells(Rows.Count, ColNo + 1).End(xlUp).Row - RowNo '結果を一気に返す File_Load = .Range(.Cells(RowNo + 1, ColNo), .Cells(Rows.Count, ColNo + 1).End(xlUp)).Value End If End With End Function

yamato514
質問者

お礼

早速回答いただきありがとうございます。

yamato514
質問者

補足

大変わかりにくくて申し訳ありません。 最終的には、集計用の一覧.xlsx(xlsm)ブックに集計ボタンを置いて、それをクリックすると各ブック(名前.住所 1.xlsx,名前 住所 2 xlsx)のシート1のデータが、一覧.xlsx(xlsm)ブックに転記されるようにしたいのです。 添付画像でいうと、シート1なら、1行目 氏名 岡島 博・住所 東京都、2行目 山田 隆・堺市を転記するようにしたいのですが、一行目の氏名 岡島 博・住所 東京都しか上記のVBAでは転記されません。なお、岡田 敦 大阪狭山市は、シート2の一行目となります。 なお、名前.住所 .xlsxのブックは画像では1~2しかないですが、今後増えていきます。

関連するQ&A

  • フォルダ内の複数ブックのデータとブック名を転記する

    フォルダの中に複数のExcelファイル(ブック)が入っており、 それら全てのブックデータの転記を一括して行うマクロを現在使用しています。(後述) <現在の利用状況> ・フォルダの中に複数のExcelファイル(ブック)が入っている。ファイルにつきシートは1つ(ひな形は同じ) ・ファイルを確認するまでデータが何行入っているか分からない ・貼り付ける際はシートの上部は意図的に消している <改善希望> ・どのファイルから貼り付けたか分かるように、A列にファイル名を追記したい(どの行にも) ・できれば先頭の3文字のみ VBA勉強中の初心者ですが、なるべく早く実装しないといけないので、困っています。。。。 ご教示頂けます様お願いいたします。 ========================= Sub データ集計() '集計シートを変数に格納 Dim ws As Worksheet Set ws = ActiveSheet '集計シートの最終行を取得 Dim LastRow As Long LastRow = ws.Cells(Rows.Count, 5).End(xlUp).Row MsgBox "このブックと同じフォルダにあるブックを全て統合します" 'このブックの保存されているフォルダのパス(番地;ディレクトリ)を変数に取得 Dim thisPath As String thisPath = ThisWorkbook.Path 'ディレクトリにあるExcelのファイル名を取得 Dim fileName As String fileName = Dir(thisPath & "\" & "*.xlsx") Dim i As Long 'ファイル名が無くなるまで繰り返す Do While fileName <> "" '開くワークブックを変数に代入 Dim bufBook As Workbook Set bufBook = Workbooks.Open(thisPath & "\" & fileName) '開いたブックの第1シートの全データ --> 集計シートの最終行 bufBook.Worksheets(1).Range("B14").CurrentRegion.Copy Destination:=ws.Range("B" & LastRow) '最初のループ以外では、タイトル行を削除しておく Dim LastRowSecond As Long LastRowSecond = LastRow + 13 If i > 0 Then ws.Rows(LastRow & ":" & LastRowSecond).Delete End If '開いたブックを閉じる bufBook.Close SaveChanges:=False '集計シートの最終行を再取得しておく LastRow = ws.Cells(Rows.Count, 7).End(xlUp).Row + 1 '次のファイル名が取り出される。 fileName = Dir() i = i + 1 Loop End Sub

  • 「'」もascで変換させたい

    A1に「'test」と入れると「test」になってしまいます。 そして、 Sub test() Dim MojiInt As Long Dim i As Long Dim myRow As Long Dim Moji As String MojiInt = Len(Cells(1, 1)) For i = 1 To MojiInt Moji = Mid((Cells(1, 1)), i, 1) If i = 1 Then Cells(1, 2) = Asc(Moji) Else Cells(1, 2) = Cells(1, 2) & "," & Asc(Moji) End If Next i End Sub をすると、 116,101,115,116 になります。 最初の「'」もascで変換させることは無理なのでしょうか?

  • 表を新しいブックに保存

    Sub 表を新しいブックに保存反映日ごと() Application.ScreenUpdating = False Dim フルパス As String, ファイル名 As String, パス As String, 新ファイル名 As String 新ファイル名 = ActiveSheet.Name フルパス = ActiveWorkbook.FullName ファイル名 = Dir(フルパス) 'パスを取得 パス = Replace(フルパス, ファイル名, "") '表の範囲選択をする Range("A1").Select Dim 行数 As Long, 列数 As Long 行数 = 1 列数 = 1 Do While Cells(行数, 1) <> "" 行数 = 行数 + 1 Loop 行数 = 行数 - 1 Do While Cells(1, 列数) <> "" 列数 = 列数 + 1 Loop 列数 = 列数 - 1 Range(Cells(1, 1), Cells(行数, 列数)).Select Selection.Copy '新しいブックを開く Workbooks.Add Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Do While Range("A2") <> "" Range("A1").Select '一番上の発売日の範囲を取得 Range("A2").Select Dim 列 As Long Dim i As Long 列 = 1 '列数を取得 Do While Cells(1, 列) <> "" 列 = 列 + 1 Loop 列 = 列 - 1 '発売日ごとのデータ量を取得 i = 2 Do Until Cells(i, 1) <> Range("A2").Value i = i + 1 Loop i = i - 1 '発売日のまとまりのデータ範囲を選択 Range(Cells(1, 2), Cells(i, 列)).Select '発売日ごとのデータをコピー Selection.Copy '発売日を取得 Dim 発売日 As Long 発売日 = Range("A2").Value '新しいブックを追加してシート名を発売日に設定 Workbooks.Add ActiveSheet.Name = 発売日 新ファイル名 = ActiveSheet.Name Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("A1").Select 'シート名をファイル名にして保存 ActiveWorkbook.SaveAs Filename:=パス & "メンテ_" & 新ファイル名 & ".xls", _ FileFormat:=xlExcel8, _ ReadOnlyRecommended:=False, CreateBackup:=False ActiveWindow.Close Range("A1").Select '保存された発売日分のデータを削除 Range(Cells(2, 1), Cells(i, 列)).Select Selection.Delete Shift:=xlUp Loop '不要になった表転記用ブックを閉じる Application.DisplayAlerts = False ActiveWindow.Close Application.DisplayAlerts = True Range("A1").Select Application.ScreenUpdating = True End Sub Sub 表を新しいブックに保存() Application.ScreenUpdating = False Dim フルパス As String, ファイル名 As String, パス As String, 新ファイル名 As String 新ファイル名 = ActiveSheet.Name フルパス = ActiveWorkbook.FullName ファイル名 = Dir(フルパス) 'パスを取得 パス = Replace(フルパス, ファイル名, "") '表の範囲選択をする Range("A1").Select Dim 行数 As Long, 列数 As Long 行数 = 1 列数 = 1 Do While Cells(行数, 1) <> "" 行数 = 行数 + 1 Loop 行数 = 行数 - 1 Do While Cells(1, 列数) <> "" 列数 = 列数 + 1 Loop 列数 = 列数 - 1 Range(Cells(1, 1), Cells(行数, 列数)).Select Selection.Copy '新しいブックを開く Workbooks.Add Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("A1").Select 'シート名をファイル名にして保存 ActiveWorkbook.SaveAs Filename:=パス & 新ファイル名 & ".xls", _ FileFormat:=xlExcel8, Password:="", _ ReadOnlyRecommended:=False, CreateBackup:=False ActiveWindow.Close Range("A1").Select Application.ScreenUpdating = True End Sub

  • ExcelのVBAでブックを保存

    住所録Aと住所録Bがあります。 AとBを比較して、差異をを別ファイルに出力しようとしています。 比較元となるファイルは、AでもBでもかまいません。 比較、判定、ファイルへの出力部分は、省略していますが、保存 する場合は、どこに行うのがよいのですか bookですか。sheetですか。 両方で、SaveAsができまが、使い分けがあるのでしょうか。 どのように使い分けするのでしょうか。 書き方、使い方のおかしいところを指摘して頂くとありがたい です。 --------------------------------------------------------------------------------------------------- Option Explicit Sub test() Dim ret As Integer Dim row1 As Long Dim col1 As Long Dim row2 As Long Dim col2 As Long Dim myRtn As Boolean Dim fno1 As String Dim fno2 As String Dim OutBook As New Workbook Dim OutSheet As New Worksheet Dim OutFileName As String Dim cnt As Integer Dim I As Integer ret = MsgBox("処理を開始します。" + Chr(13) + Chr(10) + "よろしいですか。?", _ vbYesNo + vbQuestion) If ret = vbNo Then End End If myRtn = Application.Dialogs(xlDialogOpen).Show If myRtn = False Then MsgBox "[キャンセル]が選択されました" & vbCr & _ "処理を終了します" Exit Sub End If fno1 = Application.ActiveWorkbook.Name myRtn = Application.Dialogs(xlDialogOpen).Show If myRtn = False Then MsgBox "[キャンセル]が選択されました" & vbCr & _ "処理を終了します" Exit Sub End If fno2 = Application.ActiveWorkbook.Name Set OutBook = Workbooks.Add Set OutSheet = ActiveSheet OutBook.Worksheets(1).Name = "テスト" OutFileName = "テスト.xls" With Application.Workbooks(fno1).Worksheets(1) row1 = 1 col1 = 1 cnt = 1 Do While .Cells(row1, 1) <> "" 処理 (省略) Loop End With MsgBox "処理が終了しました。", vbOKOnly + vbInformation, "確認" Application.Workbooks(fno1).Close Application.Workbooks(fno2).Close OutSheet.SaveAs Filename:=OutFileName OutBook.SaveAs Filename:=OutFileName OutBook.Close End Sub --------------------------------------------------------------------------------------------------- OutSheet.SaveAs Filename:=OutFileName or OutBook.SaveAs Filename:=OutFileName のどちらでも保存ができます。 また、書き方、使い方のおかしいところを指摘して頂くとありがたいです。

  • 返ってくる値が違う

    VBAでフォルダの中のファイルの個数を取得するコードなのですが Sub test1() Dim i As Long, buf, Path As String Path = ActiveWorkbook.Path & "\" buf = Dir(Path & "*.*") Do While buf <> "" i = i + 1 buf = Dir() Loop MsgBox "「" & ActiveWorkbook.Path & "」には、全部で" & i & "個のファイルがあります。" End Sub Sub test2() Dim Path As String Dim i As Long, FSO As Object, f As Object Path = ActiveWorkbook.Path & "\" Set FSO = CreateObject("Scripting.FileSystemObject") MsgBox "「" & ActiveWorkbook.Path & "」には、全部で" & FSO.GetFolder(Path).Files.Count & "個のファイルがあります。" Set FSO = Nothing End Sub Test1とtest2では返ってくる値が違うのですが なぜでしょうか? Test2はフォルダの個数も取得されてるのですか?

  • エクセルのマクロで複数セル指定は?

    以前(7月22日 質問No.936181)の質問でご回答を頂いたマクロなんですが、 Private Sub Worksheet_Change(ByVal Target As Range) Dim MyData As String Dim i As Integer Dim ImaNanji As String Dim SakkiNanji As String Dim ImaNanpun As String Dim SakkiNanpun As String SakkiNanpun = Cells(2, 3).Value ImaNanji = Cells(1, 3).Value ImaNanpun = Mid(ImaNanji, Len(ImaNanji) - 4, 2) If ImaNanpun <> SakkiNanpun Then Application.EnableEvents = False For i = 10 To 2 Step -1 MyData = Cells(i - 1, 2).Value Cells(i, 2).Value = MyData Next i MyData = Cells(1, 1).Value Cells(1, 2).Value = MyData Cells(2, 3).Value = ImaNanpun Application.EnableEvents = True End If End Sub A1のデータをB1からB10に一分おきにつぎつぎに書き込むというものなんですが、ひとつのセルではなく複数のセル(例えばA1からA30の30個のセル)をいっぺんに書き込むようにしたいのですが可能でしょうか? よろしくお願いします。

  • 1つのPCで同じマクロを複数動かす

    下記のマクロは、 A列にあるURLがSSL化(https)されているかを調べるものです。 このマクロで、いろんなURLを調べる作業があります。 その作業を早く完了させるために、下記のマクロを同時に動かそうと思っています。 しかし、エクセルを使えるPCが1つしかありません。 エクセルを2つ起動して、調べるURLを分けて、 2つのエクセルでマクロを同時に動かす。 これをやろうと思いましたが、かなりPCが重くなるし、 エクセルが度々フリーズしたみたいになります。 どうにか、1つのPCで下記のマクロを複数動かして、 いろんなURLを調べる作業を、早くに完了する方法はありますでしょうか? エクセル2016です。 よろしくお願いいたします。 Sub SSL() Dim objHttp As Object Dim nURL As String Dim strURL As String Dim i As Long, f As String, l As String Dim Lastrow As Long, getLine As Long Set objHttp = CreateObject("WinHttp.WinHttpRequest.5.1") On Error GoTo ErrHandler 'A1から getLine = Cells(Rows.Count, 2).End(xlUp).Row Lastrow = Cells(Rows.Count, 1).End(xlUp).Row If getLine = Lastrow Then MsgBox "既に終わっているか、データがないです。", vbExclamation: Exit Sub If getLine < Lastrow And Cells(1, 2).Value <> "" Then getLine = getLine + 1 Else getLine = 1 '最初の行が1行目からの場合 End If For i = getLine To Lastrow strURL = LCase(Trim(Cells(i, 1).Value)) 'A列の登録URL strURL = Replace(strURL, "https:", "http:") If strURL Like "http*" Then objHttp.Open "GET", strURL, False objHttp.send DoEvents 'ESC割り込み可能にする With objHttp If .Status = 200 Then nURL = .Option(1) 'WinHttpRequestOption_URL f = Mid(strURL, 1, InStr(strURL, "://")) l = Mid(nURL, 1, InStr(nURL, "://")) If nURL = "" Then Cells(i, 2).Value = "no URL" ElseIf nURL <> "" Then If LCase(f) = LCase(l) Then Cells(i, 2).Value = "non SSL" Else Cells(i, 2).Value = "https" End If End If Else Cells(i, 2).Value = "Err:" & .Status End If End With End If Endline: nURL = "" strURL = "" Next i MsgBox "Finished" Exit Sub ErrHandler: If Err() <> 0 Then Cells(i, 2).Value = Err.Number 'マイナスになるのは外部エラー GoTo Endline End If End Sub

  • 検索対象の行内容を代入してシートを印刷処理

    ワークシートにテキストファイルからデータを読み込み、その内容を別のフォーマットシートに貼り付けて印刷することを考えています。 今のところできているコードは以下の通りです。 Private Sub Workbook_Open() 'テキストデータを読み込み Dim Fname As String 'ファイル名 Dim rw As Long '書き出しの最初の行 Dim j As Long Dim u As Integer '配列の上限 Dim TextLine As String Dim LineBuf As Variant 'ラインバッファ Dim FNo As Integer 'ファイルNo Sheet1.Select Fname = Application.GetOpenFilename("tstnama(*.txt),*.txt") If Fname = "False" Then Exit Sub End If rw = 1 FNo = FreeFile() Open Fname For Input As #FNo 'ファイルインポート Do Until EOF(FNo) Line Input #FNo, TextLine LineBuf = Split(TextLine, "|") '配列の取り出し,区切り文字は、「|」 u = UBound(LineBuf) If u >= 0 Then ActiveSheet.Cells(rw + j, 1).Resize(, u + 1).Value = LineBuf End If j = j + 1 Loop Close #FNo '533の件数検索 Dim TargetStr As String, LastRow As Integer Dim TargetArea As Range, FoundCell As Range Dim R As Integer, N As Integer TargetStr = "533" LastRow = Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row Set TargetArea = Range(Cells(1, 1), Cells(LastRow, 1)) Set FoundCell = TargetArea.Find(what:=TargetStr, LookIn:=xlValues, _ LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False) If Not FoundCell Is Nothing Then R = FoundCell.Row N = 1 Do Set FoundCell = TargetArea.FindNext(after:=FoundCell) If FoundCell.Row = R Then Exit Do N = N + 1 Loop Else MsgBox "該当データがありません", vbCritical End If Set FoundCell = TargetArea.FindPrevious(after:=FoundCell) '印刷件数の確認と印刷フェーズへの移行処理 If vbYes = MsgBox("B796K533は" & N & " 件です。印刷しますか?", vbYesNo) Then R = FoundCell.Row N = 1 Do With Sheet2 .Cells(4, 4).Value = Sheet1.Cells(R, 2).Value .Cells(5, 4).Value = Sheet1.Cells(R, 3).Value .Cells(6, 4).Value = Sheet1.Cells(R, 4).Value .Cells(7, 4).Value = Sheet1.Cells(R, 5).Value & " " & Sheet1.Cells(R, 6).Value & " " & Sheet1.Cells(R, 7).Value .Cells(8, 4).Value = Sheet1.Cells(R, 8).Value .Cells(9, 4).Value = Sheet1.Cells(R, 9).Value .PrintPreview End With MsgBox N & "枚目プリント" Set FoundCell = TargetArea.FindNext(after:=FoundCell) If FoundCell.Row = R Then Exit Do N = N + 1 Loop Else MsgBox "該当データがありません", vbCritical End If Set FoundCell = Nothing Set TargetArea = Nothing End Sub テキストファイルの内容はシートに貼り付けたとき8列になっておりA列には重複する番号が数パターン振られていて行当たりはダブりません。 A列にある特定の文字列(コード内では533)の件数を検索し、それぞれの行内容をシートに代入して、そのシートを印刷しますので 「533の数を確認(印刷される枚数を確認)」 ↓ 「検索された533の行内容を上から順番(A1~A*)に印刷」 という段取りで行きたいと思っています。 コードを走らせると、533の件数はちゃんと合うのですがその行内容が反映されません。変数Foundcellが印刷フェーズに入った段階でA1の行に固定されているようでその行内容が件数分印刷されてしまいます。(コードではPrintPreviewなのでプレビュー画面で確認しています。) Foundcellへの渡し方がわるいのでしょうか?それとも、やはり特定の行内容を取得するには別に主キーのようなものを振らなければだめでしょうか? 533の後ろには534というように何パターンかあってそれらもあてがわれたフォーマットに代入して印刷していきたいので、これができれば後は繰り返しになりますから後一歩なのですが・・・。

  • Excelでwatabeさんに複数のセルを参照

    Excel2007でwatabe007さんに以前に作って頂いたこのようなソースがあります。 Sub Test4() Dim LastO As Long, LastG As Long Dim i As Long, str As String Range("D3", Cells(Rows.Count, "F").End(xlUp)).ClearContents LastO = Cells(Rows.Count, "O").End(xlUp).Row Range("A3:C3").Value = Cells(LastO, "O").Resize(, 3).Value str = Range("A3").Value & Range("B3").Value & Range("C3").Value For i = 3 To LastO   If str = Cells(i, "O").Value & Cells(i, "P").Value & Cells(i, "Q").Value Then     LastG = Cells(Rows.Count, "D").End(xlUp).Row + 1     If LastG < 3 Then LastG = 3     Cells(LastG, "D").Resize(, 3).Value = Cells(i + 1, "O").Resize(, 3).Value   End If Next End Sub これにいつも格子をつけて文字がセンターになるようにしたいですがどうすればよろしいですか?解答よろしくお願いいたします。

  • エクセル 検索コピーマクロ

    マクロで検索、抽出して別ファイルに保存したいのですが、 以下のようなマクロを教えてもらったのですが コピー先のセル位置を任意の位置に直したいのですが、 どうしてもわかりません どの部分をどう直せばよいのでしょうか? Option Explicit Sub copyTodayData() Dim dateToday As String Dim tempDate As String Dim lastrow1 As Long Dim lastrow2 As Long Dim i As Long Dim fileA As String Dim anotherBook As String Dim anotherFilePath As String fileA = ThisWorkbook.Name anotherBook = "別のファイル.xls" anotherFilePath = "C:\Documents and Settings\日本太郎\デスクトップ\どこかのフォルダ" '問い合せダイアログの表示をOFFにします Application.DisplayAlerts = False 'ファイルを開く ChDir anotherFilePath Workbooks.Open Filename:=anotherFilePath & "\" & anotherBook '問い合せダイアログの表示をONに戻します Application.DisplayAlerts = True 'ウインドウの切替 Windows(fileA).Activate '今日の日付を取得 dateToday = Date 'データ最終行を取得 lastrow1 = Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To lastrow1 If Cells(i, 1) = dateToday Then 'Range(Cells(i, 1), Cells(i, 4)).Copy 'コピー Windows(anotherBook).Activate 'ウインドウの切替 lastrow2 = Cells(Rows.Count, 1).End(xlUp).Row '別ブックの最終行 Cells(lastrow2 + 1, 1).Select ActiveSheet.Paste Windows(fileA).Activate 'ウインドウの切替 End If Next i MsgBox "実行しました" End Sub たぶん、lastrow2 = Cells(Rows.Count, 1).End(xlUp).Row '別ブックの最終行 Cells(lastrow2 + 1, 1).Select ここらへんというのは、わかりますが、 どこをどう変えたらいいかわかりません