• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel-VBA セルのデータ書出し(Q2))

Excel-VBA セルのデータ書出しについて質問

end-uの回答

  • end-u
  • ベストアンサー率79% (496/625)
回答No.5

>ヘルプ >ANo.3 前回の試行では動作したのですが、今日は何故だか実行エラーが出ます!? >その都度、[デバッグ(D)]⇒[ステップイン(F8)]をクリックすれば次に進みますが、 >何故実行エラーが発生するのでしょうか!? 確かに実行環境によってはエラーが出ますね。 「OpenClipboardに失敗しました」の文字通り、クリップボードがOpenできないようです。 DataObjectを使うコードはLoopを繰り返す処理には向いてないのでしょう。 そういう事も踏まえて test5,6 を提示してみました。 Win32API関数というものを使って、OpenClipboardできるまで待機する.. という手もありかと思いますが、 冗長になりますし、それほどDataObjectに拘るつもりもないですから、 ここは素直にSplitをメインにした配列処理を使われると良いと思います。 以下はあくまで参考です。 Win32APIではなく、Application.ClipboardFormatsを判定に使って待機する例。 #いずれにしても、エラー処理などで冗長になりますね。 Option Explicit Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Sub test7()   Const MX As Long = 100 '待機Loop回数   Dim r As Range   Dim s As String   Dim i As Long   Dim j As Long   Dim n As Long   Dim x   On Error GoTo errHndlr   Application.ScreenUpdating = False   Application.StatusBar = ""   Set r = Range("A1:G5")   Range("A11", Cells(Rows.Count, 1).End(xlUp)).Clear   n = 11   With New DataObject     For i = 1 To r.Columns.Count       'Copy成功するまで待機       For j = 1 To MX         r.Columns(i).Copy         DoEvents         x = Application.ClipboardFormats         If UBound(x) > 2 Then Exit For         Sleep 100       Next       If j > MX Then         Err.Raise 1000       End If              .GetFromClipboard       s = .GetText(1)       .Clear       .SetText Replace$(s, """", "")       .PutInClipboard       ActiveSheet.Paste Cells(n, 1)       n = Cells(Rows.Count, 1).End(xlUp).Row + 1     Next   End With   On Error Resume Next   Range("A11", Cells(n, 1)).SpecialCells(xlCellTypeBlanks).Delete shift:=xlShiftUp   On Error GoTo 0 errHndlr:   Application.CutCopyMode = False   Application.StatusBar = False   Set r = Nothing   If Err.Number <> 0 Then     MsgBox Err.Number & "::" & Err.Description   End If End Sub

sakuraww
質問者

お礼

end-uさん、 ご丁寧なご教授本当に有難うございました。 今回の課題解決には、 ご推奨の「test5,6」を活用させていただきます。 今後ともよろしくお願いいたします。 以上

関連するQ&A

  • エクセルVBAでセル範囲のデータをクリップボードに

    セル範囲のデータをテキストとしてクリップボードに取り込みたいのです。 http://okwave.jp/qa/q5650002.html#16327676 の回答ANo2を見て Sub test01() Dim myData As DataObject Dim myCb As Variant Dim x x = "TESTデータです。" Set myData = New DataObject myData.SetText x myCb = myData.GetText myData.PutInClipboard End Sub は出来ました。 そこで、セル範囲A1:B3をクリップボードに貼ろうといろいろやってみました。 一応、下記でできましたが、実際にはもっと広い範囲を取り込みたいので、もっと簡単な方法はないでしょうか? Sub Clip() Dim myStr As String Dim myData As DataObject Dim myCb As Variant Set myData = New DataObject With Sheets(1) myStr = .Range("A1").Value & ":" & .Range("B1").Value & _ vbNewLine & .Range("A2").Value & ":" & .Range("B2").Value & _ vbNewLine & .Range("A3").Value & ":" & .Range("B3").Value End With myData.SetText myStr ', 1 myCb = myData.GetText If MsgBox("データ" & vbNewLine & myCb & " をクリップボードに送りますか? ", vbYesNo + vbQuestion, "確認") = vbNo Then Exit Sub End If myData.PutInClipboard End Sub

  • アクセスvbaでクリップボードにコピーの動作を実行

    アクセスvbaでクリップボードにコピーの動作を実行したいです。 エクセルなら、 Sub test() Dim buf As String Dim CB As New DataObject buf = "test" With CB .SetText buf ''変数のデータをDataObjectに格納する .PutInClipboard ''DataObjectのデータをクリップボードに格納する .GetFromClipboard ''クリップボードからDataObjectにデータを取得する Debug.Print .GetText ''DataObjectのデータを変数に取得する End With End Sub これが実行できるのですが、 どうやらアクセスだと Dim CB As New DataObject これがエラーになるようです。 Dim CB As Objectにすると .SetText buf で実行時エラー91になります。 (「オブジェクト変数またはWithブロック変数が設定されていません」) http://officetanaka.net/excel/vba/tips/tips20.htm によると、 「DataObjectオブジェクトはMSFormsのメンバです。使用するには、Microsoft Forms 2.0 Object Libraryを参照設定します。または、ブックにUserFormを挿入すると自動的に参照設定されます。」 なので、アクセスvbaの参照設定で「Microsoft Forms 2.0 Object Library」を探したのですが、 ありませんでした。 当方バージョンは2010です。 アクセスでは不可能と言うことでしょうか? ご教授よろしくお願いします。

  • VBA(Excel)セルの罫線について・・・

    VBAで、セルに罫線をつけたいのですが、選択範囲の外枠だけに罫線を ひきたいのに、選択範囲内全ての罫線がひかれてしまいます。 以下のようなものを実行しました。 Public sub Sample() Range("A1:C3").Select With Selection .BorderAround .Borders.ColorIndex = 1 '線の色を黒にする .Borders.Weight = xlThin '線を細い線にする End With End Sub どうしたら、選択範囲の外枠だけに線をひけるでしょうか? よろしくお願いします。

  • エクセルVBAでセル選択するコードが変

    エクセルのワークシートでVBAでセル選択するコードで理解に苦しむことがあります。 通常、Cells(2, 1)はセル番地で言えばA2セル Cells(4, 1)はセル番地で言えばA4セルです。 しかし、 With .Range("B5:B15")でくくれば  .Cells(2, 1)はセル番地で言えばB6セルだと思います。 .Cells(4, 1) はセル番地で言えばB8セルだと思います。 ところが下記のコードを動かすと、なぜかC10:C12が選択されてしまいます。 この理屈がわかりません。 Sub test02()   With Sheets("Sheet1")     With .Range("B5:B15")       .Range(.Cells(2, 1), .Cells(4, 1)).Select     End With   End With End Sub なお、 .Range(.Cells(2, 1), .Cells(4, 1)).Selectを .Range(“A2:A4”).Selectに書きかえると、希望のB6:B8が選択されます。

  • VBAショートカットキー セルの結合・解除

    VBAでエクセルで使用するショートカットキーを作成しております。 エクセルは2007を使用しています。 Ctrl+Shift+F で 選択したセルが、結合していたら解除、解除されていたら結合  という命令を作成しました。(ネットから拝借ですが、、、) 選択した範囲のセルに何も書かれていないときは良いのですが、何かが入力された範囲を 選択して、実行するとエクセル上で 【選択範囲には複数のデータ値があります。1つのセルとして結合すると、選択したセル範囲になるもっとも左上端になるデータのみが保持されます(空白セルは無視されます)】 という警告(?)ウインドウが表示されます。 その後「 OK 」 を押すと問題ないのですが「 キャンセル 」を選択すると VBAで ”実行時エラー’1004” RangeクラスのMergeCells プロパティを設定できません。 と エラーになってしまいます。 「キャンセル」を選択した際に、エラーにならないようにするには、どのように修正すれば良いか 教えて頂きたいです。 以下、作成したマクロです。 デバッグを確認すると[ .MergeCells = True ]の部分が黄色くなります。 ---------------------------------------------------------------------- Sub auto_open() Application.OnKey "+^F", "セルの結合解除" End Sub ’------------------------------ Sub セルの結合解除() With Selection If .MergeCells = False Then .MergeCells = True .HorizontalAlignment = xlCenter Else .MergeCells = False End If End With End Sub ---------------------------------------------------------------------- 何卒宜しくお願い致します。

  • excel2000のVBAを配布用に改造したい

    下記のコードを、多数のユーザーに配布するため、自動的にPERSONAL.XLSのModule 1に登録させられるようなコードを教えていただけるとありがたいです。よろしくお願いいたします。 ■お願いしたいこと (1)下記コード「passget」と「mailsheetopen」を自動的にPERSONAL.XLSのModule 1に追記するコードを教えてほしい (2)さらに「mailsheetopen」のコマンドをツールバー右下に自動的に表示させられるようにしたい Private sub passget() Dim TempObject As MSForms.DataObject Set TempObject = New MSForms.DataObject With TempObject .SetText "<<http://" & ActiveWorkbook.FullName & ">>" .PutInClipboard End With Set TempObject = Nothing End Sub '------------------------------------------------------------ Sub mailsheetopen() On Error Resume Next Call passget Dim target_dir As String Dim target_file As String Dim target_sheet As String target_dir = "C:\Users\new\Desktop" target_file = "rensyu.xls" target_sheet = "rensyu" 'ブックを開く Workbooks.Open Filename:=target_dir & "\" & target_file 'シートを指定 Sheets(target_sheet).Select 'セルを指定 Range("B6").PasteSpecial End Sub

  • VBAでセルの色を変更するには

    ある範囲のあるセルの色のみ一気に変更したいのですが、自力で調べた結果はセルに色を付ける以下の記述までしか分かりませんでした。 例えば、現在のベージュ(40)を赤(3)に変更するにはどう記述すればよいのでしょうか? 宜しくお願いします。 Sub Macro1() Range("A1:N180").Select With Selection.Interior .ColorIndex = 40 .PatternColorIndex = xlAutomatic End With End Sub

  • Excelのマクロで選択範囲内の数値の合計をクリップボードにコピーする

    Excelのマクロで選択範囲内の数値の合計をクリップボードにコピーするマクロとして以下をメニューから呼び出せるようにしています。 が、呼び出すたびにエラーが出て、手動で「Microsoft Forms 2.0 Object Library」を参照設定しています。マクロ内で「Microsoft Forms 2.0 Object Library」を自動で参照設定ONにするようにはできないでしょうか。 --- Sub SumCopy() Dim MyData As DataObject Set MyData = New DataObject MyData.SetText Application.WorksheetFunction.Sum(Selection), 1 MyData.PutInClipboard End Sub ご存知の方がいらっしゃればご教授よろしくお願い致します。

  • VBA:日付を配列に入れ別セルに転記するとデータ型が変わる

    データを別シートに転記するVBAコードを書いていて気付きました。 日付データをバリアント型の配列に入れて、再度書き出すと 21/2/2005 のように表示され、さらに日付ではなく、文字列になってしまいました。 具体的には下記のような内容です。Sheet1 の A1:A10 に 2005/2/21 のような日付が入力されています。 1. セル範囲のデータをバリアント型の配列に格納 2. 1.を別のセルへ一括転記を行う Sub TestMacro()   Dim Buf As Variant   With Sheets("Sheet1").Range("A1:A10")     Buf = .Value     '・・・(1)     .Offset(0, 3) = Buf  '・・・(2)   End With End Sub ウォッチ式で変数を確認すると(1)および(2)の時点では #05/02/21# Variant/Date型 と正しく日付として扱われているようです。しかし、転記されたセルを見てみると、「文字列で 21/2/2005 」となっているのです。 2005/2/21 が返されるものと思うのですが、なぜ、このような現象が起こるのでしょうか?何かとんでもない勘違いをしているのでしょうか? テスト環境は Win98SE + EXCEL2002 です。よろしくお願いします。

  • VBAでセル範囲条件の指定

    下記のようなことを行いたいのですが、VBAの記述でうまくいかなくて困っています。 ----------------------- もし、現在選択中のセルがA1からA5の範囲にあるならば→「実行1」を行う もし、A1からA5の範囲内にないなら「実行2」を行う ------------------------ たったのこれだけのことなのですが、「A1からA5の範囲」を指定する方法がよくわかりません。 ------------------------ Sub セル範囲判定() If ActiveCell = Range("A1:A5") Then MsgBox "A1:A5がアクティブです" Else MsgBox "A1:A5がアクティブではありません" End If End Sub ------------------------- などとしてもうまくいきません。 構文が良くわかっていないので困っています。 「アクティブセルが○○なら」という部分を教えていただけると助かります。