- ベストアンサー
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の参照設定は外してコンパイルしています。 記述方法がよくないのでしょうか?みなさまのお知恵を拝借できれば幸いです。
- fudiwara
- お礼率100% (5/5)
- Visual Basic
- 回答数5
- ありがとう数5
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
これが原因かはわからないのですが、エクセルがハングするのが似ているので。
その他の回答 (4)
- onlyrom
- ベストアンサー率59% (228/384)
回答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 以上。
お礼
ご回答ありがとうございます。 ご提示の方法、試してみました。 残念ながら、エラーは消えませんでした… 今日は時間がなくてNo.3の方法は試せませんでしたので、 週明けに試してみて結果をNo.3に書き込みます。
- onlyrom
- ベストアンサー率59% (228/384)
原因が分からないままでは何ですが。。。 エラーの出ない文字ずつ(例えば、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) まで・・ 以上。
お礼
ご回答ありがとうございます。 ご指摘いただいた方法、試してみました。 1カ所にまとめて記述するとダメでしたが、プロシージャ内に分散させて配置するとうまくいきました。 ただ、この状態では保守性がよくないので、他に何か回避方法を模索してみます。
補足
その後、いろいろ模索し、下記の方法を発見しました。 ExcelブックにExcelVBAマクロで質問のコードを入れてやり、VBからはそのマクロを起動する だけにしたところ、実行時エラーが回避できました。 Excelブックを、質問の記述のとおり Set xlsApp = CreateObject("Excel.Application") Set xlsBook = xlsApp.Workbooks.Open(ファイル名) Set xlsSheet = xlsBook.Worksheets(1) でオープンすると、「マクロを無効にする」等のマクロの警告ダイアログは表示されないので、 ExcelVBAマクロを仕込んでもプログラムの利用者からは操作上何も変化がありません。今回は この方法で行こうと思います。 みなさま、ご回答ありがとうございました。
- nda23
- ベストアンサー率54% (777/1415)
私の環境(WindowsXP SP3 + Excel2003)では問題は発生しません。 With を止めてみると直るかも・・・
お礼
ご回答ありがとうございます。 実は、私の環境(WindowsXP SP2 + Excel2000)でも問題は発生しないのです。他のPCにインストールすると エラーを吐くことがあるので、 コーディング → インストーラ作成 → エラーの出るPCのHDDリカバリ → インストール → テスト の繰り返しです… > With を止めてみると直るかも・・・ withなしも試してみたのですが、エラーは消えませんでした。
- nda23
- ベストアンサー率54% (777/1415)
何をしたいのか分かりません。 均等割り付けの文字列の間に挟んだ空白のフォントサイズを変えても 見かけ上、何の変化もないと思いますが・・・ あと、以下は 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) '前後の空白を除去 でも良いのでは?
お礼
ご回答ありがとうございます。 > .Cells(10, 7).Value = Trim(strTemp) '前後の空白を除去 > でも良いのでは? コーディングしているときは気がつきませんでしたが、確かにそのとおりですね。さっそく適用したいと思います。
補足
> 均等割り付けの文字列の間に挟んだ空白のフォントサイズを変えても > 見かけ上、何の変化もないと思いますが・・・ 説明不足でした。こういうことです。 半角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
- ベストアンサー
- Visual Basic
- 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")
- ベストアンサー
- Visual Basic
- VBによる変数でエクセルを開く
解る方教えて下さい。 例えば、決まったファイル名のエクセルを開く時は、 SET xlsApp = CreateObject("Excel.Application") SET xlsBook = xlsApp.Workbooks.open("C:\TEMP\テスト.xls") SET xlsSheet = xlsBook.Sheets(1) だと思いますが、 訳あって、エクセルファイル名が入った変数(例 ZZFILE)で開きたいのですが Workbooks.open の指定方法がわかりません。 解る方、宜しくお願い致します。
- ベストアンサー
- Visual Basic
- 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
- 締切済み
- Visual Basic
- 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等はセットアップ済)それがいけないのでしょうか? お願い致します。
- ベストアンサー
- Microsoft ASP
- 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
- ベストアンサー
- Visual Basic
- オブジェクトが必要です・・・・・
オブジェクトが必要です・・・・・ すみません、判りません、丸投げです(爆)、申し訳ありませんがどなたか完成していただけませんか?;; また、この辺りをサルでも判るように解説してくれていて勉強し易いサイトがあったら教えてください・・・ 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
- ベストアンサー
- Microsoft ASP
- Excelで文字間をあける方法について
初歩的な質問ですみません。 Excelで文字と文字の間をあけたいのですが、均等割り付けにすると間が開き過ぎてしまい、半角でスペースを入れても間が開き過ぎてしまいます。(ちなみに縦書きです) 自由に文字間を指定することはできないのでしょうか。 良い方法がありましたら教えてください。 よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
お礼
ご回答ありがとうございます。 現象としては、まさにこんな感じです。KBにはサンプルコードでは16382回のループで停止する、と 回数固定で書いてありますが、当方のコーディングで実行時エラーが出るPCでは、何回処理しても 必ず同じループ回数でエラーを吐きます。エラーが出るループ回数は、PCごとに違うのですが… 回避法として 配列を使用して… とありますが、今回のコーディングでは適用できませんね… 残念です。