• ベストアンサー

VB6.0からEXCELのセル内文字列のサイズを操作すると、複数回操作したところで失敗してしまう

VB6.0で、EXCELを編集し印刷するプログラムを作成しており、セル内の半角文字列を均等割り付けしたいと 考えています。 Excelでは、半角数字のみで構成された文字列の均等割り付けができませんが、文字の間にスペースを 入れることで均等割り付けが働くようになります。 そこでVBのプログラムより、既存ファイルのセルに半角数字と半角スペースを交互に80文字ほどセットし、 その後に半角スペースの文字サイズのみを1にする処理を下記のように記述したのですが、20~30文字 くらい処理したところで実行時エラーが発生してしまいます。  Set xlsApp = CreateObject("Excel.Application")  Set xlsBook = xlsApp.Workbooks.Open(ファイル名)  Set xlsSheet = xlsBook.Worksheets(1)  With xlsSheet   …   strTemp = ""   For i = 1 To Len(strText)   '1文字おきにスペースを挟む    strTemp = strTemp & Mid(strText, i, 1)    If i <> Len(strText) Then     strTemp = strTemp & " "    End If   Next i   .Cells(10, 7).Value = strTemp   '途中に挟んだスペースのサイズを1にする   For i = 2 To Len(strTemp) Step 2    .Cells(10, 7).Characters(i, 1).Font.Size = 1  ←実行時エラーはここで出ます   Next i   …  End With エラーの内容は、  実行時エラー -2147417851(80010105)  '~' メソッドは失敗しました: '~'オブジェクト です。 どうやら、このエラーが出たときはExcelがフリーズしたような状態になっているようでした (×ボタンを押しても反応がなく、セル等の入力もできないが、ブックは×ボタンで閉じることができ、 ブックを閉じるとExcelも終了します。が、タスクマネージャを見るとプロセスは残っています)。また、 実行時エラーが発生するループ箇所をコメントにすると、エラーは発生しなくなります。 数種類のPCで試したのですが、全く同じ条件のPCでもエラーが発生するものとしないものがあり、 原因がわからずに困っています。なお、試したPCはOSがすべてWindowsXP、Excelのバージョンは 2000と2003です。プログラムはディストリビューションウィザードで作成したインストーラを使って 配布しています。また、Excel Objectの参照設定は外してコンパイルしています。 記述方法がよくないのでしょうか?みなさまのお知恵を拝借できれば幸いです。

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

  • ベストアンサー
回答No.2

これが原因かはわからないのですが、エクセルがハングするのが似ているので。

参考URL:
http://support.microsoft.com/kb/414107/ja
fudiwara
質問者

お礼

ご回答ありがとうございます。 現象としては、まさにこんな感じです。KBにはサンプルコードでは16382回のループで停止する、と 回数固定で書いてありますが、当方のコーディングで実行時エラーが出るPCでは、何回処理しても 必ず同じループ回数でエラーを吐きます。エラーが出るループ回数は、PCごとに違うのですが… 回避法として   配列を使用して… とありますが、今回のコーディングでは適用できませんね… 残念です。

その他の回答 (4)

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.5

回答4、onlyromです。 何でも試してみるということで Rangeオブジェクトをオブジェクト変数にセットして。。。  Set myCell = .Cells(10, 7)  For i = 2 To Len(strTemp) Step 2    myCell.Characters(i, 1).Font.Size = 1  Next i 以上。  

fudiwara
質問者

お礼

ご回答ありがとうございます。 ご提示の方法、試してみました。 残念ながら、エラーは消えませんでした… 今日は時間がなくてNo.3の方法は試せませんでしたので、 週明けに試してみて結果をNo.3に書き込みます。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.4

原因が分からないままでは何ですが。。。 エラーの出ない文字ずつ(例えば、20文字ずつ)やってみたらどうなるでしょうか。  For i = 2 To 20 Step 2   .Cells(10, 7).Characters(i, 1).Font.Size = 1  Next i  For i = 22 To 40 Step 2   .Cells(10, 7).Characters(i, 1).Font.Size = 1  Next i   ・・・・・・以下同様に・・Len(strTemp) まで・・     以上。

fudiwara
質問者

お礼

ご回答ありがとうございます。 ご指摘いただいた方法、試してみました。 1カ所にまとめて記述するとダメでしたが、プロシージャ内に分散させて配置するとうまくいきました。 ただ、この状態では保守性がよくないので、他に何か回避方法を模索してみます。

fudiwara
質問者

補足

その後、いろいろ模索し、下記の方法を発見しました。 ExcelブックにExcelVBAマクロで質問のコードを入れてやり、VBからはそのマクロを起動する だけにしたところ、実行時エラーが回避できました。 Excelブックを、質問の記述のとおり  Set xlsApp = CreateObject("Excel.Application")  Set xlsBook = xlsApp.Workbooks.Open(ファイル名)  Set xlsSheet = xlsBook.Worksheets(1) でオープンすると、「マクロを無効にする」等のマクロの警告ダイアログは表示されないので、 ExcelVBAマクロを仕込んでもプログラムの利用者からは操作上何も変化がありません。今回は この方法で行こうと思います。 みなさま、ご回答ありがとうございました。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

私の環境(WindowsXP SP3 + Excel2003)では問題は発生しません。 With を止めてみると直るかも・・・

fudiwara
質問者

お礼

ご回答ありがとうございます。 実は、私の環境(WindowsXP SP2 + Excel2000)でも問題は発生しないのです。他のPCにインストールすると エラーを吐くことがあるので、  コーディング →  インストーラ作成 →  エラーの出るPCのHDDリカバリ →    インストール →  テスト の繰り返しです… > With を止めてみると直るかも・・・ withなしも試してみたのですが、エラーは消えませんでした。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

何をしたいのか分かりません。 均等割り付けの文字列の間に挟んだ空白のフォントサイズを変えても 見かけ上、何の変化もないと思いますが・・・ あと、以下は   For i = 1 To Len(strText)   '1文字おきにスペースを挟む     strTemp = strTemp & Mid(strText, i, 1)     If i <> Len(strText) Then       strTemp = strTemp & " "     End If   Next i   .Cells(10, 7).Value = strTemp        ↓   For i = 1 To Len(strText)   '1文字おきにスペースを挟む     strTemp = strTemp & Mid(strText, i, 1) & " "   Next i   .Cells(10, 7).Value = Trim(strTemp) '前後の空白を除去 でも良いのでは?

fudiwara
質問者

お礼

ご回答ありがとうございます。 > .Cells(10, 7).Value = Trim(strTemp) '前後の空白を除去 > でも良いのでは? コーディングしているときは気がつきませんでしたが、確かにそのとおりですね。さっそく適用したいと思います。

fudiwara
質問者

補足

> 均等割り付けの文字列の間に挟んだ空白のフォントサイズを変えても > 見かけ上、何の変化もないと思いますが・・・ 説明不足でした。こういうことです。  半角55文字程度が入力可能なセルがあります。このセルに、半角で44文字の数値を入れ、  それを均等割り付けにしたいのです。数値とスペースを交互に入れた文字列では87文字と  なってしまい、均等割り付けはおろかセルに収まりすらしません。事情があり、数値の  フォントサイズは11で固定としなければならなく、セルのサイズも固定であるため、  スペースのサイズを小さくして均等割り付け、という方法を採ったのです。

関連するQ&A

  • VB6.0 Excel 同シートで毎回改行して書き込む方法

    こんにちは。VB6.0(SP5)、Excel2003、WindowsXPでVBの勉強をしています。 現在、VBでコマンドボタンを押した時に、Excelに押した時の時間を書き込むプログラムを作成しています。 一応プログラムを組むことができたのですが、再びコマンドボタンを押すと2回目以降書き込んだ時間を上書きするものです。 コマンドボタンを押した時、時間の書き込みを毎回次の行で行うプログラムを組みたいと思っています。 毎回改行して書き込むためには、どのようにプログラムを書くと良いでしょうか? ご指導よろしくお願いします。 組んだプログラムを下記に記します。 Private Sub Command1_Click() Dim xlsApp As Object Dim xlsBook As Object Dim xlsSheet As Object On Error Resume Next Set xlsApp = GetObject(, "Excel.Application") Set xlsBook = xlsApp.ActiveWorkbook Set xlsSheet = xlsBook.Sheets.Add If Err.Number <> 0 Then Set xlsBook = xlsApp.Workbooks.Add Set xlsSheet = xlsBook.ActiveSheet End If Call Excel(xlsBook, xlsSheet) Set xlsSheet = Nothing Set xlsBook = Nothing Set xlsApp = Nothing On Error GoTo 0 End Sub Private Sub Excel(xlsBook As Object, xlsSheet As Object) Dim hh As Single Dim mm As Single Dim ss As Single xlsSheet.Range("A1") = Format(Time, "hh:mm:ss") End Sub

  • Excelvba2000でExcelファイル間のコピーを行いたい

    現在マクロ実行中のExcelブックのシートのセルの値を、 新規作成したブックのシートのセルに値を貼り付けたいのですが、 うまくいきません。 ただし、コピーの条件として、クリップボードは使用しない Activeメソッドや、Selectメソッドも使用しないという制約があります 以前は、うまくいっていたのですが、コードの書き方を忘れてしまいました。以下の★印の行で、 「RangeクラスのCopyメソッドが失敗しました。」とエラーが出ます。 以前は、以下のコードに似た、ロジックで、問題なかったのですが、 どこか間違っていますでしょうか? Dim xlsApp As Excel.Application Dim xlsBook As Excel.Workbook Dim xlsSheet As Excel.Worksheet Set xlsApp = CreateObject("Excel.Application") Set xlsBook = xlsApp.Workbooks.Add Set xlsSheet = xlsBook.Worksheets(1) '★エラー発生 ThisWorkbook.Worksheets("Sheet1").Range("A1:D4").Copy _ Destination:=xlsBook.Worksheets("Sheet2").Range("E5")

  • VBによる変数でエクセルを開く

    解る方教えて下さい。 例えば、決まったファイル名のエクセルを開く時は、 SET xlsApp = CreateObject("Excel.Application") SET xlsBook = xlsApp.Workbooks.open("C:\TEMP\テスト.xls") SET xlsSheet = xlsBook.Sheets(1)  だと思いますが、 訳あって、エクセルファイル名が入った変数(例 ZZFILE)で開きたいのですが Workbooks.open の指定方法がわかりません。 解る方、宜しくお願い致します。

  • Excelにおけるセルの値をVB2005に配列として取り込みたい

    Excelのセルの値をVB2005に配列として取り込みたいのですが、Excel.Rangeと配列の整合性が取れず困っています。 なんらかヒントになるような助言をお願いします。 以下は今までに作成中のコードです。 Public Class Form1 Dim xlsapp As New Excel.Application Dim xlsbook As Excel.Workbook Dim xlssheet As Excel.Worksheet Dim fn As String = "sample.xls" Dim Q(,,) As Double Dim i, j, x, y, z As Integer Dim k As Double Dim w(i), v(i), u(i) As Double Dim As Object Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click xlsbook = xlsapp.Workbooks.Open(fn) xlssheet = xlsbook.Worksheets(1) k = 1 w(i) = xlssheet.Cells(1, 3) v(i) = xlssheet.Cells(1, 2) u(i) = xlssheet.Cells(1, 1) For x = 2 To 11 If w(i) = 1 Then For y = 2 To 11 If v(i) = 1 Then Q(1, 1, k) = u(i) k = k + 1 End If Next End If Next z = k For k = 1 To z TextBox1.Text = Q(1, 1, k) Next End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Me.Close() xlsapp.DisplayAlerts = False xlssheet = Nothing xlsbook.Close() xlsbook = Nothing xlsapp.Quit() xlsapp = Nothing End Sub End Class

  • ASPでエクセルの起動

    わかる方教えて下さい。 Set xlsApp=server.CreateObjec("Excel.Application") Set xlsBook =xlsApp.Workbooks.Add Set xlsSheet = xlsBook.Sheets.Add xlsBook.Application.Visible = True でASPからエクセルを起動したいと思いましたが、 『Server オブジェクト, ASP 0178 (0x80070005) 許可を確認中に Server.CreateObject の呼び出しに失敗しました。このオブジェクトへのアクセスは拒否されます。』 というエラーでエクセルが起動しません。 構文が悪いのでしょうか? それともサーバー側で何か設定しなくてはいけないのでしょうか? 但しサーバーと言ってもWin2000 Professional のOsクライアントですが(当然IIS等はセットアップ済)それがいけないのでしょうか? お願い致します。

  • Excelのセル内の文字操作について

    Excelのセル内に、例えば Rmax_20.5s (←_ は半角スペースです) などの様な文字列が入っているのを、関数を使用して 20.5 の様に数値のみを残すことは可能でしょうか。 REPLACEやSEARCHなどで試みましたが、出来ませんでした。 どうぞ宜しくお願い申し上げます。

  • VBのエクセル操作について

    VB6.0で下記のようなロジックでエクセル操作をしていますが、 エクセル出力時に全て文字列扱いされるため計算処理でエラーとなって困っています。 数字は数値型で出力したいのですが、良い方法はありますでしょうか。 dim csvline() as string . . . csvline = Split("AAA,BBB,0,1,3,4", ",") . . . XlsSheet.Range(Cells(0, 1),Cells(0, 6) = csvline

  • オブジェクトが必要です・・・・・

    オブジェクトが必要です・・・・・ すみません、判りません、丸投げです(爆)、申し訳ありませんがどなたか完成していただけませんか?;; また、この辺りをサルでも判るように解説してくれていて勉強し易いサイトがあったら教えてください・・・ Private Sub コマンド1_Click() Dim xlsApp As Excel.Application Dim xlsBook As Excel.Workbook Dim xlsSht As Excel.Worksheet Set xlsApp = CreateObject("Excel.Application") Set xlsBook = xlsApp.Workbooks.Open("■■■■■.xls") Set xlsSht = xlsWkb.Sheets(■■■■) If xlsBook.ReadOnly Then xlsBook.Close MsgBox "そのファイルは既に開かれています。" xlsApp.Quit Else xlsBook.Close End If Set wkb = Nothing: Set xls = Nothing Exit_exOpenEditC: Exit Sub Err_exOpenEditC: MsgBox Err.Number & " - " & Err.Description Resume Exit_exOpenEditC End Sub accessからexcelファイルをシートを指定して開き、重複の場合は開かない様にし、メッセージボックスを表示させたいのです・・・

  • ASP(VBScript)にてExcelアプリケーションが終了しない

    こんばんは VBScriptでExcelを読込みサーバのDBに内容を登録後に終了をしているのですがサーバにExcelアプリケーションが残ったままになっています。 strGetFileName = "C:\a.xls" 'Excelシート設定 Set xlsApp = Server.CreateObject("Excel.Application") xlsApp.Workbooks.Open strGetFileName Set xlsBook = xlsApp.Workbooks(1) Set xlsSheet = xlsBook.Worksheets(2) ← 二枚目のシート --中略-- xlsSheet.Application.Quit 'Excelアプリケーションのメモリ開放 Set xlsSheet = Nothing Set xlsBook = Nothing Set xlsApp = Nothing といったコーディングなのですが処理を重ねるたびにタスクマネージャに Excelアプリケーションが残り、重くなってしまいます。 終了の方法が悪いのではないかとは思いますが、実現方法がわかりません。 オブジェクトをオープンしているのでクローズ命令でも試してみましたがうまくいきませんでした。 どなたかご存知の方いらっしゃいましたら教えてください。 OS Win2000 ASP,BASP 言語 Html,VBScript,JavaScript

  • Excelで文字間をあける方法について

    初歩的な質問ですみません。 Excelで文字と文字の間をあけたいのですが、均等割り付けにすると間が開き過ぎてしまい、半角でスペースを入れても間が開き過ぎてしまいます。(ちなみに縦書きです) 自由に文字間を指定することはできないのでしょうか。 良い方法がありましたら教えてください。 よろしくお願いします。

専門家に質問してみよう