• ベストアンサー

エクセル追記処理でエラー

別のフォームで前の処理が既に書き込まれているエクセルシートに、 新たに処理結果を追記していきたいのですが、 「オブジェクトがありません」というエラーになってしまいます。 Setをどのように書けばよいのでしょうか。 Private Sub Command1_Click() Set xlApp = CreateObject("Excel.Application") xlFileName = strFileName Set xlBook = xlApp.Workbooks.Open(xlFileName) Set xlNeosheet = xlBook.Sheets.Item(1) Set Newsheet ★ここがわかりません n = 1 cnt = 0 rowNum = xlNeosheet.Range("A1").CurrentRegion.Rows.Count For i = 1 To rowNum shusseki = xlNeosheet.Cells(i, 5).Value If IsNumeric(shusseki) Then stno = xlNeosheet.Cells(i, 1) stno = Form7.Text1 & stno xlNewsheet.Cells(n, 6) = stno ☆ここでエラー n = n + 1 cnt = cnt + 1 For j = 2 To 5 xlNewsheet.Cells(cnt, j + 5).Value = xlNeosheet.Cells(i, j).Value Next j End If Next i 必要な部分だけ載せました。 よろしくお願いします。

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

  • ベストアンサー
回答No.2

過去の質問と今回の質問を眺めててなんとなく分かりかけてきました。 まず Set Newsheet ★ここがわかりません は Set xlNewsheet = ????? の間違いですね? 1~5列目に書かれた人の分を読み込む時と別の場所で6~10列目の人を読み込む事にしたんですか? 1~5列目を読んだ時に続けて読んだ方が、何度もファイルをオープンする必要が無くていいと思いますが・・。 別にするということで。 Dim newFilePath As String Dim xlNewBook As EXCEL.Workbook newFilePath = (取り出したデータの保存先のパス) '取り出したデータを保存しておいたEXCELを開く Set xlNewBook = xlApp.Workbooks.Open(newFilePath) '保存先のシートは1番目のシート Set xlNewsheet = xlNewBook.Sheets(1) '追記する位置を取得(今書かれている行数+1) n = xlNewsheet.Range("A1").CurrentRegion.Rows.Count + 1 ・・・あれ? やっぱり思っていた事と違うのかな? 1~5列目の値を持って来てますよね。 よく分からなくなって来ましたが、せっかく書いたので投稿しておきます(^^; imogasiさんの回答をよく読み、ここでする処理の目的を教えて下さい。

tomokoji
質問者

補足

申し訳ありませんでした。何とも自分勝手な質問の仕方でした。名簿作成システムを作っています。 フォーム(1)からの処理結果を出力したエクセルシートに、 続けてフォーム(2)の処理結果も出力したいと思っています。 フォーム(1)の処理結果は、(1,1)に番号、(1,2)に氏名という風に(1,1)から(1,5)までを一人分の情報としてエクセルのシートに出力したもので、 (2,1)から(2,5)までがまた一人分、と一行ずつに個人情報が入っているものです。 そのシートに続けてフォーム(2)の処理結果も出力していきます。 フォーム(2)では使用するデータが違うだけで処理内容はフォーム(1)と同じです。 例えば、フォーム(1)の処理結果が15行目まで出力されたものだったら、 フォーム(2)は16行目から出力させていきます。 お聞きしたいことは、 ・xlNewsheetをグローバル変数として使うことは可能か ・フォーム(1)から開いたエクセルシートは、一度閉じたり保存したりしなくてもフォーム(2)で開けるか の二点です。よろしくお願いします。 フォーム(1) Private Sub Command1_Click() Set xlApp = CreateObject("Excel.Application") xlFileName = strFileName ’一つ前のフォームからのファイルパス Set xlBook = xlApp.Workbooks.Open(xlFileName) Set xlNamesheet = xlBook.Sheets.Item(1) Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Add Set xlNewsheet = xlBook.Worksheets(1) ’出力用の新しいエクセルシートを開く n = 1 cnt = 0 rowNum = xlNamesheet.Range("A1").CurrentRegion.Rows.Count ’開いたエクセルのデータの行数を数える For i = 1 To rowNum shusseki = xlNamesheet.Cells(i, 5).Value ’5セル目(出席回数)をチェック If IsNumeric(shusseki) Then ’5セル目に数字が入っていればその人の情報(5セル分)を出力用の新しいエクセルシートに出力 stno = xlNamesheet.Cells(i, 1) stno = Form10.Text1 & stno xlNewsheet.Cells(n, 1) = stno n = n + 1 cnt = cnt + 1 For j = 2 To 5 xlNewsheet.Cells(cnt, j).Value = xlNamesheet.Cells(i, j).Value Next j End If Next i : フォーム(2) Private Sub Command1_Click() Set xlApp = CreateObject("Excel.Application") xlFileName = strFileName ’パス名はフォーム(1)と同じですがデータは別物です Set xlBook = xlApp.Workbooks.Open(xlFileName) Set xlNamesheet = xlBook.Sheets.Item(1) Set xlBook = xlApp.Workbooks.Add ’これは必要でしょうか? Set xlNewsheet = xlNewBook.Sheets(1) ’ここでエラーが出てしまいます。このxlNewsheetはグローバル変数で宣言してありフォーム(1)と同じもの、出力用のシートです rowNum = xlNamesheet.Range("A1").CurrentRegion.Rows.Count For i = 1 To rowNum shusseki = xlNamesheet.Cells(i, 5).Value If IsNumeric(shusseki) Then stno = xlNamesheet.Cells(i, 1) stno = Form7.Text1 & stno xlNewsheet.Cells(n, 1) = stno ’同じシートに出力 n = n + 1 cnt = cnt + 1 For j = 2 To 5 xlNewsheet.Cells(cnt, j).Value = xlNamesheet.Cells(i, j).Value Next j End If Next i :

その他の回答 (1)

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

回答が入らないのは、回答者に、このプログラムが何をしたいかを解析させているからではないでしょうか。他人の プログラムを辿るのは手間がかかるものです。 このプログラムが全体的に何をしたいのか、また出来れば逐次行的にコメントでもいれて質問すべきでは無いでしょうか。 >「Set Newsheet ★ここがわかりません」は意味が判りません。 NeosheetとNewsheetはミスタイプではないのですか。 >xlBook.Sheets.Item(1)はSheets(1)と同じでしょう。 他のコレクションの場合も同じですが、1つを特定する方法の1つでは。名前で特定、Indexで特定、Itemで特定の3つがあったと思います。 またVBAでも何言語でも、データの中身によってエラーが出る場合がある(むしろ多い)ので、一般的にはデータをみていない回答候補者が、エラー原因を究明することは非常に難しいものであることを知っていてください。そのカバーの努力は質問者が少しはすべきでは。

関連するQ&A

  • VBのテキストボックスの内容をExcelのセルに書き加える

    VBを実行し、フォームのテキストボックスに入力された文字列を あらかじめ読み込んでおいた既存のExcelシートのセルに 書き足したいです。 そのExcelシートのセルにはすでに「001」などの数字が 入っているのですが、その数字の前に「AB01」などの文字列を付け加えたいのです。 自分なりに作ってみましたがうまくいきません。 とりあえずソースを載せます。 わかる方いらっしゃいましたらよろしくお願いします。 Private Sub Command1_Click() Set xlApp = CreateObject("Excel.Application") xlFileName = strFileName Set xlBook = xlApp.Workbooks.Open(xlFileName) Set xlNameSheet = xlBook.Sheets.Item(1) cnt = 0 i = xlNameSheet.Range("A1").CurrentRegion.Rows.Count For i = 1 To 65 shusseki = xlNameSheet.Cells(i, 5).Value If IsNumeric(shusseki) Then cnt = cnt + 1 For j = 1 To 5 xlNewSheet.Cells(cnt, j).Value = xlNameSheet.Cells(i, j).Value xlNewSheet.Cells(cnt, 1).Value = Form10.Text1 Next j End If Next i xlApp.Visible = True Set xlNameSheet = Nothing Set xlNewSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing End Sub

  • EXCELのグラフ

    下のようにVBからExcel にデータを送りグラフを表示しています。 印刷プレビューを表示したときにグラフと表が表示されてしまいます。グラフだけを表示して表は表示をしたくないのですが どうすればいいのでしょうか お願いします。 Private Sub Command1_Click() Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets.Add Dim i As Integer Dim j As Integer For i = 2 To 6 For j = 2 To 6 xlSheet.Cells(j, i) = CInt(71 * Rnd + 30) Next j Next i xlSheet.Cells(2, 1) = "国語" xlSheet.Cells(3, 1) = "数学" xlSheet.Cells(4, 1) = "英語" xlSheet.Cells(5, 1) = "社会" xlSheet.Cells(6, 1) = "体育" xlSheet.Cells(1, 2) = "石原" xlSheet.Cells(1, 3) = "小泉" xlSheet.Cells(1, 4) = "田中" xlSheet.Cells(1, 5) = "平沼" xlSheet.Cells(1, 6) = "森山" Dim MyChart As ChartObject Set MyChart = xlSheet.ChartObjects.Add(10, 100, 600, 330) With MyChart.Chart .SetSourceData xlSheet.Range("A1:F6"), xlColumns .Axes(xlValue).MaximumScale = 100 .Axes(xlValue).MajorUnit = 20 .HasTitle = True .ChartTitle.Text = "中間テスト結果" .ApplyDataLabels (xlDataLabelsShowValue) .Location xlLocationAsObject, xlSheet.Name End With xlApp.Visible = True With xlSheet.PageSetup .PaperSize = xlPaperA4 .Orientation = xlPortrait .LeftMargin = xlApp.CentimetersToPoints(2) .RightMargin = xlApp.CentimetersToPoints(2) .TopMargin = xlApp.CentimetersToPoints(2.5) .BottomMargin = xlApp.CentimetersToPoints(2.5) .HeaderMargin = xlApp.CentimetersToPoints(1) .FooterMargin = xlApp.CentimetersToPoints(1) End With xlSheet.PrintPreview Set MyChart = Nothing Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing End Sub

  • 実行時エラー91について

    vbでエクセルにデータを入力したあと、2つのシートを選択し、 その後に両面印刷を行うプログラムを作成中ですが、 印刷の段階で 「実行時エラー91。オブジェクト変数または with ブロック変数が設定されていません。」 とのエラーがでます。 どの部分がおかしいのかわからないので教えて下さい。 Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Dim xlSheet2 As Excel.Worksheet Dim xlFile As String xlFile = App.Path & "表.xls" Dim MyFile As String MyFile = Dir$("表.xls") If Len(MyFile) > 1 Then Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(xlFile) Set xlSheet = xlBook.Worksheets("裏") Set xlSheet2 = xlBook.Worksheets("表") xlApp.Visible = True a1 = Label47.Caption a1 = Format(a1, "#,#") a2 = Label48.Caption m = a1 & "及び" & a2 & "とする。" For k = 1 To 18 s = Mid(m, k, 1) i = 8 + (k - 1) * 2 xlSheet.Cells(40, i).Value = s Next k Set xlSheet2 = xlBook.Worksheets("表") xlSheet2.Cells(4, 2).Value = Text11.Text xlSheet2.Cells(4, 10).Value = Text12.Text xlSheet2.Cells(4, 19).Value = Text13.Text xlBook.Sheets(Array("表", "裏")).Select ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True ←ここでエラー Set xlApp = Nothing Set xlBook = Nothing Set xlSheet = Nothing Set xlSheet2 = Nothing

  • ExcelのVBAがオーバーフローに!?

    読んで頂きありがとうございます。 以前に質問しました時に回答を頂き凄く助かっていたのですが、何故か「オーバーフロー」と表示されてしまいます。 ひょっとしたら桁なのかも知れません。 下記のVBAを教えて頂きしようしていました。 Option Explicit Sub Test() Dim c(), p(), q(), i, j, l, r, k As Long r = Range("B2").End(xlDown).Row l = Range("D2").End(xlDown).Row ReDim c(r - 2), p(r - 2), q(r - 2) For i = 1 To r - 2 c(i) = Cells(i + 2, 2).Value p(i) = Cells(i + 2, 3).Value q(i) = i + 2 Next i For i = 1 To r - 3 For j = i + 1 To r - 2 If c(i) > c(j) Then k = c(i) c(i) = c(j) c(j) = k k = p(i) p(i) = p(j) p(j) = k k = q(i) q(i) = q(j) q(j) = k End If Next j Next i For i = 1 To r - 2 Cells(i + 2, 7).Value = c(i) For j = 3 To r If Cells(j, 4).Value = c(i) Then Cells(i + 2, 8).Value = p(i) - Cells(j, 5).Value If p(i) - Cells(j, 5).Value <> 0 Then Range("B" & q(i)).Interior.ColorIndex = 6 Range("D" & j).Interior.ColorIndex = 6 End If Exit For End If Next j Next i For i = 3 To r k = 0 For j = 3 To l If Cells(i, 2).Value = Cells(j, 4).Value Then k = 1 Exit For End If Next j If k = 0 Then Range("B" & i).Interior.ColorIndex = 35 End If Next i For i = 3 To l k = 0 For j = 3 To r If Cells(i, 4).Value = Cells(j, 2).Value Then k = 1 Exit For End If Next j If k = 0 Then Range("D" & i).Interior.ColorIndex = 35 End If Next i End Sub デパックのClickすると15行目辺りの「k = c(i)」が黄色くなります。 正直言ってマクロとか全く解りませんが、コピーして使っていました。 どこをどう変更すれば良いのか教えて頂ければ助かります。 よろしくお願いします。

  • VBA 時間の抜き出しが上手く処理できない

    時間の抜き出しをするのに下記のコードを候補に挙げましたが、 「'コロンが2個の場合 (時:分:秒)」の場合は上手く処理できますが 「'コロンが1個の場合 (分:秒)」の数値が上手く処理できません。 ’----------------------------------------------------------------------- Option Explicit Sub コロンの数を数える() Dim i As Long, cnt As Long, n As Variant For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row cnt = 0 '←cntをリセット Do n = InStr(n + 1, Cells(i, "A"), ":") If n = 0 Then Exit Do Else cnt = cnt + 1 End If Loop If cnt < 1 Then MsgBox "[:]がありません。" '←cntが1未満のときにメッセージを発出します。 End Else Cells(i, "B").Value = cnt End If Next End Sub Sub 時間抜き出し() Dim i As Long, cnt As Long Dim n As Single For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row n = InStr(n + 1, Cells(i, "A"), ":") 'コロン「:」の位置を特定する If Cells(i, "B") = 1 Then 'コロンが1個の場合 (分:秒) Cells(i, "C").NumberFormatLocal = "h:mm:ss" If Mid(Cells(i, "A"), n - 2, 1) = " " Or Mid(Cells(i, "A"), n - 2, 1) = "(" Then '10分以下の場合 Cells(i, "C") = Mid(Cells(i, "A"), n - 1, 4) Cells(i, "C") = "0:" & Cells(i, "C") Else '10分以上 Cells(i, "C") = Mid(Cells(i, "A"), n - 2, 5) Cells(i, "C") = "0:" & Cells(i, "C") End If Else 'コロンが2個の場合 (時:分:秒) Cells(i, "C").NumberFormatLocal = "h:mm:ss" Cells(i, "c") = Mid(Cells(i, "A"), n - 1, 7) End If n = 0 Next End Sub

  • エクセルのVBA、ループ処理について

    if文とループ処理をどう組み合わせればいいのかわかりません 以下のコードで、iの数をを増やしていく処理を行いたいのですが、エラーがでてしまいうまくいきません どのように書けばいいのでしょうか 教えてください For i = 2 To 11 If Cells("4,i") > 80 Then Cells("5,i").Value = "A" ElseIf Cells("4,i") > 70 Then Cells("5,i").Value = "B" ElseIf Cells("4,i") > 60 Then Cells("5,i").Value = "C" Else Cells("4,i").Value = "D" End If Next

  • VBA For~Next 

    「wsData」の値を「wsInv」の指定セル(=●●●=16)から4つおきに処理したい。 01:Cells(16 + i * 4, 1) とすると「i」が大きいときに   「""」があると16からスタートしない 02:「For k = 0 To 50」を作成したが、何処に入れても上手く処理出来ない。 For i = 0 To 50 '行 For j = 6 To 28 '列 If wsData.Cells(10 + i, 3).Value = "" Then wsInv.Cells(●●●, 1).Value = wsData.Cells(10 + i, 1).Value wsInv.Cells(●●●, j - 2).Value = wsData.Cells(10 + i, 23 + j).Value End If Next j Next i お力添えをお願いいたします。

  • ソートの時間比較について

    ランダムな数値群をソートする際の時間比較をしています。 計測時間を見てみると バブルソート(交換法)<挿入<選択 の順番になるのですがこれってあってますか? Sub 基本選択法() t = Timer n = Cells(2, 3).Value swap = 0 compare = 0 For i = 1 To n - 1 For j = i + 1 To n If Cells(i, 1).Value > Cells(j, 1).Value Then wk = Cells(j, 1).Value Cells(j, 1).Value = Cells(i, 1).Value Cells(i, 1).Value = wk swap = swap + 1 'Sleep (300) 'Calculate End If compare = compare + 1 Next j Calculate Next i Range("C3").Select Selection.Value = compare Range("C4").Value = swap Range("C5").Value = (Timer - t) Range("C1") = "選択法" End Sub Sub 基本挿入法() t = Timer n = Cells(2, 3).Value swap = 0 compare = 0 For i = 2 To n For j = i To 2 Step -1 If Cells(j, 1).Value < Cells(j - 1, 1).Value Then wk = Cells(j, 1).Value Cells(j, 1).Value = Cells(j - 1, 1).Value Cells(j - 1, 1).Value = wk swap = swap + 1 Else Exit For 'Sleep (40300) 'Calculate End If compare = compare + 1 Next j Calculate Next i Range("C3").Select Selection.Value = compare Range("C4").Value = swap Range("C5").Value = (Timer - t) Range("C1") = "挿入法" End Sub Sub 基本交換法() ActiveSheet.Shapes("Button 1").Select Selection.Characters.Text = "並べ替え中" t = Timer n = Cells(2, 3).Value swap = 0 compare = 0 For i = n - 1 To 1 Step -1 For j = 1 To i If Cells(j, 1).Value > Cells(j + 1, 1).Value Then wk = Cells(j, 1).Value Cells(j, 1).Value = Cells(j + 1, 1).Value Cells(j + 1, 1).Value = wk swap = swap + 1 'Sleep (300) 'Calculate End If compare = compare + 1 Next j Calculate Next i ActiveSheet.Shapes("Button 1").Select Selection.Characters.Text = "基本交換法" Range("C3").Select Selection.Value = compare Range("C4").Value = swap Range("C5").Value = (Timer - t) Range("C1") = "交換法" End Sub

  • Excel VBA; 複数のループ処理

    ↓のようなコードがあります。 Dim i As Long, MaxRow1 As Long, MaxRow2 As Long MaxRow1 = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row MaxRow2 = Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row For i = 1 To MaxRow1 Worksheets("Sheet1").Cells(i, 1).Value = i . Next i For i = 1 To MaxRow2 Worksheets("Sheet2").Cells(i, 1).Value = i . Next i これらを最大行の多いシートに合わせて、パフォーマンスを良くしたいと思います。 同様の処理をシート1、シート2で実施しているので纏めて記述したいです。 シート1、シート2に対する処理をサブルーチンにする方法しかありませんか? どなたかお願いします。 If MaxRow1 >= MaxRow2 Then For i = 1 To MaxRow1 Else For i = 1 To MaxRow2 End If Worksheets("Sheet1").Cells(i, 1).Value = i Worksheets("Sheet2").Cells(i, 1).Value = i . Next i

  • エクセル2003のマクロが2010で使えない

    PC買い換えで、今まで使えていたマクロに下記のようなメッセージが表示されて 使えなくなりました。他人が作成したマクロでまた、私はVBAに詳しくありません。 !はこのマシンで利用できないため、オブジェクトをこのマシンで読み込めませんでした。 コンパイルエラー 変数が定義されていません。 以下記述の一部です。 Private Sub UserForm_Initialize()                    ←ここが黄色に Dim c As Control, i As Integer, j As Integer With data i = 1 Do Until .Cells(i + 1, 1).Value = "" i = i + 1 list01.AddItem .Cells(i, 2).Value For j = 1 To 6 list01.List(i - 2, j) = .Cells(i, j + 2).Value Next j list01.List(i - 2, 7) = .Cells(i, 1).Value Loop i = 1 Do Until .Cells(i + 1, 29).Value = "" i = i + 1 comb02.AddItem .Cells(i, 29).Value comb02.List(i - 2, 1) = .Cells(i, 30).Value comb02.List(i - 2, 2) = .Cells(i, 31).Value comb02.List(i - 2, 3) = .Cells(i, 32).Value comb02.List(i - 2, 4) = .Cells(i, 33).Value comb02.List(i - 2, 5) = Mid(.Cells(i, 29).Value, Len(.Cells(i, 29).Value) - 4, 2) comb02.List(i - 2, 6) = Right(.Cells(i, 29).Value, 2) Loop i = 1 Do Until .Cells(i + 1, 37).Value = "" i = i + 1 comb01.AddItem .Cells(i, 37).Value Loop cal01.Value = .Cells(2, 23).Value                   ← cal01が青く ymdStart = .Cells(2, 26).Value ymdEnd = .Cells(3, 26).Value Controls("opt0" & .Cells(3, 23)).Value = True chk01.Value = .Cells(4, 23).Value For Each c In Controls If Left(c.Name, 4) = "list" Or Left(c.Name, 4) = "text" Or Left(c.Name, 4) = "comb" Then c.ForeColor = .Cells(13, 25).Value c.BackColor = .Cells(16, 25).Value End If Next c End With With list01 If .ListCount = 0 Then If MsgBox("職員が登録されていません。", 48, ThisWorkbook.Name) = 1 Then End If Else ReDim GroupTable(.ListCount - 1, 1) i = 0 For j = 0 To .ListCount - 1 If .List(i, 0) <> .List(j, 0) Then i = j End If GroupTable(j, 0) = i Next j i = .ListCount - 1 For j = .ListCount - 1 To 0 Step -1 If .List(i, 0) <> .List(j, 0) Then i = j End If GroupTable(j, 1) = i Next j End If End With but07.ControlTipText = ThisWorkbook.Name & "の上書き保存" MsgMode = True Call cal01_Click Call opt04to05_Change End Sub どうしていいかわかりませんので、よろしくお願いします。 Windows7 Professional SP1 64

専門家に質問してみよう