Excel VBA質問箱 IV

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

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


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

【50644】既存ファイルから新規ファイルにデータを移す場合の表示形式 こたろう 07/8/7(火) 6:33 質問[未読]
【50648】Re:既存ファイルから新規ファイルにデータ... ひげくま 07/8/7(火) 9:45 発言[未読]
【50689】Re:既存ファイルから新規ファイルにデータ... こたろう 07/8/9(木) 21:57 発言[未読]
【50693】Re:既存ファイルから新規ファイルにデータ... ひげくま 07/8/10(金) 9:46 発言[未読]
【50700】Re:既存ファイルから新規ファイルにデータ... こたろう 07/8/10(金) 22:09 発言[未読]
【50701】Re:既存ファイルから新規ファイルにデータ... ひげくま 07/8/10(金) 22:56 回答[未読]
【50703】Re:既存ファイルから新規ファイルにデータ... こたろう 07/8/11(土) 1:07 発言[未読]
【50704】Re:既存ファイルから新規ファイルにデータ... ひげくま 07/8/11(土) 2:13 発言[未読]
【50708】Re:既存ファイルから新規ファイルにデータ... こたろう 07/8/11(土) 15:50 発言[未読]

【50644】既存ファイルから新規ファイルにデータを...
質問  こたろう  - 07/8/7(火) 6:33 -

引用なし
パスワード
   はじめまして。こたろうと申します。
行き詰っております。どなたかご教授ください。

フォルダの中に、複数のエクセルファイルがあります。
これらはそれぞれ、10シートからなり、各シートは異なるデータの集計結果です。

これらのファイルのデータを、新規作成するエクセルファイルに書き込んでいきます。

そこでなのですが、
1.既存ファイルに0.50とあるデータが新規ファイルに0.5とに表示されてしまう。
2.既存ファイルで、入力規則をかけているデータ(0.0447と入力されたら0.045と切り上げて表示する)が、0.0447とひょうじされてしまう。

という風になってしまいます。

それぞれに対して、小数点以下切り上げ関数などをかまして表示させればできるかなと思うのですが、既存ファイルのデータが大量すぎてひとつひとつの形式を調べている時間がありません。
(セル全て形式がばらばらで、90000セルくらいあります。)
既存ファイルに「表示されているまま」を、新規ファイルに書き写す方法はないでしょうか?

もし無理であれば、新規ファイルのブック全体の表示形式を文字列にすることは可能でしょうか?そのあとデータを書き込めば、1.に関しては解決するのかなと思い・・・・。

どなたか、お手数おかけいたしますが宜しくお願いいたします!

【50648】Re:既存ファイルから新規ファイルにデー...
発言  ひげくま  - 07/8/7(火) 9:45 -

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

>これらのファイルのデータを、新規作成するエクセルファイルに書き込んでいきます。

これだけでは、こたろうさんがどのように書き込んでいるのかがわかりません。
コートを提示すると、適切なアドバイスをしてもらいやすくなると思いますよ。

【50689】Re:既存ファイルから新規ファイルにデー...
発言  こたろう  - 07/8/9(木) 21:57 -

引用なし
パスワード
   ひげくま さん

遅くなりました。レスありがとうございました

>これだけでは、こたろうさんがどのように書き込んでいるのかがわかりません。
>コートを提示すると、適切なアドバイスをしてもらいやすくなると思いますよ。

その通りですね。ご指摘ありがとうございます。
今は、下記のようにしています。

------------------------------------------------------
  ’ファイルを検索
  xlsFile = Dir("\\C\*.xls", vbNormal) 

新規エクセル(書き込み先)作成
  Set 新規App= CreateObject("Excel.application")
  Set  新規Book = 新規App.Workbooks.Add


  '指定されたフォルダ内のエクセルファイル分回す
  Do While xlsFile <> ""
 
    '既存エクセル用意
    Set 既存App = CreateObject("Excel.application")
    Set 既存Book = 既存App .Workbooks.Open("保管場所のパス")
    
    Set 新規Sheet = 新規Book.Worksheets(1)
    Set 既存Sheet = 既存ook.Worksheets("1")
    
    
    'データ書き込み処理
    With 新規xlSheet
      .Range("A1"). = 既存Sheet.Range("A1").Text
      .Range("A2"). = 既存Sheet.Range("F9").Text
      .
      .
      .
      .
      .
    end with


    '--既存エクセル終了
    既存App.DisplayAlerts = False
    既存Book.Save
    既存Book.Close
    既存App.Quit

    Set 既存Book = Nothing
    Set 既存App = Nothing           
           

    xlsFile = Dir()  
  Loop


  '--新規エクセル終了
  新規lApp.DisplayAlerts = False
  新規Book.SaveAs Application.ThisWorkbook.Path & "\新規.xls"
  新規Book.Close
  新規App.Quit

  Set 新規Book = Nothing
  Set 新規App = Nothing
  
---------------------------------------------------------------
という感じです。
セル位置になんの規則性もないので、ひたすら代入しています。
(本当はひとつのプロシージャでは書ききれないので、複数のプロシージャに分けています)


この時に、書式ごと(textプロパティを使った状態でそのまま)新規エクセルに書き込みたいのですが、新規エクセルの書式は標準になってしまっており、100.0が100になってしまいます。
代入時に「ここは書式ごと(.textプロパティ)」「ここは値のみ(.valueプロパティ)」
という風に、分けることは出来ないでしょうか?


宜しくお願いいたします。


また、会社から書き込みができず、今週は外回りが多いため、お返事が遅くなることがあるかもしれません。
レスをいただいた際には必ずお返事いたしますので、申し訳ありませんが、何卒ご了承ください。

【50693】Re:既存ファイルから新規ファイルにデー...
発言  ひげくま  - 07/8/10(金) 9:46 -

引用なし
パスワード
   >    'データ書き込み処理
>    With 新規xlSheet
>      .Range("A1"). = 既存Sheet.Range("A1").Text
>      .Range("A2"). = 既存Sheet.Range("F9").Text
>      .
>    end with

左辺の最後にピリオドがあるので、コーディングの段階でエラーになりますが、本当はどんな式なのでしょうか?

> 1.既存ファイルに0.50とあるデータが新規ファイルに0.5とに表示されてしまう。

既存ファイルでは、なぜ0.50と表示されているのですか?
セルの書式が文字列になっている? それとも0.00になっている?

どちらにせよ、Textプロパティは0.50になりますが、新規ファイルのセルの書式が標準である限り、新規ファイルでは0.5と表示されます。
新規ファイルの表示を既存ファイルの表示と同じにしたいのであれば、新規ファイルのセル書式を既存ファイルのセル書式と同じにする処理を加える必要があります。

> 2.既存ファイルで、入力規則をかけているデータ(0.0447と入力されたら0.045と切り上げて表示する)が、0.0447とひょうじされてしまう。

書式ではなく入力規則ですか?
どのような入力規則でしょうか?

表示されているのが0.045である限り、Textプロパティは0.045のはずなので、既存ファイルのTextプロパティ(0.045)を新規ファイルに代入したのであれば、新規ファイルの表示が0.0447と表示されるはずがないのですが・・・
ちょっとした勘違いだったりしませんか?

【50700】Re:既存ファイルから新規ファイルにデー...
発言  こたろう  - 07/8/10(金) 22:09 -

引用なし
パスワード
   ひげくま さん、レスありがとうございます。

>
>左辺の最後にピリオドがあるので、コーディングの段階でエラーになりますが、本当はどんな式なのでしょうか?

失礼しました。書き間違いです。

.Range("A1") = 既存Sheet.Range("A1").Text

としています。


>既存ファイルでは、なぜ0.50と表示されているのですか?
>セルの書式が文字列になっている? それとも0.00になっている?

書式が数値になっていて、サンプル表示は0.50になっています。

>どちらにせよ、Textプロパティは0.50になりますが、新規ファイルのセルの書式が標準である限り、新規ファイルでは0.5と表示されます。

やはりそうですよね・・・。

>書式ではなく入力規則ですか?
>どのような入力規則でしょうか?

失礼しました。書式でした。

>表示されているのが0.045である限り、Textプロパティは0.045のはずなので、既存ファイルのTextプロパティ(0.045)を新規ファイルに代入したのであれば、新規ファイルの表示が0.0447と表示されるはずがないのですが・・・
>ちょっとした勘違いだったりしませんか?

すいません、こちらも勘違いでした。
0.0447で表示されます。

なので、やはり問題は0.00のように、小数点以下の最後が0の場合です。

>新規ファイルの表示を既存ファイルの表示と同じにしたいのであれば、新規ファイルのセル書式を既存ファイルのセル書式と同じにする処理を加える必要があります。

とのことですが、たとえば、新規ファイルの2シート目のB列を、値が代入された分だけ数値や文字列に指定することは可能でしょうか?

宜しくお願いいたします。

【50701】Re:既存ファイルから新規ファイルにデー...
回答  ひげくま  - 07/8/10(金) 22:56 -

引用なし
パスワード
   >失礼しました。書き間違いです。
>
>失礼しました。書式でした。
>
>すいません、こちらも勘違いでした。

ちょっと間違いが多すぎますね。
正しい情報を書かないと、欲しい回答は出てきませんよ。
こちらとしては、嘘の情報に踊らされることになります。

>>既存ファイルでは、なぜ0.50と表示されているのですか?
>>セルの書式が文字列になっている? それとも0.00になっている?
>
>書式が数値になっていて、サンプル表示は0.50になっています。

書式が「どんな」数値になっていますか?
0.00になっていませんか?
もうちょっと落ち着いて書くようにしてください。

>>新規ファイルの表示を既存ファイルの表示と同じにしたいのであれば、新規ファイルのセル書式を既存ファイルのセル書式と同じにする処理を加える必要があります。
>
>とのことですが、たとえば、新規ファイルの2シート目のB列を、値が代入された分だけ数値や文字列に指定することは可能でしょうか?

B列の値が代入されたセルだけではなく、B列のすべてのセルの書式を変更すると、何かまずいことになりますか?
まずいことにならないのであれば、すべてを一気に指定するほうが簡単ですよ。

ちなみに、
新規Sheet.Range("A1").Value = 既存Sheet.Range("A1").Value
ではなく、
既存Sheet.Range("A1").Copy Destination:=新規Sheet.Range("A1")
ではどうでしょう?
Copyメソッドを使えば、値も書式も、セルのすべてがコピーされますよ。

【50703】Re:既存ファイルから新規ファイルにデー...
発言  こたろう  - 07/8/11(土) 1:07 -

引用なし
パスワード
   ひげくま さん

レスありがとうございます。

>ちょっと間違いが多すぎますね。
>正しい情報を書かないと、欲しい回答は出てきませんよ。
>こちらとしては、嘘の情報に踊らされることになります。

申し訳ありません。
落ち着いて書くよう努めます。

>書式が「どんな」数値になっていますか?

0.00です。勘違いしていました。失礼いたしました。


>B列の値が代入されたセルだけではなく、B列のすべてのセルの書式を変更すると、何かまずいことになりますか?
>まずいことにならないのであれば、すべてを一気に指定するほうが簡単ですよ。

まずいことにはなりません。
なるほどと思い、

------------------------------------------------------
ファイルを検索

新規エクセル(書き込み先)作成

  '指定されたフォルダ内のエクセルファイル分回す
  Do While xlsFile <> ""
 
    '既存エクセル用意
    Set 既存App = CreateObject("Excel.application")
    Set 既存Book = 既存App .Workbooks.Open("保管場所のパス")
    
    Set 新規Sheet = 新規Book.Worksheets(1)
    Set 既存Sheet = 既存ook.Worksheets("1")

    新規Sheet.Columns("A:A").Select  
    Selection.NumberFormatLocal = "0.0_ "

    
    'データ書き込み処理
    With 新規xlSheet
      .Range("A1") = 既存Sheet.Range("A1").Text
      .Range("A2") = 既存Sheet.Range("F9").Text      .
      .
      .
      .
      .
    end with

    '--既存エクセル終了処理          

    xlsFile = Dir()  
  Loop


  '--新規エクセル終了処理


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

としたのですが、新規Sheet.Columns("A:A").Select で「RangeクラスのSelectメソッドが失敗しました」とエラーになってしまいます。

また、

>既存Sheet.Range("A1").Copy Destination:=新規Sheet.Range("A1")
>ではどうでしょう?
>Copyメソッドを使えば、値も書式も、セルのすべてがコピーされますよ。

これもなるほど!と思い、そのままがコピーできるのであれば、それが一番なので、


------------------------------------------------------
ファイルを検索

新規エクセル(書き込み先)作成

  '指定されたフォルダ内のエクセルファイル分回す
  Do While xlsFile <> ""
 
    '既存エクセル用意
    Set 既存App = CreateObject("Excel.application")
    Set 既存Book = 既存App .Workbooks.Open("保管場所のパス")
    
    Set 新規Sheet = 新規Book.Worksheets(1)
    Set 既存Sheet = 既存ook.Worksheets("1")
    
    
    'データ書き込み処理
    既存Sheet.Range("A1").Copy Destination:=新規Sheet.Range("A1")
      .
      .
      .
      .
      .


    '--既存エクセル終了処理          

    xlsFile = Dir()  
  Loop


  '--新規エクセル終了処理


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

と、データ書き込み処理の代わりにこのまま試してみたら、「Range クラスの Copy メソッドが失敗しました」というエラーが出てしまいました。


ヘルプ等確認したのですが、構文の間違いを見つけることができず、またとまってしまいました。
どこか間違いがあるのでしょうか?
申し訳ありません・・・。


※一つ前のわたしの記事で、「例えば新規ファイルの2シート目のB列が・・・」と質問させていただきましたが、コードは最初の例に合わせて新規ファイルの1シート目のA列を数値に設定する、という風にしました。

【50704】Re:既存ファイルから新規ファイルにデー...
発言  ひげくま  - 07/8/11(土) 2:13 -

引用なし
パスワード
   実際のコードの一部を抜粋してここに載せるのは良いのですが、実際にそのコードを実行してから載せてください。
前回の書き込みも、今回の書き込みも、コーディングの段階でエラーになります。

>    Set 既存Sheet = 既存ook.Worksheets("1")

既存ookって何ですか?
既存Bookですよね?

こんなに間違いが多いと、ここに正しく書いてあるものでも、実際のコードが間違っている可能性も考えてしまいます。
そうなると、もう何も信じられなくなります。

【50708】Re:既存ファイルから新規ファイルにデー...
発言  こたろう  - 07/8/11(土) 15:50 -

引用なし
パスワード
   ひげくま さん

レスありがとうございます。

>こんなに間違いが多いと、ここに正しく書いてあるものでも、実際のコードが間違っている可能性も考えてしまいます。
>そうなると、もう何も信じられなくなります。

申し訳ありません。
ファイル名が本当はわかりづらいもののため、質問時に書き換えていたのですが、ミスが本当に多く、ご迷惑おかけいたしました。

>既存ookって何ですか?
>既存Bookですよね?

その通りです。

実際にこのファイル名で実行済みのコードを記載させていただきます。
Copyメソッドを使った場合のものです。

----------------------------------------
  xlsFile = Dir("C:\Documents and Settings\aa\" & "\*.xls", vbNormal)


  '新規オブジェクト宣言
  Set 新規App = CreateObject("Excel.application")
  Set 新規Book = 新規App.Workbooks.Add
  
  
  '指定されたフォルダ内のexcelがなくなるまで
  Do While xlsFile <> ""
         
    '既存オブジェクト宣言
    Set 既存App = CreateObject("Excel.application")
    Set 既存Book = 既存App.Workbooks.Open("C:\Documents and Settings\aa\" & xlsFile)
    
    Set 新規Sheet = 新規Book.Worksheets(1)
    Set 既存Sheet = 既存Book.Worksheets("1")
    既存Sheet.Activate
    
    
    既存Sheet.Range("A1").Copy Destination:=新規Sheet.Range("A1")
    
    Set 既存Sheet = Nothing
    Set 新規Sheet = Nothing


    '既存エクセル終了処理
    既存App.DisplayAlerts = False
    既存Book.Save
    既存Book.Close
    既存App.Quit

    Set 既存Book = Nothing
    Set 既存App = Nothing
           
    xlsFile = Dir()
  
  Loop

  '新規エクセル終了
  新規App.DisplayAlerts = False
  新規Book.SaveAs Application.ThisWorkbook.Path & "\Data.xls"
  新規Book.Close
  新規App.Quit

  Set 新規Book = Nothing
  Set 新規App = Nothing
  
----------------------------------------------------------
こうすると、
既存Sheet.Range("A1").Copy Destination:=新規Sheet.Range("A1")
でやはり、「Range クラスの Copy メソッドが失敗しました」となります。
今は試しで、セル一箇所のみコピーしています。

何度も申し訳ありません。
どうしても進めたいので、ご面倒おかけいたしますが宜しくお願いいたします。

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