
Excel(office365)を使っている者です。
以下はクリップボードに値のみをコピーするコードですが,範囲内に空白行があった場合,クリップボードには余計な改行が入ってしまいます。
最後の余計な改行を消したいため,ネットで調べて,For Each ary In Selection~nextを入れたのですが,型が一致しないということでエラーになってしまいます。どうすれば余計な改行を削除できるか,ご教示願います。よろしくお願いいたします。
---------------------------------------------------------------------------
Sub 値のみコピー()
Dim ary As Variant
ary = Range("A10:J30").Value
Dim myDO As New DataObject
Dim i As Long, j As Long
Dim strBuf As String
For i = 1 To UBound(ary, 1)
For j = 1 To UBound(ary, 2)
strBuf = strBuf & ary(i, j)
Next
strBuf = strBuf & vbCrLf '改行コードを付加
For Each ary In Selection
If Len(ary.Value) > 0 Then
Do While Right(ary.Value, 1) = vbLf
ary.Value = Left(ary.Value, Len(ary.Value) - 1)
Loop
End If
Next
Next
myDO.SetText strBuf
myDO.PutInClipboard
Set myDO = Nothing
End Sub
No.1ベストアンサー
- 回答日時:
前提条件として、A10:J30のセルの値を、1行ごとに区切り文字なしに連結して改行し、まとめてクリップボードに送るコードです。
以下の2点を実現するために、コードを修正してみました。
(1)範囲内に空白行があった場合、これを無視して、改行コードを入れない
(2)データの最後の改行を入れない
Sub send_clipboard()
Dim ary As Variant
Dim myDO As New DataObject
Dim i As Long, j As Long
Dim LineBuf As String
Dim strBuf As String
ary = Range("A10:J30").Value
For i = 1 To UBound(ary, 1)
For j = 1 To UBound(ary, 2)
LineBuf = LineBuf & ary(i, j)
Next
If (Len(LineBuf) > 0) And (i < UBound(ary, 1)) Then LineBuf = LineBuf & vbCrLf '空白行でなく、最終行でもないとき改行コードを付加
strBuf = strBuf & LineBuf
LineBuf = ""
Next
Set myDO = New DataObject
myDO.SetText strBuf
myDO.PutInClipboard
Set myDO = Nothing
End Sub
ご質問者の言う
>最後の余計な改行を消したい
という意味が「空白行の最後」なのか「データの最後」なのか曖昧たったので、「データの最後」も含むと解釈しましたが、「空白行の最後」のみという意味の場合、
If (Len(LineBuf) > 0) And (i < UBound(ary, 1)) Then ・・・・・・
というコードを
If (Len(LineBuf) > 0) Then ・・・・・・
に修正してください。
誠にありがとうございます。
お礼が遅くなり申し訳ありません。
動作を確認しましたが,希望どおりの動きでした。
実はコードについて調べても理解できない点があるため,教えていただけると幸いです。
---------------------------------
ary = Range("A10:J30").Value
For i = 1 To UBound(ary, 1)
For j = 1 To UBound(ary, 2)
LineBuf = LineBuf & ary(i, j)
---------------------------------
の部分ですが,UBound(ary, 1)では,何が戻り値になりますか?
また,LineBuf = LineBuf & ary(i, j)とはどういう処理でしょうか。
No.3
- 回答日時:
No.1,2です。
>strBufの変数には何の意味があるのでしょうか。
strBuf変数も、もともと、ご質問者のVBAに登場する変数であり、その意味を変更していません。
ご質問者のVBAでは、strBufは全てのセルを結合して一纏めにしたものですが、私のコードでもstrBuf変数は一行を一纏めにしたLineBuf変数を繋ぎあわせて複数行のデータに纏めたものです。つまり、結果としてすべのセルを一目纏めにしたものであり、その意味は変わっていません。
但し、私のコードでは、一行ごとに改行の要否判定を行っていますので改行コードの部分のみ違いが発生することになります。
方法論として「纏めてから改行コードを排除する」という方法ではなく「纏める前に改行の要否を判断する」という方法に変えただけです。
No.2
- 回答日時:
No.1です。
>UBound(ary, 1)では,何が戻り値になりますか?
aryにA10:J30のセル範囲を代入しているので、aryは行数21、列数10の2次元配列になります。
上記のとおり行数21ですので、行数である21が戻り値になります。
とはいえ、For i = 1 To UBound(ary, 1)は、もともとご質問者のVBAにもあるコードです。意味もわからずに使っていたということでしょうか?
>LineBuf = LineBuf & ary(i, j)とはどういう処理でしょうか。
上記説明のとおり、aryにA10:J30のセル範囲を代入しているのでary(i, j)は範囲内のセルの値を意味します。
iを固定して、jを進めれば、同じ行のセルの値を順次取得できます。
取得した値を次々とLineBufに&結合していけば一行分の結合データが出来上がります。
つまり、LineBufは一行分の結合データを作成するための変数です。
一行分の結合データが作成されたら、この長さをチェックして「長さ>0」のときだけ改行するようにすれば、空白セルでは改行されないことになります。
丁寧に教えていただき,ありがとうございます。
すみません。もう一点教えていただけると幸いです。
strBufの変数には何の意味があるのでしょうか。
確かに,書いていただいたコードを以下のように,strBufをなくして走らせると何もクリップボードに入らなくなってしまいますが。
Sub send_clipboard()
Dim ary As Variant
Dim myDO As New DataObject
Dim i As Long, j As Long
Dim LineBuf As String
ary = Range("A10:J30").Value
For i = 1 To UBound(ary, 1)
For j = 1 To UBound(ary, 2)
LineBuf = LineBuf & ary(i, j)
Next
If (Len(LineBuf) > 0) And (i < UBound(ary, 1)) Then LineBuf = LineBuf & vbCrLf '空白行でなく、最終行でもないとき改行コードを付加
LineBuf = ""
Next
Set myDO = New DataObject
myDO.SetText LineBuf
myDO.PutInClipboard
Set myDO = Nothing
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】エクセルで値のみクリップボードにコピーするコードについて(貼り付け時の空白削除) 3 2023/09/06 23:37
- Visual Basic(VBA) フォルダの作成 3 2021/11/10 11:05
- Visual Basic(VBA) シートごとに 個数と集計 2 2021/10/25 22:00
- Visual Basic(VBA) VBAで教えて頂きたいのですが? 3 2021/11/12 23:38
- Visual Basic(VBA) 条件をつけてカウントする 4 2021/12/19 20:27
- Visual Basic(VBA) Excel VBAでフォルダ内の全テキストファイルの任意データを取得について 7 2021/12/18 16:00
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- Visual Basic(VBA) Excelで別のブックから検索してセルのコピペをしたい 3 2021/10/21 11:10
- Excel(エクセル) VBA Scripting.Dictionary 連想配列 複数参照する方法 2 2021/12/17 01:52
- Word(ワード) word_VBA_フォームからダイアログそこからの復帰について 2 2021/12/13 23:44
このQ&Aを見た人はこんなQ&Aも見ています
-
EXCEL(VBA) 末尾の改行のみ削除したい
Excel(エクセル)
-
最終行の改行について
Visual Basic(VBA)
-
【エクセル】セル最後にある無駄改行を検索・削除したい
Excel(エクセル)
-
-
4
Excel VBAで改行を含めたセルのコピー
Excel(エクセル)
-
5
Excel セル内の最初と最後の改行を削除
Excel(エクセル)
-
6
EXCEL VBA セルに既に入力されている文字に文字を追加する
Excel(エクセル)
-
7
Excel VBAで改行を含む文字列を1つのセルに貼り付け
Excel(エクセル)
-
8
文字列からタブコードを取り除きたい
Visual Basic(VBA)
-
9
エクセルVBAで5行目からオートフィルタモードに設定したいたい
Excel(エクセル)
-
10
EXCEL VBAで、セルの文字列の前後に文字を入力する方法は?
その他(Microsoft Office)
-
11
vbsで最後の行を削除する
その他(プログラミング・Web制作)
-
12
EXCELで特定のセルに表示された項目をヘッダーやフッターに出力するには
Excel(エクセル)
-
13
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
14
エクセルVBAで一つ上の階層を指定して保存したい
Excel(エクセル)
-
15
配列で格納したものをmsgboxで表示する方法について
Access(アクセス)
-
16
エクセルVBAでcmbBoxのプロパティの設定方法
その他(Microsoft Office)
-
17
VBAでCSVの1行目だけを書き換える方法
Excel(エクセル)
-
18
テキストファイルから改行コードを削除して読込む方法
Visual Basic(VBA)
-
19
リストと一致する値のセルを塗りつぶしたい。
その他(Microsoft Office)
-
20
【VBA】テキストファイルを指定行数からの読み込み
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エスケープ文字の復帰(¥r)と...
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
jsp 改行コードで改行させて表...
-
変数の中の改行コードをBRタグ...
-
C++でのCRLFについて
-
vb.netでのリッチテキストボッ...
-
VBAでCSVをExcelに取り込む時に...
-
COBOLの改行
-
Excel VBAからBeckyを起動して...
-
改行コード2種類を混在させたい
-
texのchapterが改行される
-
delphi でのコード上でTab を入...
-
C# 文字列を改行コードで分割
-
グレープシティのSPREAD...
-
JavaDoc コメントの改行について
-
Eclipse(3.2.0)で複数にまたが...
-
awkで改行を除いて文字列を抜き...
-
改行について
-
改行コードが半角スペースにな...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのコマンドボタンの文字列の...
-
ソースコードの1行が長いとき...
-
エスケープ文字の復帰(¥r)と...
-
C++で空Enterの入力を判...
-
VBAでCSVをExcelに取り込む時に...
-
改行について
-
改行を読み飛ばす
-
テキストボックス行の桁数を制...
-
C# DataGridViewのセルを改行禁...
-
LaTeX: captionの中で改行した...
-
JAVA System.out.println の ...
-
エクセルVBA 文字列領域が不足...
-
最終行の改行について
-
グレープシティのSPREAD...
-
【VBA】エクセルで最後の不要な...
-
jsp 改行コードで改行させて表...
-
ラベル(スタティックテキスト)...
-
1行ごとに取得して、その改行...
-
ファイルから読み取った改行文...
-
JavaDoc コメントの改行について
おすすめ情報