[[20090112161514]] 『オブジェクトが必要です』(Ali) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『オブジェクトが必要です』(Ali)

 Sub RowInsert()

   Dim myCol As integer
   Dim myRow As Integer
   If Worksheet.Cells(myRow, myCol) <> Worksheet.Cells(myRow, myCol - 1) Then

 データは1列目が同じ文字列(例えば34-5587のようなもの)で、
 2列目は降り順でソートされた正の整数です。

 これを用いて2列目の値が変わるごとに行挿入し、平均などを出力しようと思っています
 が、上記のIf Worksheet.Cells(myRow, myCol) <>.....の部分で「オブジェクトが必要で
 す」が現れてしまいます。理由と対処方法をご教授くだされば幸甚に存じます。

 Worksheet("Sheet1").Cells(myRow, ....
           ^^^^^^^
 の部分が抜けています。

 Dim myCol As integer
 Dim myRow As Integer

 myRow は Long 型にしておいた方がよいと思います。
 (seiya)


 こんにちは。かみちゃん です。

 seiyaさんからすでに書き込みがありますが、書きかけていたので、そのままアップさせていただきます。

 > データは1列目が同じ文字列

 そのデータは、どこのシートにあるのですか?
 Worksheet.Cells(〜
 の部分を
 アクティブシートなら、
 ActiveSheet.Cells(〜
 特定のシートなら、
 WorkSheets("Sheet1").Cells(〜

 また、複数のブックを開いているならば、
 WorkBooks("Book1.xls").WorkSheets("Sheet1").Cells(〜
 などとします。

 (かみちゃん)
 2009-01-12 16:53


ありがとうございます。

今度はWorksheet("Sheet1")部分で

 コンパイルエラー
 SubまたはFunctionが定義されていません。
 と出てしまいます。

また、ActiveSheetの場合は、アプリケーション定義、または......
が出てしまいました。


 こんにちは。かみちゃん です。

 > 今度はWorksheet("Sheet1")部分で 
 >
 > コンパイルエラー
 >  SubまたはFunctionが定義されていません。
 > と出てしまいます。

 seiyaさんから訂正があると思いますが、

 >> Worksheet("Sheet1").Cells(myRow, ....
 >>           ^^^^^^^
 >> の部分が抜けています。

 は、Worksheets("Sheet1")
             ^^^
 と、"s"が抜けていると思います。

 > ActiveSheetの場合は、アプリケーション定義、または...... が出てしまいました。 

 まずは、
 MsgBox ActiveSheet.Cells(1, 2).Address
 という記述を試してみてください。

 そうすると、myRow と myCol の値が何になっているかというのが問題です。

 MsgBox "myRowの値は " & myRow & vbCrLf & "myCol値は " & myCol
 If ActiveSheet.Cells(myRow, myCol).Value <> 〜

 というようにして、変数の値を確認してみてください。

 (かみちゃん)
 2009-01-12 17:24


 MsgBox ActiveSheet.Cells(1, 2).Addressは$B$1と返ってきました。

 MsgBox ("myRowの値は " & myRow & vbCrLf & "myCol値は " & myCol)は
 myRowの値は0 myColの値は0と返ってきました。

 申し遅れましたが、表の先頭行はフィールド名です。

 こんにちは。かみちゃん です。

 > myRowの値は0 myColの値は0と返ってきました。

 そうでしょうね。

 とりあえず、
 myRow = 2 '2行目からチェック
 myCol = 2 '2列目と1列目からチェック
 If ActiveSheet.Cells(myRow, myCol).Value <> 〜
 としてみてはいかがですか?

 (かみちゃん)
 2009-01-12 18:09


 とりあえず、コードの一部ではなく
 全体を載せておいてもらうのが
 良いのではないでしょうか。

 行の挿入・削除は 下から行うのが定石です。
 過去ログにもたくさんありますので
 探してみられても良いかもしれませんね。

 (HANA)

 こんにちは。かみちゃん です。

 > 2列目の値が変わるごとに

 であれば、
 If Worksheets("Sheet1").Cells(myRow, myCol) <> Worksheets("Sheet1").Cells(myRow, myCol - 1) Then
 ではなく、
 If Worksheets("Sheet1").Cells(myRow, myCol).Value <> Worksheets("Sheet1").Cells(myRow - 1, myCol).Value Then
 とするべきではないでしょうか?

 行と列が説明とコードが合っていないように感じます。

 なお、
 myRow = 3
 myCol = 2
 If Worksheets("Sheet1").Cells(〜
 というような感じにします。

 挿入に関しては、HANAさんの意見「下から行なうのが定石」に賛成です。

 (かみちゃん)
 2009-01-12 18:36


 Aliさん

 HANAさんと同意見で、やりたいことを説明してください。
 他の方法で簡単にできそうな気がします。
 (seiya)

やりたいことを説明してください。

ありがとうございます。はじめに書いたものではいけませんか?

データは1列目が同じ文字列(例えば34-5587のようなもの)で、 2列目は降り順でソートされた正の整数です。 これを用いて2列目の値が変わるごとに行挿入し、平均などを出力しようと思っています


 こんにちは。かみちゃん です。

 > はじめに書いたものではいけませんか?

 Sub RowInsert()

 End Sub
 の中身をすべて提示してみませんか?

 なお、

 > myRow = 3 '2行目からチェック
 > myCol = 2 '2列目と1列目からチェック
 > If ActiveSheet.Cells(myRow, myCol).Value <> 〜

 という私の提案は、試していただけていないのでしょうか?

 とりあえず、

 > ActiveSheetの場合は、アプリケーション定義、または...... が出てしまいました。 

 の対処策を説明させていただいたわけですが。

 (かみちゃん)
 2009-01-12 20:13


 こんにちは。かみちゃん です。

 > これを用いて2列目の値が変わるごとに行挿入

 本当は、今Aliさんができているコードを見せていただくのが、早いのですが、
 行挿入の部分だけ考えると、以下のような感じでできると思います。

 10行目から上方向にチェックしています。

 Sub Sample1()
   Dim myCol As Integer
   Dim myRow As Long

   myCol = 2
   For myRow = 10 To 3 Step -1
     If Worksheets("Sheet1").Cells(myRow, myCol).Value <> Worksheets("Sheet1").Cells(myRow - 1, myCol).Value Then
       Worksheets("Sheet1").Rows(myRow).Insert
     End If
   Next
 End Sub

 ↑のコードは、↓のように書くこともできます。

 Sub Sample2()
   Dim myCol As Integer
   Dim myRow As Long

   myCol = 2
   For myRow = 10 To 3 Step -1
     With Worksheets("Sheet1").Cells(myRow, myCol)
       If .Value <> .Offset(-1).Value Then
         .EntireRow.Insert
       End If
     End With
   Next
 End Sub

 (かみちゃん)
 2009-01-12 20:35


コードありがとうございます。Aliです・

>本当は、今Aliさんができているコードを見せていただくのが、早いのですが、

Sub RowInsert()

   Dim myCol As integer

   Dim myRow As Integer

   If Worksheet.Cells(myRow, myCol) <> Worksheet.Cells(myRow, myCol - 1) Then
Msgbox("How are you ?")
end if

私が書いたものは実質上の通りだけで、その導入部でこけたので。


 詳しいデータ配列があれば、ピボットテーブル/小計(SubTotal)等の機能でできると思いますが?
 (seiya)

 ちなみに、ループしない方法で

 Columns("a").Insert
 With Range("b2", Range("b" & Rows.Count).End(xlUp)).Offset(, -1)
     .Formula = "=if(b1<>b2,1,"""")"
     On Error Resume Next
     .SpecialCells(-4123, 1).EntireRow.Insert
     On Error GoTo 0
 End With
 Columns("a").Delete

 (seiya)

おかげさまで、解決しました。どうもありがとうございました。

 ↓のコメントを作成中判明したので。。。。
[[20090118153111]]『RangeのネストとWorksheetfunction.Average』(Ali)

 一番最後のseiyaさんのコードは、3行目を
     .Formula = "=if(c1<>c2,1,"""")"
 としておくのがよさそうに思います。

 (HANA)


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.