Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


11954 / 13645 ツリー ←次へ | 前へ→

【13097】データの変更について くーさん 04/4/23(金) 12:46 質問
【13099】追記です… くーさん 04/4/23(金) 12:57 質問
【13100】Re:データの変更について Asaki 04/4/23(金) 13:00 回答
【13101】Re:データの変更について Asaki 04/4/23(金) 13:06 回答
【13102】Re:データの変更について くーさん 04/4/23(金) 13:44 質問
【13103】Re:データの変更について Asaki 04/4/23(金) 13:56 回答
【13115】Re:データの変更について くーさん 04/4/23(金) 17:52 質問
【13118】Re:データの変更について Asaki 04/4/23(金) 18:01 回答
【13119】Re:データの変更について Asaki 04/4/23(金) 18:03 回答
【13125】Re:データの変更について くーさん 04/4/23(金) 19:09 質問
【13128】Re:データの変更について Asaki 04/4/23(金) 20:44 回答
【13130】Re:データの変更について くーさん 04/4/23(金) 21:13 質問
【13131】Re:データの変更について Asaki 04/4/23(金) 21:23 回答
【13132】Re:データの変更について くーさん 04/4/23(金) 22:04 質問
【13133】Re:データの変更について Asaki 04/4/23(金) 22:13 回答
【13134】Re:データの変更について Asaki 04/4/23(金) 22:18 回答
【13137】Re:データの変更について くーさん 04/4/23(金) 23:08 質問
【13140】Re:データの変更について くーさん 04/4/23(金) 23:53 お礼

【13097】データの変更について
質問  くーさん  - 04/4/23(金) 12:46 -

引用なし
パスワード
   皆さんこんにちは。
自分で考えてみるものの、行き詰まり利用させてもらってます。
いつもご回答してくれる方々、有難う御座います。

まず下記をご覧下さい。
Dim KaiinNo As Long, CellGyo As Variant
KaiinNo = Worksheets("解析").Range("C2")
CellGyo = Application.Match(KaiinNo, Worksheets("データ").Columns(1), 0)

If Worksheets("解析").Cells(KaiinNo, "B").Columns = 0 Then
Worksheets("データ").Cells(CellGyo, "AC").Value = Worksheets("データ").Cells(CellGyo, "AC") + 1
End If

シート『データ』と『解析』があります。
・『解析のC2』のNoを『データ』から探し出します。
・一致するNoがあり、かつ『解析B2』が 0 ならば『データのAC』の数値を +1 します。

しかし、これは1つだけの変更です。(動作は確認済)
これを500個分とかしたいのです。
一括で変更する方法って分かる方がいましたらお教え下さい。
只、500以上あるので、出来れば LOOP とかは避けたいんですけど。
良い方法ってあります…?

いつもいつも質問ばかり繰り返してスイマセンです。m(_ _)m

【13099】追記です…
質問  くーさん  - 04/4/23(金) 12:57 -

引用なし
パスワード
   >If Worksheets("解析").Cells(KaiinNo, "B").Columns = 0 Then
>Worksheets("データ").Cells(CellGyo, "AC").Value = Worksheets("データ").Cells(CellGyo, "AC") + 1
>End If

とありましたが、もう一度確認した所、
>If Worksheets("解析").Cells(KaiinNo, "B").Columns = 0 Then
0 以外でも +1 されてしまいました…。
おそらく『KaiinNo』の参照の仕方が間違ってると思います。

全体を通して、良い方法が分かる方がいましたら、お教え下さい。

【13100】Re:データの変更について
回答  Asaki  - 04/4/23(金) 13:00 -

引用なし
パスワード
   こんにちは。

コードはこれで全部ですか?
日本語と、処理内容が合ってないように見えますけど。

>『解析B2』が 0
>If Worksheets("解析").Cells(KaiinNo, "B").Columns = 0
列番号と比較しても意味がないのでは?
また、行番号が KaiinNo でOKなんですか?
多分、↓でしょう?
If Worksheets("解析").Cells(CellGyo, "B").Value = 0 Then

因みに、500件程度なら、処理速度的に問題が発生するとは思えませんが。

【13101】Re:データの変更について
回答  Asaki  - 04/4/23(金) 13:06 -

引用なし
パスワード
   ん?これも違う?
>If Worksheets("解析").Cells(CellGyo, "B").Value = 0 Then

>一致するNoがあり、かつ『解析B2』が 0 ならば『データのAC』の数値を +1 します。
If not IsError(CellGyo) And Worksheets("解析").Cells(2, "B").Value = 0 Then
?

【13102】Re:データの変更について
質問  くーさん  - 04/4/23(金) 13:44 -

引用なし
パスワード
   Asaki さん、いつも有難う御座います。
>If not IsError(CellGyo) And Worksheets("解析").Cells(2, "B").Value = 0 Then
コレで上手くいきました!

500以上あると言うのは、例えば『C2〜C500』と、一つ一つのセルに違うNoが入力されてると言う意味です。
説明不足でした。
『C2』の No の検索・処理が終ったら、次に『C3』の検索・処理・・・
と最後に入力されてるセルまで延々と続く処理です。
ちなみに『B』と『C』は必ず対になってるものとしてます。

何度も質問を繰り返し、申し訳ないです。

【13103】Re:データの変更について
回答  Asaki  - 04/4/23(金) 13:56 -

引用なし
パスワード
   >500以上あると言うのは、例えば『C2〜C500』と、一つ一つのセルに違うNoが入力されてると言う意味です。
2行目から500行目までループ処理したところで、たいして、処理に時間がかかるようなことはないと思いますけど。

他には、作業列を利用して、
そこに、データがあったら1、なければ0をセットする数式を入れて、その結果をAC列に加算貼り付け
とかでは?

【13115】Re:データの変更について
質問  くーさん  - 04/4/23(金) 17:52 -

引用なし
パスワード
   どもです。
何度もすいません。
今職場です。

ハッキリ言って、LOOP処理に戸惑っています。
KaiinNo = Worksheets("解析").Range("C2")
の『C2』を変数にしないとダメですよね?(当然だと思いますが)
>そこに、データがあったら1、なければ0をセットする数式を入れて、その結果をAC列に加算貼り付け

『B』が 1 だったり 0 だったりするので、一概にこの方法は使えないと思います。
現在色んなサイトを見回り調べ中です。

ん〜、頭痛い・・・。

【13118】Re:データの変更について
回答  Asaki  - 04/4/23(金) 18:01 -

引用なし
パスワード
   とりあえず、Loopは↓こんな感じで。
Sub test()

  Dim i    As Long
  
  For i = 2 To 500
    '処理
  Next i

End Sub

>KaiinNo = Worksheets("解析").Range("C2")

KaiinNo = Worksheets("解析").Cells(i, 3).Value
に変えます。

【13119】Re:データの変更について
回答  Asaki  - 04/4/23(金) 18:03 -

引用なし
パスワード
   >If not IsError(CellGyo) And Worksheets("解析").Cells(2, "B").Value = 0 Then
この 2 も i ですね。

【13125】Re:データの変更について
質問  くーさん  - 04/4/23(金) 19:09 -

引用なし
パスワード
   何度も何度もすいません。
感謝の言葉もないくらいです。

現在の記述はこうなっております。
Private Sub CommandButton1_Click()
Dim LastRow As Long, i As Long
LastRow = Worksheets("解析").Range("A65536").End(xlUp).Row

For i = 2 To LastRow
 Dim KaiinNo As Long, CellGyo As Variant
 KaiinNo = Worksheets("解析").Cells(i, 3).Value
 CellGyo = Application.Match(KaiinNo, Worksheets("データ").Columns(1), 0)
 If Not IsError(CellGyo) And Worksheets("解析").Cells(i, "B").Value = 0 Then
  Worksheets("データ").Cells(CellGyo, "AC").Value = Worksheets("データ").Cells(CellGyo, "AC") + 1
 End If
Next i
End Sub

以上で実行した所、
>KaiinNo = Worksheets("JIHARAI").Cells(i, 3).Value
で、『実行エラー'13':/型が一致しません』とエラーが出ます。
まぁ、 i が引っ掛かってると思いますが、ここで i を外すと動かないですよね?
i = *** の何かを書かないとダメなんでしょうか?

完全に「教えて君」になっておりますが、宜しくお願い致します。m(_ _)m

【13128】Re:データの変更について
回答  Asaki  - 04/4/23(金) 20:44 -

引用なし
パスワード
   まず、ループの中でDimはダメです。
先頭のiなどの宣言と同じ位置に移動しましょう。

>KaiinNo = Worksheets("JIHARAI").Cells(i, 3).Value
例えばi=2 のときは、C2の値を KaiinNo という変数に格納する、という意味ですが、
C列はLong型の変数に格納できるようなデータですか?
つまり、文字列が入っていたりはしませんよね?
また、iがいくつのときにエラーになりますか?

【13130】Re:データの変更について
質問  くーさん  - 04/4/23(金) 21:13 -

引用なし
パスワード
   >まず、ループの中でDimはダメです。
>先頭のiなどの宣言と同じ位置に移動しましょう。

あ”、そうなんですね…。
先頭に移動したら作動しなくて、
>KaiinNo = Worksheets("JIHARAI").Cells(i, 3).Value
が、『実行時エラー'1004':/アプリケーション定義またはオブジェクト定義のエラーです。』
と出て、下のループの中に移動しちゃったんです。

ループの中に置いてた時はちゃんと動いてくれて、+1 もちゃんとしてくれたんですが、【最後の最後にエラー】が出てしまいました。
C列に文字は入っていません。

いかがなものでしょうか?

【13131】Re:データの変更について
回答  Asaki  - 04/4/23(金) 21:23 -

引用なし
パスワード
   >先頭に移動したら作動しなくて
先頭、と言っても、
>Private Sub CommandButton1_Click()
の下ですよ?

>KaiinNo = Worksheets("JIHARAI").Cells(i, 3).Value
エラーが出たときの右辺はどうなってますか?
ひょっとして、からっぽでは?

【13132】Re:データの変更について
質問  くーさん  - 04/4/23(金) 22:04 -

引用なし
パスワード
   いつの間にか、シート名が変わってましたね。(^_^;)

現在の記述はこうなっております。
Private Sub CommandButton1_Click()
Dim LastRow As Long, i As Long
Dim KaiinNo As Long, CellGyo As Variant
KaiinNo = Worksheets("解析").Cells(i, 3).Value
CellGyo = Application.Match(KaiinNo, Worksheets("データ").Columns(1), 0)
LastRow = Worksheets("解析").Range("A65536").End(xlUp).Row

For i = 2 To LastRow
If Not IsError(CellGyo) And Worksheets("解析").Cells(i, "B").Value = 0 Then
Worksheets("データ").Cells(CellGyo, "AC").Value = Worksheets("データ").Cells(CellGyo, "AC") + 1
End If
Next i
End Sub

相変わらず
>KaiinNo = Worksheets("解析").Cells(i, 3).Value
でエラーが発生します。

エラーが出たときの右辺とは、どう言う意味でしょうか?

【13133】Re:データの変更について
回答  Asaki  - 04/4/23(金) 22:13 -

引用なし
パスワード
   。。。解りました。
ループの開始位置がおかしいです。

>例えば『C2〜C500』と、一つ一つのセルに違うNoが入力されてる
をループで処理しようとしているのですから、
>KaiinNo = Worksheets("解析").Cells(i, 3).Value
以降がループ内にないとおかしいのでは?
ただし、
>LastRow = Worksheets("解析").Range("A65536").End(xlUp).Row
の1行だけは、
>Dim KaiinNo As Long, CellGyo As Variant
の直ぐ下に移動しておきます。

【13134】Re:データの変更について
回答  Asaki  - 04/4/23(金) 22:18 -

引用なし
パスワード
   あれ?
>まず、ループの中でDimはダメです。
と書いたので、移動したのですね?
でも、どうして、Dim以外の行も移動するんですか?

>エラーが出たときの右辺とは、どう言う意味でしょうか?
とは、
>Worksheets("解析").Cells(i, 3).Value
がどうなっているのか?
ということです。
とりあえず、
>For i = 2 To LastRow
の下に、
MsgBox Worksheets("解析").Cells(i, 3).Value
として、どんな値が入っているのか確認してみてください。

それから、大前提ですが、
解析
という名前のシートは存在していますよね?

【13137】Re:データの変更について
質問  くーさん  - 04/4/23(金) 23:08 -

引用なし
パスワード
   >でも、どうして、Dim以外の行も移動するんですか?
つい・・・。
どうも私は基本的な事が抜けてるみたいですね。(^^ ;)

>MsgBox Worksheets("解析").Cells(i, 3).Value
ちゃんと『解析』にの C列 に入力されてる No が出ました。
『データ』の数値も更新(+1)されました。
しかし、最後にやはりエラーが出ました。

>解析という名前のシート
ええ、もちろん。
本当は『JIHARAI』と言う名前ですが、分かりやすい(?)ように『解析』と名前を変えて質問させてもらってます。

【13140】Re:データの変更について
お礼  くーさん  - 04/4/23(金) 23:53 -

引用なし
パスワード
   出来ました!
結果から言いますと、
>LastRow = Worksheets("解析").Range("A65536").End(xlUp).Row
で、B,C列のセルには式を入れてました。
しかし、A列の最後の2行はB,C列の式に当てはまらない数字が入力されていたのでエラーが発生したと思います。
そこで、
>LastRow = Worksheets("解析").Range("A65536").End(xlUp).Row - 2
としたら正常に動きました。

本当にスイマセン。
私の基本的なミスでした。
朝から晩まで付き合ってくれたAsakiさん。
本当に有難う御座いました。
本当に本当に感謝しております。
私も早く一人前になれるように頑張ります。

11954 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free