teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

誤りの修正

2021/01/14 02:09

投稿

退会済みユーザー
answer CHANGED
@@ -65,6 +65,12 @@
65
65
  End With
66
66
  End Sub
67
67
  ```
68
+ そして追加で調べた結果、下記を質問への追記へ投稿しましたがこちらにも記載します。
68
69
 
70
+ すみません
69
- また、追記コード同様手法一から順に確認してください
71
+ 回答を編集した後に追加でこちらでも調べどうDataObject自体不具合の可能性があるよう
72
+ https://teratail.com/questions/190985
70
- 正確な問題把握と適切な質問はあなた期待する回答への到達時間を短くす。
73
+ web上でも同様報告が多数あり、マイクロソフトも認識ているようです。
74
+ WindowsAPIによる代替を提案していますが、私はまだ使用したことがないためお伝えする事が出来ません。
75
+ こちらのサイトが参考になるかもしれません。
76
+ https://www.ka-net.org/blog/?p=7537

3

追記への対応

2021/01/14 02:09

投稿

退会済みユーザー
answer CHANGED
@@ -37,4 +37,34 @@
37
37
  > ではなぜVBAで配列必須になるかと言うと、
38
38
  セルを使うと処理速度が非常に遅く、これを高速に処理するために配列が必要となるからです。
39
39
 
40
- Excelの挙動に影響されないように変数へデータを逃がせば同様の問題は起こらなくなると思います。
40
+ Excelの挙動に影響されないように変数へデータを逃がせば同様の問題は起こらなくなると思います。
41
+
42
+ 【追記】
43
+ 下記コードを一からステップインで確認して下さい。
44
+ ローカルウィンドウに変数のデータが表示されるので、変数xの中身は確認できます。
45
+
46
+ ```VBA
47
+ Option Explicit
48
+
49
+ Sub main()
50
+ Dim obj As New Class1
51
+ With obj
52
+ .SetClipboard
53
+ End With
54
+ End Sub
55
+
56
+ 【クラスモジュール作成 クラス名:class1】
57
+ Public Sub SetClipboard()
58
+ Range(Cells(3, 3), Cells(3, 3)).EntireColumn.Hidden = True
59
+ Dim x '変数宣言
60
+ x = Cells(3, 3).Value '値のみ取得
61
+
62
+ With New DataObject
63
+ .SetText x
64
+ .PutInClipboard
65
+ End With
66
+ End Sub
67
+ ```
68
+
69
+ また、追記コードも同様の手法で一から順に確認してください。
70
+ 正確な問題把握と適切な質問はあなたの期待する回答への到達時間を短くします。

2

誤字の修正

2021/01/14 01:49

投稿

退会済みユーザー
answer CHANGED
@@ -10,7 +10,6 @@
10
10
  SetClipboard (x)
11
11
  End Sub
12
12
 
13
- End Sub
14
13
  Private Sub SetClipboard(ByRef aText As String)
15
14
  With New DataObject
16
15
  .SetText aText

1

データの追記、修正

2021/01/14 00:53

投稿

退会済みユーザー
answer CHANGED
@@ -1,13 +1,14 @@
1
1
  既にDataObjectでの答えが投稿されているため、その他の補足を追加します。
2
+ .Copyではなく.Valudeを使用すれば非表示でも値を取得出来ます。
2
- 値の保持は変数を用いた方が容易だと思います。
3
+ また値の保持は変数を用いた方が容易だと思います。
3
4
  ```VBA
4
5
  Sub main()
5
6
 
6
- Range(Cells(3, 3), Cells(3, 3)).EntireColumn.Hidden = False
7
+ Range(Cells(3, 3), Cells(3, 3)).EntireColumn.Hidden = True
7
8
  Dim x '変数宣言
8
9
  x = Cells(3, 3).Value '値のみ取得
9
- Range(Cells(3, 3), Cells(3, 3)).EntireColumn.Hidden = True
10
- SetClipboard (Cells(3, 3).Value)
10
+ SetClipboard (x)
11
+ End Sub
11
12
 
12
13
  End Sub
13
14
  Private Sub SetClipboard(ByRef aText As String)
@@ -20,16 +21,15 @@
20
21
 
21
22
  [参考コード エクセルの神髄](https://excel-ubara.com/excelvba4/EXCEL_VBA_418.html)
22
23
 
23
- またセルの直接的な操作は動作が非常に重いため複数の処理を行った場合、著しく遅くなります。
24
+ セルの直接的な操作は動作が非常に重いため複数の処理を行った場合、著しく遅くなります。
24
25
  配列も使用出来れば良いのですが使わなくても動作します。
25
26
  今回はRange(Cells(1, 1), Cells(3, 3))の範囲を取得してx(3, 3)だけ取り出した例です。
26
27
  ```VBA
27
28
  Sub second()
28
29
 
29
- Range(Cells(3, 3), Cells(3, 3)).EntireColumn.Hidden = False
30
+ Range(Cells(3, 3), Cells(3, 3)).EntireColumn.Hidden = True
30
31
  Dim x '変数宣言
31
32
  x = Range(Cells(1, 1), Cells(3, 3)) 'セル範囲を配列取得
32
- Range(Cells(3, 3), Cells(3, 3)).EntireColumn.Hidden = True
33
33
  SetClipboard (x(3, 3))'コード内容が変わらないため省略
34
34
  End Sub
35
35
  ```