Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


61 / 3841 ページ ←次へ | 前へ→

【81256】Re:コピペのコードで悩んでいます。
質問  Ackkn  - 20/4/10(金) 22:20 -

引用なし
パスワード
   ▼マナ さん:
>▼Ackkn さん:
>
>では、いったん全部コピーしたあとで、
>空白列を削除してはどうでしょうか。
>
>もしくは、5列しかないのだから、
>空白かどうか確認しながら、1列ずつコピーするとか。

マナ さん

ご返答ありがとうございます。
最初の質問時に書きましたが、この5列は仮で本当は
1ヶ月分31日(列)あります。そして、行も4行を1ア
イテムとして5アイテムあります。
5アイテムの生産実績の表で、4行の最下行が日々の出
来高なので、行列変換も行ってアイテム毎の集計まで
やりたいんです。
それの一部をご教示いただいて、後はその応用で自分
なりに展開するつもりでした。
しかし、仰るようにいったん全部コピーしたあとで、
空白列を削除するしかないですか。
なんだかもう少しスマートに出来るような気がしたん
ですが、ありがとうございました。
出直します。
・ツリー全体表示

【81255】Re:コピペのコードで悩んでいます。
発言  マナ  - 20/4/10(金) 18:41 -

引用なし
パスワード
   ▼Ackkn さん:

では、いったん全部コピーしたあとで、
空白列を削除してはどうでしょうか。

もしくは、5列しかないのだから、
空白かどうか確認しながら、1列ずつコピーするとか。
・ツリー全体表示

【81254】Re:コピペのコードで悩んでいます。
質問  Ackkn  - 20/4/10(金) 11:25 -

引用なし
パスワード
   ▼Ackkn さん:
>▼マナ さん:
>>▼Ackkn さん:
>>
>>>4行はセットであり、途中に空白セルはありません。
>>
>>↑が前提ですが、
>>
>>Range("A1:E4").SpecialCells(xlCellTypeConstants).Copy
>
>マナさん
>
>早速のご返答ありがとうございます。
>明日会社で確認してご連絡いたします。

マナさん

私の説明不足ですいません。
確かに途中に空白のセルはありませんが、すべてが例示のように
数字ではありません。
中には数式で他のマスタから商品名等を探して漢字含みで表示しているセルも
あります。

これだと無理でしょうか?
ご教示よろしくお願いいたします。
・ツリー全体表示

【81253】Re:コピペのコードで悩んでいます。
回答  Ackkn  - 20/4/9(木) 23:02 -

引用なし
パスワード
   ▼マナ さん:
>▼Ackkn さん:
>
>>4行はセットであり、途中に空白セルはありません。
>
>↑が前提ですが、
>
>Range("A1:E4").SpecialCells(xlCellTypeConstants).Copy

マナさん

早速のご返答ありがとうございます。
明日会社で確認してご連絡いたします。
・ツリー全体表示

【81252】Re:コピペのコードで悩んでいます。
発言  マナ  - 20/4/9(木) 18:59 -

引用なし
パスワード
   ▼Ackkn さん:

>4行はセットであり、途中に空白セルはありません。

↑が前提ですが、

Range("A1:E4").SpecialCells(xlCellTypeConstants).Copy
・ツリー全体表示

【81251】コピペのコードで悩んでいます。
質問  Ackkn  - 20/4/9(木) 14:33 -

引用なし
パスワード
   通常Excel上で、下記のように仮にA列からE列目での4行に(4行はセット)ランダムに値が入っている場合、これを値の部分だけを選択して別の場所にペーストした場合、途中の空白は選択していないので、詰まってペーストされます。

A    B    C    D    E
    12        7      4行はセットであり、途中に空白セル
    4        6      はありません。
    6        4    
    2000        1800    


しかし、全体をRange文で選択してしまうと当然そのままペーストされてしまいます。
このランダムにある複数箇所を空白を詰めてコピペするコードをご教示下さい。
マクロ記録でやりましたが、下のようになって汎用性がありません。

  Range("B1:B4,D1:D4").Select
  Range("A7").Activate
  Selection.Copy
・ツリー全体表示

【81250】Re:複数シートのデータを検索して新しい...
発言  うじよし  - 20/4/9(木) 0:01 -

引用なし
パスワード
   まだです。
・ツリー全体表示

【81249】Re:複数シートのデータを検索して新しい...
発言  マナ  - 20/4/8(水) 21:53 -

引用なし
パスワード
   ▼うじよし さん:

解決ですか?
・ツリー全体表示

【81248】Re:ダブルクリックするとセルの色が変化...
発言  マナ  - 20/4/8(水) 21:50 -

引用なし
パスワード
   ▼noob さん:

イベントプロシージャを使います。

ht tp://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_event.html
・ツリー全体表示

【81247】ダブルクリックするとセルの色が変化する
質問  noob  - 20/4/8(水) 14:28 -

引用なし
パスワード
   マクロ超初心者です。
マクロのセルをダブルクリックすると、もともと赤色だったセルが緑色(color=255)に
もう一回、ダブルクリックすると、緑色だったセルが赤色(color=52224)にこれがループするマクロを作成したいのですが、ご教授頂けると助かります。
宜しくお願い致します。
・ツリー全体表示

【81246】Re:複数シートのデータを検索して新しい...
お礼  うじよし  - 20/4/7(火) 17:15 -

引用なし
パスワード
   レスありがとうございます。

ご指摘のやり方でできればいいですが、それぞれのシートのデータが2万件以上あり、かつ毎月シートが増えていくことを考えると、すべてのシートをまとめてフィルターオプションで検索するやり方がいいのかわかりませんでした。

またご教授いただければ幸いです。
・ツリー全体表示

【81245】Re:複数シートのデータを検索して新しい...
発言  γ  - 20/4/7(火) 15:35 -

引用なし
パスワード
   方針だけですが。
・月ごとシートは、A列に「月」を追加したうえでひとつのシートに
 まとめたらいかがですか?
・そのうえで、特定テンプレートシートに、
 フィルタオプションを使って、抽出転記してはどうですか?
・結果ごとにシートをわけるなら、上記シートをシート丸ごと複写します。

もちろん、これらをマクロ記録すればコードの骨格ができあがると思います。
・ツリー全体表示

【81244】複数シートのデータを検索して新しいシー...
質問  うじよし  - 20/4/7(火) 10:32 -

引用なし
パスワード
   いろいろ調べたのですがうまくいきません。
4月〜9月のそれぞれのシートに型番をキーとした下記のようなデータがそれぞれ2万件程度あり、そのデータを型番ごとに集計したシートが別にあります。
<4月シート>
型番 納入先 金額 生産
AA-2 東京社 300 M工場 …
AB-4 大阪社 500 T工場 …
CD-3 福岡社 200 L工場 …
FE-9 埼玉社 800 K工場 …
AB-4 大分社 100 A工場 …

<5月シート>
型番 納入先 金額 生産
AA-2 仙台社 200 B工場 …
AB-4 岩手社 400 C工場 …
CD-3 福島社 700 F工場 …
AI-7 香川社 500 L工場 …
AB-4 千葉社 300 F工場 …

<集計シート>
AA-2 東京社 500 M工場 …
AB-4 大阪社 900 T工場 …


ここで、集計シートのAA-2を選択すると、別シートが作成され、それぞれのシートから検索されたデータを並び替えて下記のように一覧表示したいと思います。

4月 AA-2 東京社 300 M工場 …
5月 AA-2 仙台社 200 B工場 …

すなわち集計シートの型番を選択すると、その内訳を各シートから抽出し、シート名をつけて一覧表示したいと考えています。
説明が長くなりすみません。よろしくお願いします。
・ツリー全体表示

【81243】Re:配列を戻り値とする関数
回答  akiholic  - 20/3/31(火) 23:24 -

引用なし
パスワード
   ▼Jaka さん:
>▼akiholic さん:
>>引数で渡した配列は、破壊したくないので、一度はコピーが必要と考えています。
>>文法上の記法を私が知らないだけで、TestFunc2と同等の内容が表現できればと思ったのですが。。。
>>
>>vbaでTestFunc2を表現できないのであれば、戻り値を参照渡しとして対応することを考えたいと思っています。
>
>破壊したくないの意味が良く解ってないけど、
>ByValにすれば・・・?。
>
>Sub Test()
>  Dim a As Variant, b As Variant
>  a = Array(1)
>'  b = TestFunc1(a)
>'  Debug.Print b(0)
>
>  b = TestFunc2(a)
>  Debug.Print b(0)
>  Debug.Print a(0)
> End Sub
>
>Function TestFunc2(ByVal a As Variant) As Variant
>  a(0) = 10
>  TestFunc2 = a
> End Function

ByValで渡すと、その時点でコピーが生成されてしまうので、効率は悪いように思われます。
以下のコードで実験してみましたが、参照渡しの引数として結果を受け取るのが、効率としては良さそうですね。。。
気軽に動的配列を扱っていたのですが、代入させたり関数処理させた際に、やたらと処理が重くなることに気づいて、TestFunc3を考えたのですが、意図通りには動かなかったので、質問させて頂きました。

===
#If VBA7 Then
Declare PtrSafe Function timeGetTime Lib "winmm.dll" () As Long
#Else
Declare Function timeGetTime Lib "winmm.dll" () As Long
#End If

Sub Test()
  Dim a As Variant, b As Variant, c As Variant, d As Variant, e As Variant, f As Variant, i As Long, dmy As Variant, j As Long, T0 As Long
  ReDim a(100000) As Double
  For i = 0 To 100000
   a(i) = Rnd()
  Next i
 
  T0 = timeGetTime()
  For i = 0 To 1000
   b = TestFunc1(a)
  Next
  Debug.Print timeGetTime() - T0
 
  T0 = timeGetTime()
  For i = 0 To 1000
   c = TestFunc2(a)
  Next
  Debug.Print timeGetTime() - T0
 
  'T0 = timeGetTime()
  'For i = 0 To 1000
  '  d = TestFunc3(a)
  'Next
  'Debug.Print timeGetTime() - T0
 
  T0 = timeGetTime()
  For i = 0 To 1000
   Call TestFunc4(a, e)
  Next
  Debug.Print timeGetTime() - T0
 
  T0 = timeGetTime()
  For i = 0 To 1000
   f = a
   f(0) = 50
  Next
  Debug.Print timeGetTime() - T0
 
  Debug.Print a(0), b(0), c(0), e(0), f(0)
End Sub

Function TestFunc1(x As Variant) As Variant
  Dim y As Variant
  y = x
  y(0) = 10
  TestFunc1 = y
End Function

Function TestFunc2(ByVal x As Variant) As Variant
  x(0) = 20
  TestFunc2 = x
End Function

'Function TestFunc3(x As Variant) As Variant
'  TestFunc3 = x
'  TestFunc3(0) = 30 * Rnd()
'End Function

Function TestFunc4(x As Variant, y As Variant) As Variant
  y = x
  y(0) = 40
End Function

<<実行結果>>
TestFunc1: 112
TestFunc2: 97
TestFunc4: 47
ベタ: 47
・ツリー全体表示

【81242】Re:配列を戻り値とする関数
発言  Jaka  - 20/3/31(火) 3:04 -

引用なし
パスワード
   ▼akiholic さん:
>引数で渡した配列は、破壊したくないので、一度はコピーが必要と考えています。
>文法上の記法を私が知らないだけで、TestFunc2と同等の内容が表現できればと思ったのですが。。。
>
>vbaでTestFunc2を表現できないのであれば、戻り値を参照渡しとして対応することを考えたいと思っています。

破壊したくないの意味が良く解ってないけど、
ByValにすれば・・・?。

Sub Test()
  Dim a As Variant, b As Variant
  a = Array(1)
'  b = TestFunc1(a)
'  Debug.Print b(0)

  b = TestFunc2(a)
  Debug.Print b(0)
  Debug.Print a(0)
End Sub

Function TestFunc2(ByVal a As Variant) As Variant
  a(0) = 10
  TestFunc2 = a
End Function
・ツリー全体表示

【81241】Re:配列を戻り値とする関数
お礼  akiholic  - 20/3/29(日) 13:25 -

引用なし
パスワード
   レスありがとうございます。

引数で渡した配列は、破壊したくないので、一度はコピーが必要と考えています。
文法上の記法を私が知らないだけで、TestFunc2と同等の内容が表現できればと思ったのですが。。。

vbaでTestFunc2を表現できないのであれば、戻り値を参照渡しとして対応することを考えたいと思っています。
・ツリー全体表示

【81240】Re:配列を戻り値とする関数
お礼  akiholic  - 20/3/29(日) 13:11 -

引用なし
パスワード
   レスありがとうございます。

サンプル程度の内容であれば、retのコピー負荷は気になりませんが、配列のサイズが大きくなり、実行回数が増えて来るとret確保分の処理負荷が無視できなくなってきたので、質問させて頂きました。
文法の記法でTestFunc2のような書き方ができればと思ったのですが、やはり参照渡しでやることにしようと思います。
・ツリー全体表示

【81239】Re:配列を戻り値とする関数
発言  Jaka  - 20/3/27(金) 20:54 -

引用なし
パスワード
   こうすれば良いんじゃないの?

Function TestFunc2(a As Variant) As Variant
  a(0) = 10
  TestFunc2 = a
End Function
・ツリー全体表示

【81238】Re:配列を戻り値とする関数
発言  γ  - 20/3/26(木) 16:53 -

引用なし
パスワード
   最初の方式も、プロシージャを抜けると
ローカル変数retは解放されるので負担にはならないのでは?
どうしてもというなら、
aを参照渡しを使って修正すればいいのでは?
・ツリー全体表示

【81237】配列を戻り値とする関数
質問  akiholic  - 20/3/25(水) 23:05 -

引用なし
パスワード
   配列を戻り値とする関数として、以下のようなコードを考えています。
TestFunc1のように、戻り値用の変数(ret)を使って記載すれば問題ないですが、
TestFunc2のように、直接戻り値(TestFunc2)を使って記載するとエラーになります。
どうもTestFunc2(0)が、関数呼び出しとして解釈されているようですが、
この問題を回避する方法をご存じの方がいらっしゃればご教示いただきたく。
なお、大規模な配列を想定しており、戻り値用のテンポラリ変数を使用してしまうと、
要素がコピーされることを回避したいと考えたことが発端です。

Sub Test()
  Dim a As Variant, b As Variant
  a = Array(1)
  b = TestFunc1(a)
  Debug.Print b(0)

  b = TestFunc2(a)
  Debug.Print b(0)
End Sub

Function TestFunc1(a As Variant) As Variant
  Dim ret As Variant
  ret = a
  ret(0) = 10
  TestFunc1 = ret
End Function

Function TestFunc2(a As Variant) As Variant
  TestFunc2 = a
  TestFunc2(0) = 10
End Function
・ツリー全体表示

61 / 3841 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free