Excel VBA質問箱 IV

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

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


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

【79788】縦並びのデータを横並びにしたい
質問  muco  - 18/4/13(金) 11:12 -

引用なし
パスワード
   質問です:以下のような縦並びのデータを、横並びで表示をしたいです。
またデータを横並びにする際に、重複する項目は数値を加算して表示したいです。

【元データ】
項目(A列) 数値(B列)
  A     100
 B     200
 C     300
 D     400
 A     500
 C     600
 E     700

  ↓

【計算結果】
(D1セル) (E1セル) (F1セル) (G1セル) (H1セル) (I1セル) (J1セル) (K1セル) (L1セル) (M1セル)
  A    600    B     200    C     900    D     400    E     700

同じ項目があれば数値を足す場合、どのようなマクロを組めば良いのでしょうか?
説明が下手で申し訳ございませんが、どなたかご教授お願い致します。
・ツリー全体表示

【79787】Re:VBA初心者です。ブック間の列コピーを...
発言  atori  - 18/4/13(金) 11:04 -

引用なし
パスワード
   ▼マナ さん:
>▼atori さん:
>
>>wb.Close
>↓
>wb.Close False
>
>としたほうがよいです。
>・保存しないことがわかりやすい
>・保存するかそうかの確認メッセージが出ない
>からです。

確かにメッセージが出ないのは大きいですね…。
「クリップボードに大きな情報があります」のメッセージも出てしまうので、それに関するものも入れてみました。

本当に分かりやすいご説明ありがとうございます!
教えていただいた方法で作ってみたところ、以下のマクロで1~4.xlsxまでは動作しました…!

Sub Exam1()
'
' exam1 Macro
'
  Dim wb As Workbook
  Dim ws As Worksheet
  Dim wsx As Worksheet

  For k = 1 To 4

    Set wb = Workbooks.Open("C:\Users\user\Desktop\Exam\" & k & ".xlsx")
    Set wsx = ThisWorkbook.Worksheets("Sheet1")
    wb.Worksheets("Sheet1").Columns(2).Copy
    wsx.Columns(k + 1).PasteSpecial Paste:=xlValues
    wb.Application.CutCopyMode = False
    wb.Close False

  Next k

End Sub

CutCopyModeの前のApplicationや、後ろの=に関しては一回消してみたのですが、エラーメッセージが出てしまいました。

ここから、kをある程度大きな数字にしてエラーメッセージが出たら終了(つまりフォルダに存在するブックの数に達すれば終わり)という形でも良いのですが、自動的にフォルダ内のブック数を判別する方法もあるんですかね…?
・ツリー全体表示

【79786】Re:VBA初心者です。ブック間の列コピーを...
発言  マナ  - 18/4/12(木) 20:10 -

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

>wb.Close

wb.Close False

としたほうがよいです。
・保存しないことがわかりやすい
・保存するかそうかの確認メッセージが出ない
からです。

----

そうすると

Set wb = Workbooks.Open("C:\Users\user\Desktop\Sample\1.xlsx")
Set ws = wb.Worksheets("Sheet1")
ws.Columns(2).Copy
wsx.Columns(2).PasteSpecial Paste:=xlValues
wb.Close False

この5行が1つのブックについての処理になります。
よくみると、変数wsは1回しか使っていない。
ならば。変数は使わなくてもよいかもしれません。

Set wb = Workbooks.Open("C:\Users\user\Desktop\Sample\1.xlsx")
wb.Worksheets("Sheet1").Columns(2).Copy
wsx.Columns(2).PasteSpecial Paste:=xlValues
wb.Close False

こんな感じです。
これを4回繰り返せばよいことがわかりますよね。
繰り返しの中で、変化させる部分は2箇所

1.xlsx、wsx.Columns(2)

2.xlsx、wsx.Columns(3)

3.xlsx、wsx.Columns(4)

4.xlsx、wsx.Columns(5)

規則性はわかると思います。
これを

For k=1 to 4
 処理
Next

のように繰り返し構文で記述してみてください。
で、動作確認してみてください。
これをベースに完成形に近づけていくことになると思います。
・ツリー全体表示

【79785】指定した数を別シートの内容を参照して最...
質問  煮詰まった  - 18/4/12(木) 14:59 -

引用なし
パスワード
   以下の例)のようなことをエクセルのVBAを活用して
実現したいのですがこのようなことが可能かどうか教えてください


指定した数を別シートの内容を参照して最適なパターンを求めたい。

例)
エクセルのシートに1.〜9.迄セルに値が入っている
として、500個を選び出したい場合の選び方

1.100
2.200
3.300
4.400
5.500
6.600
7.700
8.800
9.900

求める答え

最適:5.500
推奨:4.400+1.100
推奨:2.200+3.300

を別のシートに答えとして出したい。

尚、選びたい数は毎回変わり(画面から指定)、シートの数が入っている行も何行あるのか判らない


方法を思いつかないので上から順番に全パターンを検索しようと考えていますが、
・ツリー全体表示

【79784】Re:OnKeyで1回だけマクロ実行したい
お礼  まいろねふ  - 18/4/12(木) 11:42 -

引用なし
パスワード
   hatena様

ご指摘の通り、DoEventsを挟んだところ、目的の処理が実現できました。
ありがとうございました。
・ツリー全体表示

【79783】Re:VBA初心者です。ブック間の列コピーを...
回答  atori  - 18/4/12(木) 10:09 -

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

親切なご指導、ありがとうございます…!
分かりやすくてとても助かります(゜-゜)

>1)Application.は省略できます。というか普通は省略します。
>他のapplication例えばWordのマクロでExcelを開くとかだと必須ですが
>ほとんどの場合、不要です。

省略できるのですね…。自分でも改めて調べてみたら、殆ど本来はApplication.が付いているものなんですね。

>2)保存する必要がありますか?
>保存しないで閉じるだけでよいのではありませんか。

確かに保存はしなくても大丈夫です…!

>3)変数wsは、毎回SETしなおす必要があります。
>このままだと、wsは、最初のブックのSheet1のままで、
>すでにブックは閉じた後なので、エラーになると思います。

変数の値の参照元が変わっても、自動で変更されるわけではないのですね!

>4)B列は、2列めなので、Columns(2)、
>C列は、3列めなので、Columns(3)と記述できます。
>繰り返し処理したいときには、このほうがよいです。
>k回目の貼付け先は、Columns(k+1)と記述できるからです。

おお、たしかに数字であれば+1が使えますね…

>以上を踏まえて、修正していただけますか。

Sub exam1()

  Dim wb As Workbook
  Dim ws As Worksheet
  Dim wsx As Worksheet
  
  Set wb = Workbooks.Open("C:\Users\user\Desktop\Sample\1.xlsx")
  Set ws = wb.Worksheets("Sheet1")
  Set wsx = ThisWorkbook.Worksheets("Sheet1")

  ws.Columns(2).Copy
  wsx.Columns(2).PasteSpecial Paste:=xlValues

  wb.Close
  Set wb = Workbooks.Open("C:\Users\user\Desktop\Sample\2.xlsx")
  Set ws = wb.Worksheets("Sheet1")

  ws.Columns(2).Copy
  wsx.Columns(3).PasteSpecial Paste:=xlValues

  wb.Close
  Set wb = Workbooks.Open("C:\Users\user\Desktop\Sample\3.xlsx")
  Set ws = wb.Worksheets("Sheet1")

  ws.Columns(2).Copy
  wsx.Columns(4).PasteSpecial Paste:=xlValues

  wb.Close
  Set wb = Workbooks.Open("C:\Users\user\Desktop\Sample\4.xlsx")
  Set ws = wb.Worksheets("Sheet1")

  ws.Columns(2).Copy
  wsx.Columns(5).PasteSpecial Paste:=xlValues

  wb.Close

End Sub

よろしくおねがいします!
・ツリー全体表示

【79782】Re:OnKeyで1回だけマクロ実行したい
回答  hatena  - 18/4/11(水) 22:43 -

引用なし
パスワード
   下記のようにすればどうでしょうか。
当方の実験では、マクロ実行中に、Shift + Ctrl + Aを連打しても、一回しか実行されませんでした。

Public Sub Sample()
  Application.OnKey "+^A", "" 'Shift + Ctrl + A キーを無効

  '時間のかかる処理
  Debug.Print "開始:" & Now
  Application.wait Now + TimeValue("0:00:10")
  Debug.Print "終了:" & Now

  DoEvents 'OSに制御を渡す→キー入力が送信された後、制御が返る
  Application.OnKey "+^A", "Sample" ''Shift + Ctrl + A キーにSampleマクロを割り当て
End Sub
・ツリー全体表示

【79781】Re:VBA初心者です。ブック間の列コピーを...
発言  マナ  - 18/4/11(水) 22:11 -

引用なし
パスワード
   ▼atori さん:
 
>  Set wb = Application.Workbooks.Open("C:\Users\user\Desktop\Sample\1.xlsx")

1)Application.は省略できます。というか普通は省略します。
他のapplication例えばWordのマクロでExcelを開くとかだと必須ですが
ほとんどの場合、不要です。

>  Set ws = wb.Worksheets("Sheet1")
>  Set wsx = ThisWorkbook.Worksheets("Sheet1")
>
>  ws.Range("B:B").Copy
>  wsx.Range("B:B").PasteSpecial Paste:=xlValues
>
>  wb.Save
>  wb.Close

2)保存する必要がありますか?
保存しないで閉じるだけでよいのではありませんか。

>  Set wb = Application.Workbooks.Open("C:\Users\user\Desktop\Sample\2.xlsx")
>
>  ws.Range("B:B").Copy

3)変数wsは、毎回SETしなおす必要があります。
このままだと、wsは、最初のブックのSheet1のままで、
すでにブックは閉じた後なので、エラーになると思います。


>  wsx.Range("C:C").PasteSpecial Paste:=xlValues

4)B列は、2列めなので、Columns(2)、
C列は、3列めなので、Columns(3)と記述できます。
繰り返し処理したいときには、このほうがよいです。
k回目の貼付け先は、Columns(k+1)と記述できるからです。


以上を踏まえて、修正していただけますか。
・ツリー全体表示

【79780】Re:OnKeyで1回だけマクロ実行したい
発言  マナ  - 18/4/11(水) 21:53 -

引用なし
パスワード
   ▼まいろねふ さん:

>マクロ終了時に再度有効にするように
>しましたが、駄目でした。

Application.OnTimeを試してはどうでしょうか
・ツリー全体表示

【79779】OnKeyで1回だけマクロ実行したい
質問  まいろねふ  - 18/4/11(水) 14:35 -

引用なし
パスワード
   お世話になります。

Application.OnKeyメソッドを使ってマクロをキー入力に割り当て、
キーが押されたらマクロが実行されるようにしています。

マクロ内でApplication.Wait等を使い、処理に一定の時間がかかるように
しているのですが、マクロ動作中にキーが押された場合、押された回数分だけ
後からマクロを実行してしまいます。

マクロ実行中は次のキー入力をブロックし、終わってから受け付けるように
したいのですが、どうすれば良いでしょうか。
(マクロ開始時にOnKeyメソッドを無効にし、マクロ終了時に再度有効にするように
しましたが、駄目でした。)
・ツリー全体表示

【79778】Re:VBA初心者です。ブック間の列コピーを...
回答  atori  - 18/4/11(水) 14:10 -

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

ご返信ありがとうございます!
ファイルパスは仮のものですが、1.xlsx ~ 4.xlsxで考えた分では以下のようになりました。

Sub exam1()

  Dim wb As Workbook
  Dim ws As Worksheet
  Dim wsx As Worksheet
  
  Set wb = Application.Workbooks.Open("C:\Users\user\Desktop\Sample\1.xlsx")
  Set ws = wb.Worksheets("Sheet1")
  Set wsx = ThisWorkbook.Worksheets("Sheet1")

  ws.Range("B:B").Copy
  wsx.Range("B:B").PasteSpecial Paste:=xlValues

  wb.Save
  wb.Close
  Set wb = Application.Workbooks.Open("C:\Users\user\Desktop\Sample\2.xlsx")

  ws.Range("B:B").Copy
  wsx.Range("C:C").PasteSpecial Paste:=xlValues

  wb.Save
  wb.Close
  Set wb = Application.Workbooks.Open("C:\Users\user\Desktop\Sample\3.xlsx")

  ws.Range("B:B").Copy
  wsx.Range("D:D").PasteSpecial Paste:=xlValues

  wb.Save
  wb.Close
  Set wb = Application.Workbooks.Open("C:\Users\user\Desktop\Sample\4.xlsx")

  ws.Range("B:B").Copy
  wsx.Range("E:E").PasteSpecial Paste:=xlValues

  wb.Save
  wb.Close

End Sub

いかがでしょうか…?
・ツリー全体表示

【79777】Re:VBA初心者です。ブック間の列コピーを...
発言  マナ  - 18/4/10(火) 22:53 -

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

まずは、繰り返し構文を使わないで、
1.xlsx,2.xlsx,3.xlsx,4.xlsxの4つについて
コピーするマクロを考えてみてください。
・ツリー全体表示

【79776】ウェブカメラの映像をRGB値で取得
質問  りんご  - 18/4/10(火) 17:47 -

引用なし
パスワード
   Excel VBAの初心者です。

ウェブカメラの映像をある時間単位で画像としてエクセルに取得し,指定された画像範囲のRGB値を取得することはできますでしょうか?
・ツリー全体表示

【79775】VBA初心者です。ブック間の列コピーを繰...
質問  atori  - 18/4/10(火) 15:08 -

引用なし
パスワード
   VBAを用いてブック間での列のコピーを繰り返しで行おうと思っているのですが、繰り返しのステートメントと別ブックからのコピーを繰り返すステートメントを複合させようとしたものの方法がわかりませんでした。

【コピー先】
固定ブック
【コピー元】
同フォルダ内で1.xlsx,2.xlsx,3.xlsx,4.xlsx,....と続く整数のブック

【行いたいこと】
・コピー元ブックのB列(固定)を、コピー先ブックのA列にペースト
・次の番号のコピー元ブックのB列を、コピー先ブックのB列にペースト
・次の番号のコピー元ブックのB列を、コピー先ブックのC列にペースト

・ 以下繰り返し


この場合、どのようなマクロを用いればいいのでしょうか。
ご助力よろしくおねがいします。m(_ _)m
・ツリー全体表示

【79774】Re:セル値によってオートシェイプの表示...
お礼  Kazu  - 18/4/9(月) 13:36 -

引用なし
パスワード
   Y さん マナ さん

返答ありがとうございます。

Yさんのおっしゃる通り自分の知識不足を痛感しております。

何年か前に、少し勉強した程度で『できるだろう』と無茶をしました。

今回の御返答の意味を理解できるように、もう一度勉強して

出直ししたいと思います。


こんな素人に返答いただきありがとうございました。


PS・・・Yさん 詳しい回答をありがとうございます。

参考にしながら理解を深めたいと思います。
・ツリー全体表示

【79773】Re:同シートの行データを列の項目に振り...
お礼  ニッシー  - 18/4/8(日) 17:46 -

引用なし
パスワード
   ありがとうございます。
別の所で再度確認してみます。
・ツリー全体表示

【79772】Re:セル値によってオートシェイプの表示...
回答  γ  - 18/4/8(日) 5:55 -

引用なし
パスワード
   > > Sub 入力()
> > Private Sub Worksheet_Change(ByVal Target As Range)
> > というのはどうしてですか?
>
> ネットで調べまして、これを使えば思い通りのことができるかな?と
> 思って使用しており、他意はありません。

質問の意味が通じていませんね。

Private Sub Worksheet_Change(ByVal Target As Range)
というのは、イベントプロシージャーというものです。
これの意味は理解していますか?

セル(たち)の変更を実行したときに、自動で実行されるプロシージャです。
イベントプロシージャはシートモジュールに書く必要がありますが、
そうしていますか?

つまり、
Sub 入力()
というプロシージャの中で使うようなものではないのです。
たぶん、
Private Sub Worksheet_Change(ByVal Target As Range)
がプロシージャの宣言ということが理解されていないのでしょう。

警告の意味は、
Sub 入力()がプロシージャの開始なので、
その終了を示す End Subが不足している、
というものです。理解していますか?

そもそも
Sub 入力()
などというものは不要です。

といった、かなり基本的な事の理解が不足していますから、
これをきっかけにして、テキストで勉強することを薦めます。
簡単にコピペして動かせるようなものではありません。
ちゃんと理屈を抑えることも必要です。
そのほうが却って近道です。
これを良いチャンスに変えることを薦めます。

----------------
以上を理解されたことを前提にコメントするなら、
他の回答者さんが確認質問されているように、
C14の変化そのものをキャッチすることは(通常の手段では)できませんから、
C14で使っているセルが変更されたときに動作するプロシージャにします。

それで、
>どんな式が入力されているのですか。
と確認されているのです。それに基づいて助言されようとしています。

その時に、C14の値に基づいて、表示・非表示を判定して、
Shapeに変更を加えるわけです。

例えば、こんな風にです。
Private Sub Worksheet_Change(ByVal Target As Range)
  '変更されたセルが、C14で使っているセルでなければ抜ける
  If Intersect(Target, Range("C14").Precedents) Is Nothing Then Exit Sub

  Select Case Range("C14").Value
    Case True
      Me.Shapes("Rectangle 1").Visible = True
    Case False
      Me.Shapes("Rectangle 1").Visible = False
  End Select
End Sub

留意点は以下。
(1)このコードを対象のシートのシートモジュールに書き込みます。
  そうしたうえで、C14で使用しているセルの値を変更してみてください。
(2)もっとも、関係がないセルの値がかわっても常に処理を実行させていいなら
  話は別です。一行目の判定は不要になります。 
(3)なお、C14で使用しているセルが別シートであれば、それを変更しても
  イベントプロシージャは起動しません。
 
 
・ツリー全体表示

【79771】Re:同シートの行データを列の項目に振り...
発言  マナ  - 18/4/7(土) 18:45 -

引用なし
パスワード
   ▼ニッシー さん:

countifs関数が使えそうです。
ネット検索してみてください。

なお、ここは「VBA」に関する質問掲示板です。

関数や一般操作に関する質問は
他でしたほうが適切な回答が得られるはずです。
・ツリー全体表示

【79770】同シートの行データを列の項目に振り分け...
質問  ニッシー E-MAIL  - 18/4/7(土) 15:51 -

引用なし
パスワード
   文章にすると複雑なので下記のようなイメージです。

左の月のデータを右側のような月ごとに振り分ける方法などはエクセルで可能なのでしょうか?
もし、可能であればどのようにやればいいかご教授いただけますでしょうか?

        2018年3月 2018年4月 2018年5月
2018年3月 A    A     A   
2018年4月 A    B     B     B
2018年3月 B    C           C
2018年4月 B
2018年5月 B
2018年3月 C
2018年5月 C
・ツリー全体表示

【79769】Re:セル値によってオートシェイプの表示...
発言  マナ  - 18/4/6(金) 19:41 -

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

>関数にて判断させて、True か False を表示させるようにしてます。


関数の計算結果が変わっても、Changeイベントは発生しません。
どんな式が入力されているのですか。
・ツリー全体表示

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