Excel VBA質問箱 IV

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

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


9202 / 13646 ツリー ←次へ | 前へ→

【28434】CSVファイル 05/9/6(火) 16:31 質問[未読]
【28435】Re:CSVファイル かみちゃん 05/9/6(火) 16:35 発言[未読]
【28439】Re:CSVファイル 05/9/6(火) 17:02 回答[未読]
【28440】Re:CSVファイル かみちゃん 05/9/6(火) 17:13 発言[未読]
【28442】Re:CSVファイル 05/9/6(火) 17:53 回答[未読]
【28446】Re:CSVファイル かみちゃん 05/9/6(火) 19:09 回答[未読]
【28455】Re:CSVファイル 小僧 05/9/7(水) 10:15 回答[未読]
【28460】Re:CSVファイル かみちゃん 05/9/7(水) 11:17 発言[未読]
【28467】Re:CSVファイル 小僧 05/9/7(水) 13:04 発言[未読]
【28468】Re:CSVファイル 05/9/7(水) 13:12 質問[未読]
【28469】Re:CSVファイル ちくたく 05/9/7(水) 13:30 発言[未読]
【28470】Re:CSVファイル 05/9/7(水) 14:01 発言[未読]
【28472】Re:CSVファイル ちくたく 05/9/7(水) 14:28 回答[未読]
【28500】Re:CSVファイル 05/9/8(木) 9:36 回答[未読]
【28502】Re:CSVファイル 小僧 05/9/8(木) 9:50 回答[未読]
【28509】Re:CSVファイル 05/9/8(木) 12:09 発言[未読]
【28515】Re:CSVファイル 小僧 05/9/8(木) 13:13 発言[未読]
【28523】Re:CSVファイル 05/9/8(木) 15:40 お礼[未読]
【28526】Re:CSVファイル 小僧 05/9/8(木) 16:30 回答[未読]
【28533】Re:CSVファイル 05/9/8(木) 16:58 お礼[未読]
【28554】Re:CSVファイル ちくたく 05/9/9(金) 10:23 回答[未読]
【28705】ループについて 05/9/13(火) 11:09 質問[未読]
【28706】Re:ループについて 小僧 05/9/13(火) 11:24 回答[未読]
【28710】Re:ループについて 05/9/13(火) 12:10 質問[未読]
【28713】Re:ループについて 小僧 05/9/13(火) 13:18 発言[未読]
【28760】Re:ループについて やっちん 05/9/14(水) 7:51 発言[未読]
【28793】Re:ループについて りん 05/9/14(水) 20:37 回答[未読]

【28434】CSVファイル
質問    - 05/9/6(火) 16:31 -

引用なし
パスワード
   CSV形式のファイルをExcelで開くと、データの数値部分が
「#########」となるのですがどうすれば通常の数値がでるのでしょうか?

【28435】Re:CSVファイル
発言  かみちゃん  - 05/9/6(火) 16:35 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>CSV形式のファイルをExcelで開くと、データの数値部分が
>「#########」となるのですがどうすれば通常の数値がでるのでしょうか?

CSV形式の中身は何ですか?
セルの書式は何になっていますか?
列幅を広げてもだめですか?

【28439】Re:CSVファイル
回答    - 05/9/6(火) 17:02 -

引用なし
パスワード
   ▼かみちゃん さん
こんにちは、青 です。
ファイルの数値部分は、金額が入ります。
列幅を広げると表示されますが、保存するときに
互換性がない可能性があると警告されます。

【28440】Re:CSVファイル
発言  かみちゃん  - 05/9/6(火) 17:13 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>保存するときに互換性がない可能性があると警告されます。

ExcelのバージョンとCSV形式のファイルのサンプルデータを提示してみていただけないでしょうか?
私は、金額を表すCSVデータは、普段から扱っていますが、そういう警告メッセージに遭遇したことがないので、
検証してみようかなと思いました。

【28442】Re:CSVファイル
回答    - 05/9/6(火) 17:53 -

引用なし
パスワード
   ▼かみちゃん さん:
Excel2003で、互換性がないと表示されてもそのまま保存すると
8桁までは正常に表示されるのですが、例えば
「111111111」⇒「1.11E+08」と出てしまいます。
 
 2つのCSVファイルを比較して、相違部分を表示させる自動化されたプログラム を作成するという課題が出されたのですが、最初の部分でつまっている
 状況です。

【28446】Re:CSVファイル
回答  かみちゃん  - 05/9/6(火) 19:09 -

引用なし
パスワード
   こんにちは。かみちゃん です。

> Excel2003で、互換性がないと表示されてもそのまま保存すると
> 8桁までは正常に表示されるのですが、例えば
> 「111111111」⇒「1.11E+08」と出てしまいます。

私は、Excel2003を持っていないので、「互換性がない」というエラーがよくわかりません。

ただ、一番最初のご質問は、

> CSV形式のファイルをExcelで開くと、データの数値部分が「#########」となるのですが

ではなかったのでしょうか?

> 「111111111」⇒「1.11E+08」と出てしまいます。

とは意味が違います。
これは、セルの書式設定が「標準」になっているからで、「数値」や「通貨」にすれば有効桁数15桁までは、正常に表示されます。
15桁を超える値は、Excelの仕様上、表示できません。

【28455】Re:CSVファイル
回答  小僧  - 05/9/7(水) 10:15 -

引用なし
パスワード
   ▼青 さん、かみちゃん さん:
おはようございます。

まず、CSV ファイルって何でしょう?

---------------------IT用語辞典さんより----------------------

データをカンマ(",")で区切って並べたファイル形式。(中略)
実体はテキストファイルであるため、
テキストエディタやワープロなどで開いて直接編集することも可能。

-------------------------------------------------------------

該当のCSVファイルをメモ帳で開くとどうなりますか?


CSV ファイルとは上の解説にもある通り、ただのテキストファイルです。

それを Excel で開いている為に

>データの数値部分が「#########」となる

となる事象が発生(列の幅がせまいため)しているのでしょう。

Excel においては列幅や書式などのセル情報を持っていますが、
テキストである CSV には勿論そんな情報を持たせる事ができません。

>2つのCSVファイルを比較して、相違部分を表示させる
>自動化されたプログラム を作成するという課題が出された

のが今回の論点であるのであれば、
見た目の情報は全く必要ないと思われるのですがいかがでしょうか。

【28460】Re:CSVファイル
発言  かみちゃん  - 05/9/7(水) 11:17 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>CSV ファイルとは上の解説にもある通り、ただのテキストファイルです。
>
>それを Excel で開いている為に
>
>>データの数値部分が「#########」となる
>
>となる事象が発生(列の幅がせまいため)しているのでしょう。

いえ、私がおかしいなぁと思ったのは、「数値が「#########」となる」という点
です。
文字列なら、その表示は理解できるのですが・・・
「11111111」(8桁)はふつうに表示されますが、「111111111」(9桁)は「1.11E+08」となるのでは
ないかと思っています。
これは、「セルの書式設定」が「G/標準」になっているからで、「数値」や「通貨」にすれば
期待どおりに表示されるかと思います。

>見た目の情報は全く必要ないと思われるのですがいかがでしょうか。

私も同感です。

【28467】Re:CSVファイル
発言  小僧  - 05/9/7(水) 13:04 -

引用なし
パスワード
   ▼かみちゃん さん:
こんにちは。

>>となる事象が発生(列の幅がせまいため)しているのでしょう。
>
>いえ、私がおかしいなぁと思ったのは、「数値が「#########」となる」という点
>です。

すみません。かみちゃんさんの仰るとおりでした。

111111111       → 1.11E+08
\111111111       → ########
111111111      → 1.11E+08
"111111111"      → 1.11E+08

【28468】Re:CSVファイル
質問    - 05/9/7(水) 13:12 -

引用なし
パスワード
   ▼かみちゃん さん:
 アドバイスありがとうございます。
 出題されたCSVファイルを最初に開いた時には「######」となっていて
 書式設定を数値に直して保存し、再度開くと、「111111111」⇒「1.11E+08」
 となっていました。先の返信で説明不足になってすいません。

 CSVファイルの比較プログラム作成の課題が出され、Sheet1とSheet2を比較し  差分をSheet3に表示させる
 Sub テスト()
 Const MAXX = 12
 Const MAXY = 63
  Dim Sheet1(MAXX) As String
  Dim Sheet2(MAXX) As String
  Sheets("Sheet3").Select
  Cells.Select
  Selection.Clear
  Range("A1").Select
 A = 1
  For Y = 1 To MAXY
 B = 1
  For X = 1 To MAXX
 Sheet1(X) = Sheets("Sheet1").Cells(Y, X).Value
 Sheet2(X) = Sheets("Sheet2").Cells(Y, X).Value
 
  If Sheet1(X) <> Sheet2(X) Then B = 0
 
  Next
  
  If B = 0 Then
   MsgBox "データ不一致"

  For X = 1 To MAXX
  Cells(Y, X).Value = Sheet1(X)
  Next
   Y = Y + 1
  End If

  Next
  MsgBox "終了確認"
  End Sub

 上記のプログラムを作ったのですが、ファイル名を指定すると2つのファイルを
 比較する自動化されたプログラムに修正するように指示されたのですが、
 作成方法が皆目検討がつかない状況です。
 よろしければアドバイスお願いします。

【28469】Re:CSVファイル
発言  ちくたく  - 05/9/7(水) 13:30 -

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

横からですいませんが、論点は、
あるファイル(csv or xls)が2つあって、
その、ファイル1と、ファイル2との、
例えば、それぞれのA列(B列でもC列でも複数列でもいいけど)
に入っている値が、

ファイル1のA1 = ファイル2のA1
ファイル1のA2 = ファイル2のA2...

という感じで、一緒かどうか調べたいコードを
書きたいということですかね?

で、差分があった場合、どういう処理にしたいのでしょうか?

課題らしいので、明確な答えは出せませんが、
処理の流れを教えて頂けたら、部分部分、
ヒントは差し上げられると思います。

【28470】Re:CSVファイル
発言    - 05/9/7(水) 14:01 -

引用なし
パスワード
   ▼ちくたく さん:
ファイル1.csvとファイル2.csv(2つとも範囲はA1:L63)
実際には、2つのファイルに差分はないのですが、
どちらかのファイルのデータを変更して比較し、
差分があった場合には、ファイル1の該当する行を
ファイル3.csvに表示させたいです。

 ファイル1のA1 = ファイル2のA1
 ファイル1のA2 = ファイル2のA2...と
 ちくたく さんが書かれているように判断したいと
 思っています。

【28472】Re:CSVファイル
回答  ちくたく  - 05/9/7(水) 14:28 -

引用なし
パスワード
   こんにちは。
課題でしたら、完成形を書いちゃだめですね。
一応、私なら、こんな感じで書きます。ネストが古くさいです。
ファイル3への書き出しは実現してません。

>差分があった場合には、ファイル1の該当する行を
>ファイル3.csvに表示させたいです。

行とか列とかの取得には、Columnとか、Rowプロパティを使います。
msgbox activecell.rowみたいな。
それと、ちょっと上記の仕様がわかりませんでした。

差分のファイル3への表示については、マクロの記録で作ってみてください。

Sub csvを開いて比較()
  
  Dim myWb As Workbook, yourWb As Workbook
  Dim myData As Variant, yourData As Variant
  Dim i As Integer, j As Integer
  
  Set myWb = Workbooks.Open(Filename:="C:\tmp\テスト1.csv")
  Set yourWb = Workbooks.Open(Filename:="C:\tmp\テスト2.csv")
  
  myData = myWb.ActiveSheet.Range("A1:L63")
  yourData = yourWb.ActiveSheet.Range("A1:L63")
    
  For i = 1 To UBound(myData, 1)
    For j = 1 To UBound(yourData, 2)
      If myData(i, j) <> yourData(i, j) Then
        myWb.ActiveSheet.Cells(i, j).Interior.ColorIndex = 3
      End If
    Next j
  Next i
End Sub

【28500】Re:CSVファイル
回答    - 05/9/8(木) 9:36 -

引用なし
パスワード
   ▼ちくたく さん:
おはようございます。
ちくたくさんが提示してくださったコードを参考に自分で作ってみたのですが、
 ファイル3にファイル1とファイル2のデータが表示されてしまいます。

【28502】Re:CSVファイル
回答  小僧  - 05/9/8(木) 9:50 -

引用なし
パスワード
   ▼ちくたく さん、青さん:
おはようございます。

ここはExcelの質問箱なので、ちくたくさんのやり方も理解できるのですが、
2つのcsvファイルの違い(しかも行ごとの比較)でしたら

>Workbooks.Open(Filename:="C:\tmp\テスト1.csv")

でやるのはどうかな…と。

Sub CSVの比較()
Dim File1 As String
Dim File2 As String
Dim Line1 As String
Dim Line2 As String
Dim i As Long

  File1 = "C:\tmp\テスト1.csv"
  File2 = "C:\tmp\テスト2.csv"

  Open File1 For Input As #1
  Open File2 For Input As #2
  
  i = 1
  Do Until EOF(1)
    Input #1, Line1
    Input #2, Line2
      If Line1 <> Line2 Then MsgBox i & "行は不一致"
    i = i + 1
  Loop
    
  Close #2
  Close #1
  MsgBox "終了"

End Sub

行の要素毎に調べるのであれば Split 関数 を使ってください。

※課題という事ですので、後は青さんの状況に合わせて工夫して下さい。

【28509】Re:CSVファイル
発言    - 05/9/8(木) 12:09 -

引用なし
パスワード
   ▼小僧 さん、ちくたくさん:
過去ログや皆さんの返信を参考にして比較するファイルをそれぞれ指定して
 比較開始するプログラム
  Sub 比較()
Dim ファイル1 As String
Dim ファイル2 As String
Dim FName1 As Variant
Dim FName2 As Variant

Res = MsgBox("比較用の2つのファイルを選びます。 " & vbCr & _
"続行しますか?", vbYesNo + vbQuestion, "確認")

FName1 = Application.GetOpenFilename(FileFilter:="CSVファイル (*.csv), *.csv")

MsgBox FName1 & "を選択しました。 " & vbCr & _
"比較対象するファイルを選択してください。 ", , "対象選択"

FName2 = Application.GetOpenFilename(FileFilter:="CSVファイル (*.csv), *.csv")

If FName2 = False Then
MsgBox "中止します。", , "中止"
Exit Sub
Else

MsgBox FName1 & "と " & vbCr & _
FName2 & "の" & vbCr & _
"データを比較します。", vbInformation, "比較開始"

Open FName1 For Input As #1
Open FName2 For Input As #2

Do Until EOF(1) Or EOF(2)
Myファイル1 = Input(1, #1)
Myファイル2 = Input(1, #2)

n = n + 1

If Myファイル1 <> Myファイル2 Then Exit Do
Loop

If EOF(1) And EOF(2) Then
MsgBox "2つのデータ一致確認。", , "終了"
Else
MsgBox "2つのデータ不一致。", , "終了"
End If

Close #1
Close #2

End If
End Sub
 を考えたのですがデータ不一致の場合には、C:\tmp\差分.csvに
 ファイル1の該当する行を表示したいのですが、差分表示のための
 マクロの書き方がよくわかりません。ご教授お願いします。

【28515】Re:CSVファイル
発言  小僧  - 05/9/8(木) 13:13 -

引用なし
パスワード
   ▼青 さん:
こんにちは。

>C:\tmp\差分.csvにファイル1の該当する行を表示したいのですが、

テキストへの出力は、「Outeput」で開いて「Print」か「Write」で行います。
(両者の違いについてはヘルプで確認してみて下さい。)

Sub テキストへ出力()
Dim strMoji As String
Dim File3 As String

  File3 = "C:\Tmp\差分.csv"
  strMoji = "結果ですよ"
  
  Open File3 For Output As #3
    Print #3, strMoji
  Close #3
End Sub


さて、ご提示されたコードですが…。

>Res = MsgBox("比較用の2つのファイルを選びます。 " & vbCr & _
>"続行しますか?", vbYesNo + vbQuestion, "確認")

せっかく vbYesNo でメッセージボックスを出しているのに、
選んだあとの分岐がないです。

>
>FName1 = Application.GetOpenFilename(FileFilter:="CSVファイル (*.csv), *.csv")
>
>MsgBox FName1 & "を選択しました。 " & vbCr & _
>"比較対象するファイルを選択してください。 ", , "対象選択"

FName1 が キャンセルされた場合の処理も必要ですよね。

>n = n + 1

n行目が不一致、としないのであれば n の値は必要ないですね。
あと初期化されていないので、n が 0 からカウントされている事になります。


>If EOF(1) And EOF(2) Then
>MsgBox "2つのデータ一致確認。", , "終了"
>Else
>MsgBox "2つのデータ不一致。", , "終了"
>End If

このへんは好みの問題になるのでしょうが、処理の流れが不自然ですね。

Exit Do させて後から EOF(1) と EOF(2) であったかを調べるよりは

ループ開始

不一致判定 → 不一致 → 不一致処理 → 脱ループ

終了判定  → 正常終了 → 正常終了処理 → 脱ループ

ループに戻る

のような処理が良いと思われます。

【28523】Re:CSVファイル
お礼    - 05/9/8(木) 15:40 -

引用なし
パスワード
   ▼小僧 さん:
こんにちは  
>  Open File3 For Output As #3
>  Print #3, strMoji
>  Close #3
>End Sub
 最初の行でError 90がでてファイルに書き込めませんと表示されてしまいます。

【28526】Re:CSVファイル
回答  小僧  - 05/9/8(木) 16:30 -

引用なし
パスワード
   ▼青 さん:
こんにちは。

> 最初の行でError 90がでてファイルに書き込めませんと表示されてしまいます。

だんだん丸投げになってきていませんか?

こちらの環境(Excel2002 WindowsXP) ですと
C:\Tmp\差分.csv を開きっぱなしでコードを実行すると

「実行時エラー 70 書き込みできません」

と表示されましたが関係はないでしょうか?

※ヘルプで Error 等で検索すると「トラップできるエラー」という項目があります。
 残念ながら 90番は存在しませんでした。

【28533】Re:CSVファイル
お礼    - 05/9/8(木) 16:58 -

引用なし
パスワード
   ▼小僧 さん:
「実行時エラー 70」でした。しっかりと確認もせずに送信してしまい
 申しわけありませんでした。
 エラーの件ですが、自己解決しました。

 分からないからといって人に頼りすぎるのは、良いことではないですね。
 以後、気をつけます。
 何度も質問に答えていただきありがとうございました。

【28554】Re:CSVファイル
回答  ちくたく  - 05/9/9(金) 10:23 -

引用なし
パスワード
   小僧さん。青さん。
おはようございます。

>  Do Until EOF(1)
>    Input #1, Line1
>    Input #2, Line2
>      If Line1 <> Line2 Then MsgBox i & "行は不一致"
>    i = i + 1
>  Loop

VBAでもこのような処理ができるのですね。
へぇー、という感じで、ちょっと驚きです。
勉強になりました。ありがとうございます。

【28705】ループについて
質問    - 05/9/13(火) 11:09 -

引用なし
パスワード
   ▼ちくたく さん:
>小僧さん。ちくたくさん。
>おはようございます
 Do Until EOF(1)
>    Input #1, Line1
>    Input #2, Line2
>      If Line1 <> Line2 Then MsgBox i & "行は不一致"
>    i = i + 1
>  Loop
皆さんの返信を参考にして、比較プログラムが出来、差分ファイルに
 しっかりと反映されたのですが、上記のループにおいて
 If Line1 = Line2 Then MsgBox "完全一致"というメッセージボックスを
 書き加えると差分があるファイルでも"完全一致"と出てしまうのですが
 何故なのか分かりません。 アドバイスお願いします。

【28706】Re:ループについて
回答  小僧  - 05/9/13(火) 11:24 -

引用なし
パスワード
   ▼青 さん:
おはようございます。

> If Line1 = Line2 Then MsgBox "完全一致"というメッセージボックスを
> 書き加えると差分があるファイルでも"完全一致"と出てしまうのですが
> 何故なのか分かりません。 アドバイスお願いします。

行  File1   File2     File1 <> File2   File1 = File2
1   りんご   りんご   →  False       True
2   ばなな   ばなな   →  False       True
3   なし    もも    →  True        False
4   みかん   ぶどう   →  False       True
5   すいか   すいか   →  True        True

If xxxxx Then 〜
の構文では xxxxx がTrue の際に実行されます。

差分があったファイルでもループの中に True になる行があれば
当然メッセージボックスが表示されると思うのですがいかがでしょうか。

【28710】Re:ループについて
質問    - 05/9/13(火) 12:10 -

引用なし
パスワード
   ▼小僧 さん:
小僧さんの説明を聞いてIf xxxxx Then 〜文の理屈は分かりましたが、
 一行ごと比較していき全行一致したときのみに"完全一致"とメッセージ
 ボックスに表示するにはどういった処理にすれば良いのでしょうか?

【28713】Re:ループについて
発言  小僧  - 05/9/13(火) 13:18 -

引用なし
パスワード
   ▼青 さん:
こんにちは。

> 小僧さんの説明を聞いてIf xxxxx Then 〜文の理屈は分かりましたが、
> 一行ごと比較していき全行一致したときのみに"完全一致"とメッセージ
> ボックスに表示するにはどういった処理にすれば良いのでしょうか?

[#28515] で処理の流れは提示させて頂いてるんですけどね…。

他に考えられる方法としては

Dim FlgA As Boolean
Dim FlgB As Long

どちらかを宣言して、ループの前に初期化。
(VBA では自動でされますが、初期化を意識する意味で記述してます。)

FlgA = False
FlgB = 0

If xxxxx Then
  FlgA = True
  FlgB = 1
  Exit Do
End If

でフラグの値を見て判断する方法もあります。

(前の投稿でも書きましたが、Exit Do をする必要が出てくるので
プログラムの構造としてはお勧めできませんが…)

当方がコードを組むとすれば

Dim FLG As Boolean
FLG = False

DO Until FLG
  不一致判定 → True の場合 FLG = True
  終了判定  → True の場合 FLG = True
Loop

と言う感じでしょうか…。

【28760】Re:ループについて
発言  やっちん  - 05/9/14(水) 7:51 -

引用なし
パスワード
   ▼青 さん:
こんにちは。

> 小僧さんの説明を聞いてIf xxxxx Then 〜文の理屈は分かりましたが、
> 一行ごと比較していき全行一致したときのみに"完全一致"とメッセージ
> ボックスに表示するにはどういった処理にすれば良いのでしょうか?

不一致の件数をカウントしていって、最後に不一致件数が0の場合に
メッセージを出すというのはどうでしょう?
入力が0件の場合は考慮していませんが。

【28793】Re:ループについて
回答  りん E-MAIL  - 05/9/14(水) 20:37 -

引用なし
パスワード
   こんばんわ

> 一行ごと比較していき全行一致したときのみに"完全一致"とメッセージ
> ボックスに表示するにはどういった処理にすれば良いのでしょうか?

  Dim flg As Boolean 'ブール型で変数を設定
  flg = True '初期値は真
<<略>> ファイルを開くなど。
  Do
   If EOF(1) And EOF(2) Then Exit Do
   If EOF(1) Or EOF(2) Then flg = False: Exit Do '数があわない時は当然偽
   '
   Input #1, Line1
   Input #2, Line2
   flg = flg And (Line1 = Line2) 'ヘルプ VBAのAnd演算子 参照
  Loop

<<略>> ファイルを閉じる処理

  '結果
  If flg =True Then
   MsgBox "完全一致", vbInformation '最終的に真
  Else
   MsgBox "不完全一致", vbExclamation
  End If

これでどうですか?

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