• ベストアンサー

エクセルへのデータの貼付時に書式が反映されない!

お世話になります。 VBでエクセルにデータを貼り付ける処理があるのですが、 エクセルの書式設定(数値で小数点第3位まで表示)が反映されず、そのままの値が文字列として表示されてしまいます。 そのセルをダブルクリックすると書式が反映されます。 貼り付ける時はパフォーマンスを考慮して、下記のように一括で貼り付 けるようにしています。 「m_xlSheet.Range("A" + CStr(lngRows) + ":U" + CStr(lngRows)).Value = strValue」 何かよい方法をご存知でしたら、教えて下さい。 環境:VB6(SP6)、エクセル2000

質問者が選んだベストアンサー

  • ベストアンサー
  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

こんにちは。KenKen_SP です。 > m_xlSheet.Range("A" + CStr(lngRows) + ":U" + CStr(lngRows)).Value = strValue 変数 strValue が String型配列になっているからですね。恐らく、VB の自動 キャスト機能が原因です。 オートメーションのコードを書くのは面倒なので、Excel VBA でサンプルを 書いておきます。変数の型の違いでセルへ転記がどのように違うかを確認して 下さい。 Sub Sample1()   ' 文字列として数字が転記される例      Dim Buf() As String '<-- 文字列型変数が原因      ReDim Buf(1 To 5, 1 To 5)   For i = 1 To 5     For j = 1 To 5       ' 数値が文字列にキャストされる       Buf(i, j) = 12345     Next j   Next i   Range("A1:E5").Value = Buf End Sub ではどうするかといえば、配列の型を Variant にしてしまうのが一番 簡単です。 Sub Sample2()   ' 対応策      Dim Buf() As Variant '<-- バリアント型にする      ReDim Buf(1 To 5, 1 To 5)   For i = 1 To 5     For j = 1 To 5       Buf(i, j) = 12345     Next j   Next i   Range("A1:E5").Value = Buf End Sub

FirstOk
質問者

お礼

配列の型を Variant型にすることで、適切に書式が適用されました。 お忙しい中、ありがとうございました。

その他の回答 (2)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

#2 です。もう少しサンプルを提示しておきます。 Sub Sample3()   Dim i As Long   Dim j As Long      'Dim Buf() As Variant '<-- バリアント型にする   'または数値しか代入されないなら Double 型等でも OK   Dim Buf() As Double        ReDim Buf(1 To 5, 1 To 5)   For i = 1 To 5     For j = 1 To 5       Buf(i, j) = 1.333     Next j   Next i   With Range("A1:E5")     .NumberFormat = "0.000"     .Value = Buf   End With End Sub Sub Sample4()   Dim strTmp As String        ' VB では数値が String 型にキャストされて代入される   ' strTmp = Cstr(1.333) と同意. つまりこの段階では、   ' strTmp = "1.333" となっている   strTmp = 1.333   ' しかし、配列でない「通常変数の場合」はセルへの代入時に   ' Excel が「型の判断を再度行う」ため、再び数値として評価   ' できるものは数値となってしまう....   Range("A1").Value = strTmp      ' 配列の一括転記時にはこの機能が働かない    End Sub

FirstOk
質問者

お礼

回答して頂きありがとうございます。 なるほど、配列の一括転記時はExcelで自動変換されないんですね。 いろいろ試してみます。

回答No.1

私の環境(2003)ではできるんですが。 例えば、strValueが1.333ならセルに1.333と表示されれば問題ないわけですよね。 ツールー>オプションー>設定の編集等でなにか特別な設定を行っていないか確認されは同でしょうか。 最終手段は新たしいブックを作成し、そちらに、必要なワークシートの内容をコピー貼り付け、マクロもコピー貼り付けしてみたらどうでしょう。 まあバージョンが異なるのでなんともいえないですが。ご参考になれば幸いです。

FirstOk
質問者

補足

「ツールー>オプションー ・・・」はデフォルトのままで、特にいじっておりません。 また、新しいブックに形式を選択して貼り付けで、値のみにしても同じように表示されてしまいます。

関連するQ&A

  • VBからエクセルへの書き込みについて

    xlSheet.Range("B24") =123 の様にするとエクセルのB4セルに123が書き込まれますが、エクセルのセルをマウスでダブルクリックしてセルにカーソルが表示されている状態にすると書き込みが停止します エクセルを操作してもVBの書き込みが停止しない方法は無いでしょうか ご存じの方恐れ入りますが宜しくお願いします

  • エクセル/グラフのデータテーブルの書式変更は?

    検索してみましたが類似の質問が見あたらなかったので・・・。 バージョンは2000を使用中です。 エクセルでグラフを作り,グラフ下にデータテーブルを表示させたとき,そのデータテーブル自体の書式はどこで編集するのでしょうか? シートの書式を変更してもデータテーブルには反映されないようですし・・・ましてやワード内にリンクさせたときには,全く違う書式になってしまいます。なぜでしょう?具体的には (1)シート上でのセルの書式を,セル内右寄せ・小数点ありにしても,グラフのデータテーブルでは小数点はあるがセル内中央に表示される。 (2)このグラフをデータテーブルごとワード内にリンク表示させると,小数点も出ずセル内でも中央に表示される。 結論としては,エクセルのグラフをワードにリンク表示させたとき,そのデータテーブルの書式が小数点あり・セル内右寄せに表示させたいのですが,データテーブルの書式は一体どこで変更するのか分からず困っております。(ヘルプにもないし) どなたか解決方ご存知の方,又は解決法の載っているサイトご存知の方いらっしゃったら,教えてください。

  • VBからExcelのデータを参照するには?

    VBからExcelのデータを参照するには? ExcelのA列を、参照しようとしています。 このA列には数字も混じっています。 例えば A123 abc 456 qwer のように、4行あったとします。 VBのソースコードは、次の通り --------------------- Dim elSequence(10) As String i = 0 Do Until objSheet.Range("a2").Offset(i,0).Value = "" elSequence(i) = objSheet.Range("a2").Offset(i,0).Value i += 1 Loop --------------------- 問題は、Excelのセルに「数字だけの場合(上記の例で4行目)」で、VBはこれを、文字列として扱わずにDouble型と認識してしまいます。 例え、Excelのセルを、プロパティの文字列指定としても「456」はDouble型になってしまいます。 Excelから受け取ったデータを、文字列への変換はどのようにしたら良いですか。 参考になりそうなWeb等でも構いませんので、教えていただけませんか。

  • エクセルのセルの書式設定→ユーザー定義

    エクセルで数値を打ち込む単純作業をしています。 小数点以下1桁表示まで入力しているのですが、小数点を省いて入力する事は出来ませんか? 例えば、1.2を表したいのであれば、12と打って1.2と表示させたいです。 セルの書式設定→ユーザー定義で出来そうなのですが、設定の仕方がわかりません。 これって可能ですか? またその表で平均値やグラフを表したいのですが、きちんと反映されますか? よろしくお願いします。

  • VBでエクセルの区切りが使えない

    VBでエクセルを操作するプログラムをつくってるのですが、エクセルの区切りが使えません。どうしたらいいのでしょうか? (20060501を0501に区切る) VBでオブジェクトライブラリを使用せずにエクセルを操作しています。 xlBook.xlSheet.Columns("L:L").TextToColumns Destination:=xlSheet.Range("L1"), DataType:=xlFixedWidth, _ FieldInfo:=Array(Array(0, 9), Array(4, 3)) xlSheet.Columns("L:L").Select xlSheet.Columns("L:L").NumberFormatLocal = "m/d

  • エクセルの開放

    VB2008でエクセルを操作しているのですが、エクセルのプロセスが残ってしまってどうやって解放すればいいのかわかりません。 サンプルプログラム-------------- Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim xlBook As Excel.Workbook = xlBooks.Add Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = xlSheets.Item(1) Dim xlobj As Object '開放用 xlobj = xlSheet.Range("A1:C3") xlobj.Value = "TEST" MRComObject(xlobj) MRComObject(xlSheet) MRComObject(xlSheets) xlBook.Close(False) MRComObject(xlBook) MRComObject(xlBooks) xlApp.Quit() MRComObject(xlApp) MRComObjectでCOM オブジェクトへの参照を解放しています。 このプログラムでは特に問題ないのですが、 xlobj = xlApp.Worksheets("Sheet2") xlobj2 = xlobj.Range("A1:C2") xlobj2.Value = "TEST" のようにワークシートを指定すると解放できません。 xlSheet = xlBook.Worksheets("Sheet2") としてもプロセスが残ります。 またVB6.0では可能だった xlApp.Worksheets("Sheet2").Select() のようにワークシートを切り替えるときもVB2008ではプロセスが残ってしまいます。 これはどのようにしたら解決するのでしょうか?

  • エクセル0.0の書式

    エクセル0.0と表示したいのですが0を入力すると表示されません。 書式設定で数値、小数点以下の桁数を1にしても何も表示されません。 元の作成者が別の人なので、どう設定しているかわかりかねています。 設定方法を簡潔に教えてください。

  • VBA EXCEL FORMAT書式で指定した書式で表示されない。

    VBA EXCEL FORMAT書式で指定した書式で表示されない。 EXCEL2003,2007利用環境で フォーム上またはセル上で FORMAT指定しますと 5000 が 5 と表示されます。 50000 が 50 と表示されます。 例 RANGE("A1")="5000" RANGE("A1").VALUE=FORMAT(RANGE("A1"),"#,##0") FORMも同様に TEXTBOX1.VALUE="5000" TEXTBOX1.VALUE=FORMAT(TEXTBOX1.VALUE,"#,##0") 結果は 5 となります ちなみに RANGE("A1").NUMBERFORMATLOCAL="#,##0" は 正常に 5,000と表示されます。 他のPCではこのような症状はでないのですが1部のPCのみ発生しております。 該当PCは問題発生後 2007(2000より移行)をアンインストール後2003をインストールし 2007もインストールしています。 どなたかご教授をお願いいたします。

  • 【Excel2003】 セルの書式を変えたのに反映されない??

    いつもお世話になります。 エクセル2003を利用しています。 うまく説明できないので、実例を具体的に挙げてみます。 ──────────────────── 1.セルの書式設定をすべて「文字列」にしたシートがあります。 2.例えば、列Aに   04/01   04/03   05/03   06/02   ・   ・ のように入力されています。 3.列Aを全体を選択状態にし、書式設定からユーザー定義で「yyyy/mm/dd」と入力してOKを押します。 ──────────────────── 3の手順まで操作するんですがyyyy/mm/dd(例:2006/04/01)のような表示になりません。 しかし、該当セルをダブルクリックしてEnterを押すと反映されます。 しかし列Aにはすさまじい数のデータが入力されており、「F2→Enter・Enter」を延々繰り返すはめになっています。 書式を変えたらすぐに反映させるにはどのようにすればいいのでしょうか? 「ツール」→「オプション」→「計算方法」で再計算を選択しても反映されません。 とても困っています。 アドバイスでもいいのでだれか助けてください。。。 (環境) WindowsXP-Pro-SP2 Excel2003-SP2

  • ExcelのLeftFooterに書き込むには

    VB初心者です。 VBのフォームに入力した後、既存のExcelファイルを立上げ、 データーを指定のセルに書き込むプログラムを作りました。 下記がそのプログラムです。 D文書名という変数に格納されたデーターを ExcelのLeftFooterに書き込むにはどうしたらいいのでしょうか。 ご存知の方教えてください。 Private Sub 文書作成() Dim D文書ファイル名, D文書種類, D文書名, D文書管理番号, D作成者, D作成日 As String D文書ファイル名 = Me.文書ファイル名TextBox.Text D文書種類 = Me.文書種類ComboBox.Text D文書名 = Me.文書名TextBox.Text <---***このデーター*** D文書管理番号 = Me.文書管理番号TextBox.Text D作成者 = Me.作成者ComboBox.Text D作成日 = Me.作成年月日DateTimePicker.Text 'MsgBox(D文書ファイル名 & D文書種類) MsgBox("Excelファイルを立上げ" & Chr(13) & Chr(13) & "文書種類/文書名/管理番号/作成者/作成日を書き込みます。") Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks '既存のファイルを開く場合 Dim xlFilePath As String = "\\Ws55\日東電工\標準書類\原紙\原紙0.xls" Dim xlBook As Excel.Workbook = xlBooks.Open(xlFilePath) Dim xlSheets As Excel.Sheets = xlBook.Worksheets Dim xlSheet As Excel.Worksheet = CType(xlSheets.Item(1), Excel.Worksheet) xlApp.Visible = True '================== データの入力処理 ================== 'Dim xlRange As Excel.Range Dim strDat(2, 0) As Object Dim D文書ファイル名Range, D文書種類Range, D文書名Range As Excel.Range Dim D文書管理番号Range, D作成者Range, D作成日Range As Excel.Range D文書ファイル名Range = xlSheet.Range("A1:A1") D文書種類Range = xlSheet.Range("B2:B2") D文書名Range = xlSheet.Range("K2:K2") D文書管理番号Range = xlSheet.Range("F5:F5") D作成者Range = xlSheet.Range("AE4:AE4") D作成日Range = xlSheet.Range("S5:S5") D文書ファイル名Range.Value = D文書ファイル名 D文書種類Range.Value = D文書種類 D文書名Range.Value = D文書名 D文書管理番号Range.Value = D文書管理番号 D作成者Range.Value = D作成者 D作成日Range.Value = D作成日 End Sub

専門家に質問してみよう