ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

エクセル大好きコミュの☆シートは広い!★崖ってあるのですか?

  • mixiチェック
  • このエントリーをはてなブックマークに追加
『2つのcsvファイルの証明 (2007年12月08日 ) 』ノリベルさんのトピから枝分かれ派生で・・

【65536行 X 256列】
シートの広さを意識したことなどなかったのですが

ノリベルさんのトピに啓発されながら・・

【脳トレ・挑戦中の配列関数で】(画像1)

{=SUM(IF('CSV-A'!A1:E4='CSV-B'!A1:E4,0,1))}

(シート・CSV-Aとシート・CSV-BのA1〜E4のデータを比較して一致=0、不一致=1のうえ、合計。
合計=0=一致。 <>0が不一致。  の組立でやってみました。)

★範囲(A1〜IU65535)は走ることは走るようですが・・
★全範囲では(オーバーフローしました)
★また範囲を拡げていくと「実務には応えられないスピード」とか・・


【不一致の場所は?・・関数処理が思いつかず、無謀にVBAで】(画像2)

Sub chkData()
Dim retu As Long, gyo As Long

With Sheets("chk")

For gyo = 1 To 100
If gyo > 100 Then Exit For

For retu = 1 To 100

If Worksheets("CVS-A").Cells(gyo, retu).Value = Worksheets("CVS-B").Cells(gyo, retu).Value Then
.Cells(gyo, retu).Interior.ColorIndex = 28

Else: .Cells(gyo, retu).Interior.ColorIndex = 3
.Cells(gyo, retu).Value = "不一致"

End If

Next retu

retu = 1

Next gyo

End With
End Sub




★上記と同じです(スピードはさらに遅くなってしまいました)
★全範囲では(応答なし)でした。


☆☆☆
質問の1・は  実務的に処理するのにシートの拡がりに制限的なモノがあるのでしょうか。

2・は上記脳トレの考え方へのアドバイスのお願いです。


☆☆☆よろしくお願いします・・misasi

コメント(12)

misasi さん こんばんは

>★上記と同じです(スピードはさらに遅くなってしまいました)
サンプル書いてみました。
シート1のA1〜A30000とB1〜B30000を比較してます。
同じならC列に"○"を、違えば"×"を表示します。

最初に
Test1を実行すると比較するデータをA・B列に作成します。

その後
Test2を実行して下さい。C列に結果を表示します。

参考になればよいのですが。
勘違いならm(_ _)m


Option Base 1
'=================================================
Sub Test1()
'A列・B列にサンプル作成・各列30000行
Dim WS1 As Worksheet
Dim buf1(30000, 1) As Long
Dim buf2(30000, 1) As Long
Dim f As Long
Set WS1 = Worksheets("Sheet1")
For f = 1 To 30000
   buf1(f, 1) = Int(Rnd() * 3 + 1)
   buf2(f, 1) = Int(Rnd() * 3 + 1)
Next
With WS1
   .Range("A1").Resize(30000, 1).Value = buf1
   .Range("B1").Resize(30000, 1).Value = buf2
End With
End Sub
'==================================================
Sub Test2()
'A列とB列を比較して、同じなら"○",違えば"×"
Dim WS1 As Worksheet
Dim buf1 As Variant, buf2 As Variant
Dim myAns(30000, 1) As Variant
Dim f As Long, ff As Long

Set WS1 = Worksheets("Sheet1")
With WS1
   buf1 = .Range("A1:A30000").Value
   buf2 = .Range("B1:B30000").Value
End With

For f = 1 To 30000
   If buf1(f, 1) = buf2(f, 1) Then
      myAns(f, 1) = "○"
   Else
      myAns(f, 1) = "×"
   End If
Next
WS1.Range("C1").Resize(30000, 1).Value = myAns
End Sub
))hinekureさん おはようございます。

さっそくに、アリガドウございます。

☆いつも見事なVBAです。
(ただ感覚的にイイナ〜としか思うことの出来ないことがサビシイのです、が脳トレ・ジイジには興味はつきないのですあっかんべー

☆☆バッファ!
(脳内バッファに問題ありの文章ですから意味不明はご寛容くださいあせあせ

1)バッファ・エリアに一時的に処理データの全てを配置することで、大量なデータ処理時間を短縮する、と云う効果が期待さるのでしょうか?

☆☆ご手数おかけしますが

?"A"シートと"B"シートのA1〜Z100のデータを比較する

?比較の結果を"CHK"シート(A1〜Z100)へ

  「一致」 → color "28"
  「不一致」→ Color "3"  "不一致"

 上記の条件でのVBAをご披露いただけませんか。


☆☆出来れば・・

?比較の結果を  一言「一致」あるいは「不一致」と表示して
         不一致のときは不一致セルを表示("F5""H34""I66""X99"のイメージ)

☆☆さらにあせあせ(飛び散る汗)

本格的にと云うのではなく、興味(脳トレ)レヴェルのモノですが
「VBA」にユルリン取り組んでいける「参考書」みたいなのはないでしょうか。

取り組み方なども(こちらの方が嬉しいのですが)ご指導いただけませんか

かたつむり。。よろしくです。
misasi さん こんにちは

スピードを考えないなら
misasi さんが最初書かれたコードを少し訂正したのが下記コードです。
ほとんど違いませんよね。不要なコードを取っただけです。

Sub Test()
Dim f As Long, ff As Long
For ff = 1 To 26
   For f = 1 To 100
      If Worksheets("A").Cells(f, ff).Value = _
         Worksheets("B").Cells(f, ff).Value Then
         Worksheets("CHK").Cells(f, ff).Interior.ColorIndex = 28
      Else
         Worksheets("CHK").Cells(f, ff).Interior.ColorIndex = 3
         Worksheets("CHK").Cells(f, ff).Value = "不一致"
      End If
   Next
Next
End Sub

>?比較の結果を  一言「一致」あるいは「不一致」と表示して
何所に表示するかによってコードが違ってきます。
表示する場所はどこでしょう。
))hinekureさん 有難うございます。


? 表示する場所はどこでしょう。 > "CHK2"シートに

  単純に  "CHKの結果は→"の表示をC2セルに表示して D2セルに「一致」あるいは「不一致」と表示する、と云うイメージでお願いします。


? スピードを考えないなら ・・ > ここに何か引っ掛かる感じあって、
解決するのが「ばっふぁ」なのかな、とか


※端折った文章でごめんなさい。・・病院


よろしくお願いします。
misasi
))hinekureさん

今日の添削コードで

  変数[ff]ー[f] の関係を 「行」−「列」 としたときと
              「列」−「行」との場合と

 演算スピードに影響があるんでしょうか?(演算の方向?とか耳にした記憶あり・・)

再拝
misasi さん こんにちは

>単純に  "CHKの結果は→"の表示をC2セルに表示して
ほかにも方法はあると思いますが。

Sub A_test()
Dim f As Long, ff As Long
Dim myC As Boolean
Dim myMsg As String
myC = False
For ff = 1 To 26
   For f = 1 To 100
      If Worksheets("A").Cells(f, ff).Value = _
         Worksheets("B").Cells(f, ff).Value Then
         Worksheets("CHK").Cells(f, ff).Interior.ColorIndex = 28
      Else
         Worksheets("CHK").Cells(f, ff).Interior.ColorIndex = 3
         Worksheets("CHK").Cells(f, ff).Value = "不一致"
         myC = True
      End If
   Next
Next

Select Case myC
   Case True: myMsg = "不一致"
   Case False: myMsg = "一致"
End Select

Worksheets("CHK2").Range("C2").Value = "CHKの結果は→"
Worksheets("CHK2").Range("D2").Value = myMsg

End Sub
一致しないセルのアドレスが必要な場合はもう少し面倒になります。


>スピードを考えないなら ・・ > ここに何か引っ掛かる感じあって、
データを配列に入れて一度に書き出した方が早いと思います。
データ量が少なければあまり意味がないかもです。
要はオブジェクトにアクセスする回数を減らせば良いのではと思います。
ここでのオブジェクトはセルですよね。

>演算スピードに影響があるんでしょうか?
未検証ですが、あまり関係ないと思います。
))hinekureさん ありがとうございます。


☆手習いで書き写させて貰って、やってみます。

比較検証の真似事までは挑戦してみます!


☆また、的外れな質問を立てると思いますが、よろしくお願いします手(パー)
misasi さん こんばんは

最初にmisasi さんが書かれたコードとほとんど変わらないので
そんなに難しくないと思います。

With ステートメントを使用すれば
もっとコードが見やすくなると思いますよ。^^

参考になれば良いのですが。。。

参考に作ってみました
普通に初期ブックの設定でやってます
なのでシート名はsheet1になってます。
単純にシート1とシート2の各セルを比較させるマクロです

以下のマクロで10列65536行全てにデータが入った状態のデータを走らせると
私のpcでは20秒ちょっとかかりました。
10列30000データで2秒ちょっとかな…たらーっ(汗)

Sub Macro1()
Dim co1 As Long, co2 As Integer
Dim i As Long, j As Long, k As Integer
Dim ck As String
Dim myt As Single
Dim s2 As Worksheet
Set s2 = Sheets("sheet2")
With Sheets("sheet1")

myt = Timer 'タイマー設置
co2 = 1 '列数の初期値

For k = 1 To 255

'初期値と対象の最右列数と比較
If co2 < .Range("a" & k).End(xlToRight).Column Then
co2 = .Range("a" & k).End(xlToRight).Column
End If

Next k

For i = 1 To co2 '列数
co1 = .Cells(65536, i).End(xlUp).Row '行数の確定

If .Cells(65535, i) <> "" Then '行が65536行の場合帰値が1なので1行か65536行か区別
co1 = 65536 '65535行に数値があったら65536行を入れる
End If

For j = 1 To co1 '対象セル同士が不一致なら下記の処理
If .Cells(j, i) <> s2.Cells(j, i) Then

ck = ck & "," & .Cells(j, i).Address
.Cells(j, i).Interior.ColorIndex = 5 '違う部分に色5を指定

End If

Next j
Next i
MsgBox "不一致セルは" & ck
MsgBox "かかった時間は" & Timer - myt
End With
End Sub
))hinekureさん ご丁寧にありがとうございます。
どうぞ、ヨロシクです。
))usakoさん

いつも丁寧にありがとうです。

あっ、これは・・と行かないmisasiは何時もの通りです。
がっぷり組み合って、がんばります!!!

気長にご指導おねがいしま〜す。
  "39" (16,777,216個・ありがとう) ハート達(複数ハート)

256の3乗 

256列 * 65,536行

Excelの広〜いシートを(取敢えずは)舐めつくせましたわーい(嬉しい顔)



☆☆ていねいにご指導いただいた

 ))hinekureさん
そして
 ))usakoさん

『ありがとうございます〜39です!』
これからもヨロシクおねがいします。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

エクセル大好き 更新情報

エクセル大好きのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。