繰り返し処理でEXCELデータをシートに取り込み

このQ&Aのポイント
  • 繰り返し処理を使用して、EXCELデータを【Sheet1】に取り込む方法を説明します。
  • 取り込んだデータの最終行のA3の文字列を変数に入れ、【Sheet1】の全セルをクリアします。
  • 2回目以降のデータと前回のデータの最終行のA文字列を比較し、一致した場合は処理を開始します。一致しない場合は最初から処理を始めます。
回答を見る
  • ベストアンサー

繰り返し処理で

以下のEXCELデータを【Sheet1】に取り込む 【Sheet1】       A      B    C 1 2008/1/1 0:00  100  100 2 2008/1/1 1:00  100  100 3 2008/1/1 2:00  100  100 この時最終行のA3の文字列を変数に入れる ↓ 【Sheet1】の全セルをクリア ↓ 【2回目のデータ】        A     B    C 1 2008/1/1 2:00  100  100 2 2008/1/1 3:00  100  100 3 2008/1/1 4:00  100  100 この時,1回目のデータの最終行だったA3の文字列【2008/1/1 2:00】と 2回目のデータのA1【2008/1/1 2:00】を比較して、 同じであれば、A2行目から処理を開始 ※ もし比較して一致しなければ1行目から処理 ↓ 【Sheet1】の全セルをクリア ↓ 2回目のデータの最終行だったA3の文字列【2008/1/1 4:00】と 3回目のデータのA1文字列を比較 一致したら2行目から処理 ↓ これの繰り返し処理 マクロを作ってみたのですが、何かもっとこうしたほうがいい様な書き方あれば 教えていただきたく思っているのですが・・・; あとContinueに代わる、繰り返し関数?ってありますでしょうか? ------------------------------------------------------------------------------- Gyo = 100 x = Null For h = 1 To Gyo  If h = 1 Then    'nullでない場合     if x := "" then       'A1とxを比較して同じであればコンティニュー       If x = Sheets(SheetName).Cells(1,1) Then          continue '←Forに戻る       End If     End If   else if h = Gyo then     '最終A行のデータをx変数に格納      x = Sheets(SheetName).Range("A100").End(xlUp).Row   End If Next h -------------------------------------------------------------------------------

質問者が選んだベストアンサー

  • ベストアンサー
noname#62235
noname#62235
回答No.1

・「1回目のデータ」「2回目のデータ」・・・はどこから「来る」のか? ・「○行目から処理をする」とあるが、処理とはいったいどんな処理なのか? がわからないと回答のしようがありません。 お書きになられているコードを見ても処理に相当する部分がないので、このコードを実行しても(今のところエラーが出て実行できないでしょうけど)何も起こらず時間がかかるだけになります。 ちなみに、ExcelVBAではC言語のContinueに相当するものはありません(Breakに相当するものはExit Forですが)。なので、GoToを使ってループの最後に飛ぶか、IFのロジックで組むしかありません。 あとご自身で書かれているコードの比較演算子?「:=」を言うものもExcelVBAにはありません(Pascalがお好きですか?)。普通に「=」です(オブジェクトの場合Isを使います)。

pou1986
質問者

お礼

大変遅くなって申し訳ございません。。 おかげさまで今は正常に動作いたしました ありがとうございます。

関連するQ&A

  • 比較して一致したら指定セルに貼り付け処理

    【Sheet1】の日付A1セルと【Sheet2】の日付A行を比較。 ※ 【Sheet1】の比較元はA1だけでいい 一致しなければ【Sheet2】のA行を一つ下げ、比較し直し、一致するまで比較 一致したら【Sheet1】のA列以降を全てコピーし【Sheet2】の一致した日付の隣B列に以下の様に貼り付けする 【Sheet1】            【Sheet2】     A        B   C       A 1 2008/1/2 0:45  72  99   1 2008/1/2 0:00 2 2008/1/2 1:00  76  84   2 2008/1/2 0:15 3 2008/1/2 1:15  19  45   3 2008/1/2 0:30 4 2008/1/2 1:30  30  78   4 2008/1/2 0:45 5 2008/1/2 1:45  56  33   5 2008/1/2 1:00 ↓『結果』 【Sheet2】    A          B 1 2008/1/2 0:00 2 2008/1/2 0:15 3 2008/1/2 0:30 4 2008/1/2 0:45  2008/1/2 0:45 72 99 5 2008/1/2 1:00  2008/1/2 1:00 76 84 6 2008/1/2 1:15  2008/1/2 1:15 19 45 7 2008/1/2 1:30  2008/1/2 1:30 30 78 8 2008/1/2 1:45  2008/1/2 1:45 56 33 -------------------------------------------------------------------------- Dim i As Integer Dim Com As Integer Dim s As Integer SheetName = "Sheet1" SheetName2 = "Sheet2" Do For Com = 1 To 20 ' Sheet1のA1とSheet2のA行セルが一致するまで比較 If StrComp(Worksheets(SheetName).Cells(1, 1), Worksheets(SheetName2).Cells(Com, 1), vbTextCompare) Then ' 一致したらA列をコピー Rows("1:1").Select Selection.Copy Else ' 一致しなければSheet2のAセルを一つ下げる WorkSheets(SheetName2).Cells(Com, 1).Offset(1, 0).Select End If Next ' 一致するまで比較 Loop Until StrComp(Cells(1, 1), Cells(s, 10)) -------------------------------------------------------------------------- Loop Untilの箇所で記述がおかしいせいかアプリケーション定義、またはオブジェクトエラーになってしまいます。 一致した時、Sheet1のA1列の情報をSheet2の指定箇所に格納する記述の仕方がどうしてもわかりません。 何かいい記述はないでしょうか? 質問が長くなってしまいましたが、どうか教えていただきたく思います。 よろしくお願いします。

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

    以下のようなことができるのかお伺い致します。よろしくお願い致します。  やりたいこと   ※ 前提として、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

  • このコードの修正点はありますか?

    Private Sub Clear() With Worksheets("abc") With .Range("A2", .Range("A" & Rows.Count).End(xlUp)) If .Row = 2 Then .EntireRow.Resize(, 7).ClearContents End If End With End With End Sub シートabcの、A2から最終行まで取得。 A2からA15までデータがあれば、それらの行のG列までクリア。 というコードですが、 If .Row = 2 Thenというのは、2行ならという意味ではないのですか? 1行でもデータがあればクリアにしてもらいたいのですが、 If .Row > 0 Thenみたいな感じにならないのでしょうか? 教えていただいたコードですが、この部分がわからないです。 ご教授くださいませ。

  • EXCEL VBAについて

    EXCEL VBAについて教えてください やりたいことは以下の通りです。 ・全シートJ列1~100行目を検索しアルファベットが含まれるセルが存在すれば 上のセルをコピーする ここまで作ったのですが上手くいきません Sub VBAsample() Dim GYO As Long For GYO = 1 To 100 If Find([a-z], LookAt:=xlPart) Then Cells(GYO, 10).Value = Cells(GYO - 1, 10).Value End If Next GYO End Sub 添削をお願いします

  • Worksheet_SelectionChangeについて

    Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim GYO As Long ' 8列目のみを対象とする If Target.Column <> 8 Then Exit Sub Else GYO = Target.Row End If ' 8列目が空欄でなければ計算処理を呼び出す(引数は選択行) If Cells(GYO, 8).Value = "" Then Exit Sub Else: Call KEISAN(GYO) End If End Sub という方法で8列目のセルをクリックするとフォームが立ち上がるようにしているのですが、ドラッグによる範囲選択でも8列目が含まれているとフォームが立ち上がってしまいます。 単一セルの選択時のみにするにはどうしたらいいでしょうか。 それとすべてのシートにこのマクロを書いているのですがworkbook全体でやることはできないのでしょうか? Workbookのところにこのコードを入れてもうまくいきませんでした。

  • 転記の仕方

    Sub 入力する() If AIRシート.Range("A1").Value = "A" Then Dim AIRシート最終行 As Long AIRシート最終行 = AIRシート.Range("A65536").End(xlUp).Row + 1 If AIRシート最終行 = 30 Then MsgBox "AIRシートがいっぱいです " Exit Sub Else End If AIRシート.Range("A" & AIRシート最終行).Value = 入力シート.Range("A1").Value AIRシート.Range("B" & AIRシート最終行).Value = 入力シート.Range("B1").Value MsgBox "入力完了" Else End If End Sub ●質問● 今、"入力シート"のA1に『A』と入力しマクロを実行すると"AIRシート"のA列、B列に入力シートのA1、B1の値が次々と転記されるようにしてるのですが、これを入力シートのA1だけではなく、A1~A3まで入力することが出来、実行すると全てが転記できるようにしたいのですが。 ※A2,A3は入力しないときもあります。 If AIRシート.Range("A1").Value = "A" Then           ↓          ("A1:A3") みたいな感じでです。

  • VBA 処理の途中でエラーが出る

    VBA初心者です。 シート1とシート2があり、 シート1の表の列Mと列Nにそれぞれシート2のデータを参照する COUNTIFS関数を入れたいと思い、以下のように作成しました。 ※シート1は場合よって行の最後行が違います。 Dim Test As String Dim Test2 As String Dim i As Long For i = 1 To Cells(Rows.Count,1).End(xlUP).Row Test=Range("A" & i ) If MyStr<>""Then Range("M" & i) ="=COUNTIFS(Sheet2!,A:A"& Test &",Sheet2!B:B,M1"&")" End If Test2=Range("A" & i ) If MyStr<>""Then Range("N" & i )="=COUNTIFS(Sheet2!,A:A"& Test2 &",Sheet2!B:B,N1"&")" End If Next i この内容にて、処理が成功していたのですが、 急に、行150のあたりで処理が止まり、実行時エラー(アプリケーション定義またはオブジェクト定義のエラーです) が出るようになりました。 行150より上の方は、列Mと列N共にCOUNTIFS関数が入っています。 この場合、どのようにすればよろしいのでしょうか? エラーの対処、または別の記述方法があれば、ご教授頂きたく存じます。

  • プログラムの作り方

    まったくの素人です。 1列にあるデータをキーにして情報の抽出をしたいのですが うまくコードが書けません。 何卒、助勢頂ければ幸いです。 よろしくお願いいたします。 具体的な内容) B列 C列 x  11 ・・適当な不要なデータが数行 y  (2A) ・・適当な不要なデータが数行 x  12 ・・適当な不要なデータが数行 y  (44) ・・適当な不要なデータが数行 x  39 ・・適当な不要なデータが数行 y  (7) ・・適当な不要なデータが数行 から、xのデータとyのデータの表を作りたい。 ただし、yのデータ()内はB列のyの次の行。 できれば、抽出したデータはシート2に並べたい。 Sub macro() Dim a As String Dim b As Variant Dim c As range Dim i As Integer a = x b = "y" i = 1 Worksheets("sheet1").range("B1").Activate For i = 1 To 5000 With ActiveCell If .Value = a Then ActiveCell.Offset(0, 1).Copy Worksheets("sheet2").Select Cells(i, 1).Select ActiveSheet.Paste Sheets("sheet1").Select Else ActiveCell.Offset(1, 0).Activate End If If .Value = b Then ActiveCell.Offset(1, 0).Copy Worksheets("sheet2").Select Cells(i, 2).Select ActiveSheet.Paste Sheets("sheet1").Select Else ActiveCell.Offset(1, 0).Activate End If End With Next End Sub

  • セル範囲指定方法

    VBAにて下記作成中ですが、行き詰ってしまいました。 どなたか、ご教授願います。 Sub 転記ボックス1_Click() Sheets("S").Select Range("N13").Select If ActiveCell.Value <> "" Then Selection.Copy Sheets("H").Select Range("K65536").End(xlUp).Offset(0, 1).Select --->シートH、K列最終行の右隣からL列最終行の範囲を指定 上記指定範囲内全てに、シートS・N13の値を貼付 ElseIf ActiveCell.Value = "" Then Sheets("H").Select Range("K65536").End(xlUp).Offset(0, 1).Select --->シートH、K列最終行の右隣からL列最終行の範囲を指定 上記指定範囲内全てに、”シートS・N13”と入力 End If End Sub --->部分の書き方がわかりません。 よろしくお願いします。

  • 振分け処理の問題点、教えてください

    見よう見まねで、下記コードを何とか作ってエラーせず処理できましたが、 もう一ひねり? いや二ひねりができません (TT) 商品シートを変数にして、ループ?で同ブック内の商品シートに振り分けたいのです ■下記コード結果の問題点 ・商品シートをループ処理できません(どこにFor分?Loop分?置き方、何かゴチャゴチャになって・・・) ・抽出はOKですが、商品シートの項目も一緒にA5から貼り付けられてしまう ・AutoFilterでシート1からコピーの際、商品シート名除いてコピーできないか?(B5からデータだけほしい) ・各商品シートにはデータを残しておきたいので、貼り付けの際、最終行に追加していく ■シート1 注文データ (1行目に項目、2行目からデータ)週一回更新 A列 商品シート名 /B列 注文NO /C列 商品名 /D列 個数 /E列 備考 ↓ ランダムに100件ほど ■商品シート 同ブック内に商品種類分を作成済み (4行目に項目、5行目からデータ) A列 空き     /B列 注文NO /C列 商品名 /D列 個数 /E列 備考 3日間悩んでいます、どなたか助けてください ----------------------------------- '受注シートから各商品シートへの振分け Private Sub CommandButton1_Click() '注文シートからデータ抽出 Worksheets("シート1").Activate Range("A1").AutoFilter Field:=1, Criteria1:="商品シート" Worksheets("sheet1").AutoFilter.Range.SpecialCells(xlCellTypeVisible).Copy '商品有効チェック Set dumu = Range("A2").CurrentRegion umu = dumu.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1 If umu = 0 Then MsgBox "商品がありません" GoTo syuryo Else 'シート名と商品コード一致チェック貼り付け For Each Wh In Worksheets If Wh.Name Like "商品シート" Then Worksheets("商品シート").Activate With ActiveSheet .Range("A5").PasteSpecial xlPasteValues .Range("A1").Select End With End If Next End If syuryo: Worksheets("シート1").Activate Worksheets("シート1").AutoFilterMode = False Application.CutCopyMode = False Range("A1").Select End Sub

専門家に質問してみよう