Excel VBA質問箱 IV

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

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


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

【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イベントは発生しません。
どんな式が入力されているのですか。
・ツリー全体表示

【79768】Re:縦に長いデータにしたい
発言  マナ  - 18/4/6(金) 19:33 -

引用なし
パスワード
   ▼はやしはる さん:

データ範囲を変数に取り込んで、そこから1列ずつ、とりだして
順番に転記していくと考えれば、こんな感じになります。

作業通りにコードを記述すれば出来上がるので簡単です。


Option Explicit

Sub test()
  Dim tbl As Range
  Dim n As Long
  Dim k As Long
  Dim dst As Range
  
  Set tbl = Range("a1").CurrentRegion
  Set tbl = Intersect(tbl, tbl.Offset(1))
  n = tbl.Rows.Count
  
  Worksheets.Add
  
  Range("a1:c1").Value = Array("出席番号", "科目", "得点")
  
  For k = 2 To 5
    Set dst = Range("a" & Rows.Count).End(xlUp).Offset(1).Resize(n)
    dst.Value = tbl.Columns(1).Value
    dst.Offset(, 1).Value = tbl.Columns(k).Cells(0).Value
    dst.Offset(, 2).Value = tbl.Columns(k).Value
  Next

End Sub
・ツリー全体表示

【79767】Re:セル値によってオートシェイプの表示...
質問  Kazu  - 18/4/6(金) 13:45 -

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

御助言ありがとうございます。 そして言葉足らずで申し訳ありません。

当方、普段は関数でのみエクセルを活用してましてVBAはまったくの素人です。

今回のもネットで調べて組み合わせて作成しております。


亀マスター さん

>Target.Addressの値が狙ったものになっているか

C14に、True・False を表示させるようにしてます。(但し関数にて)

>"四角1"というオートシェイプはちゃんと存在しているか

オートシェイプの名前を変更して"四角1"としてます。

>発生した箇所とエラーメッセージ

記載させていただいたVBAを走らせますと、End Subを記載しているが
End Subが必要です。 と表示されます。

なので、意味が良くわからずこちらに投稿させていただきました。


マナ さん

すみません。 "四角1"です。 点はありません。
訂正してもう一度試してみましたが、結果は同じでした。

>C14が、数式が入ったセル、ということはありませんか

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


Y さん

>Private Sub Worksheet_Change(ByVal Target As Range)
というのはどうしてですか?

ネットで調べまして、これを使えば思い通りのことができるかな?と
思って使用しており、他意はありません。

特定のセルに、True か Falseのどちらかを表示させて、表示・非表示を
制御したいと考えております。


皆様へ
当方があまりVBAと言うものを理解できておりませんので、言葉足らず
説明不足があると思いますが、よろしくお願いします。
・ツリー全体表示

【79766】縦に長いデータにしたい
質問  はやしはる  - 18/4/5(木) 23:16 -

引用なし
パスワード
   このようなデータがあります。

出席番号 国語 社会 算数 理科
1 62 27 48 73
2 90 94 86 95
3 75 64 48 45
4 68 55 75 66
5 85 82 92 90
6 77 45 50 70
7 65 36 26 48

下に示すように縦に長いデータに変換する方法をVBAでチャレンジしているのですが、効率よく書けません。
出席番号と各科目のデータを5シートに作って縦に結合するということをしています。

みなさんならばどのようにされますでしょうか?


出席番号 科目 得点
1 国語 62
2 国語 90
3 国語 75
4 国語 68
5 国語 85
6 国語 77
7 国語 65
1 社会 27
2 社会 94
3 社会 64
4 社会 55
5 社会 82
6 社会 45
7 社会 36
1 算数 48
2 算数 86
3 算数 48
4 算数 75
5 算数 92
6 算数 50
7 算数 26
1 理科 73
2 理科 95
3 理科 45
4 理科 66
5 理科 90
6 理科 70
7 理科 48

よろしくお願いします。
・ツリー全体表示

【79765】Re:セル値によってオートシェイプの表示...
発言  γ  - 18/4/5(木) 20:46 -

引用なし
パスワード
   Sub 入力()
Private Sub Worksheet_Change(ByVal Target As Range)
というのはどうしてですか?
・ツリー全体表示

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

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

>オートシェイプの名前は、四角1.です。

"."が最後につくので間違いないですか

>C14に【True・False】のどちらかを表示させて

C14が、数式が入ったセル、ということはありませんか
・ツリー全体表示

【79763】Re:セル値によってオートシェイプの表示...
発言  亀マスター  - 18/4/5(木) 18:41 -

引用なし
パスワード
   うまくいかないないとは、具体的にどのような状態でしょうか。
エラーが発生するのか?動作は完了するが思っていたのと違う結果なのか?

エラーが発生するのであれば、発生した箇所とエラーメッセージを、
思っていたのと違う結果なら、期待する結果と実際の結果を示した方が
回答がしやすいですよ。

とりあえず、いくつか切り分けて解明していきましょう。

Target.Addressの値が狙ったものになっているか
Range("C14").Valueの値が狙ったものになっているか
"四角1"というオートシェイプはちゃんと存在しているか
動かそうとしているオートシェイプは本当に"四角1"という名前か
直接"四角1"のVisibleプロパティを操作するとどうなるか

このあたりを確認してみてはどうでしょうか。
・ツリー全体表示

【79762】セル値によってオートシェイプの表示非表...
質問  Kazu  - 18/4/5(木) 16:47 -

引用なし
パスワード
   初めまして。
題名の件で、以下のVBAを作成してみました。
が、上手く動作しません。
どこが間違ってるのか、教えていただけますと幸いです。

セル番号 C14に【True・False】のどちらかを表示させて
Trueなら表示、Falseなら非表示としたいです。

オートシェイプの名前は、四角1.です。

Sub 入力()

Private Sub Worksheet_Change(ByVal Target As Range)

  If Target.Address = "$C$14" Then
    
    Select Case Range("C14").Value
      
      Case "True"
        ActiveSheet.Shapes("四角1.").Visible = True
      
      Case "False"
        ActiveSheet.Shapes("四角1.").Visible = False
    
    End Select
  
  End If
  
End Sub

よろしくお願いします。
・ツリー全体表示

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