Excel VBA質問箱 IV

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

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


3093 / 13644 ツリー ←次へ | 前へ→

【64290】コードを教えて下さい。 heru 10/1/30(土) 13:02 質問[未読]
【64294】Re:コードを教えて下さい。 かみちゃん 10/1/30(土) 13:52 発言[未読]
【64309】Re:コードを教えて下さい。 UO3 10/1/30(土) 16:53 回答[未読]
【64311】【訂正】:コードを教えて下さい。 UO3 10/1/30(土) 16:56 発言[未読]
【64314】Re:【訂正】:コードを教えて下さい。 heru 10/1/30(土) 17:05 質問[未読]
【64318】Re:コードを教えて下さい。 かみちゃん 10/1/30(土) 17:22 発言[未読]
【64322】Re:ボタンが配置されている列に応じてマク... かみちゃん 10/1/30(土) 17:42 発言[未読]
【64325】Re:【訂正】:コードを教えて下さい。 UO3 10/1/30(土) 17:58 回答[未読]
【64327】Re:【訂正】:コードを教えて下さい。 heru 10/1/30(土) 18:17 お礼[未読]

【64290】コードを教えて下さい。
質問  heru  - 10/1/30(土) 13:02 -

引用なし
パスワード
   マクロ登録のボタンがズラーっと横に並んでいて、そのボタンを押すと
列二つ上のセルの数字を取得するのような記述を教えて下さい。
(A3の位置のボタンを押したのなら、A1内の数字を、D3のボタンはD1の・・・)

具体的には 日付ごとに31個のマクロボタンが並びボタンを押した列に
データを貼り付けたいのですが。
31個分の命令文をつくるのではなく1つにまとめたいのです、お願いします。
できれば、1日→1と数字のみ取り出したいです。。



【64294】Re:コードを教えて下さい。
発言  かみちゃん E-MAIL  - 10/1/30(土) 13:52 -

引用なし
パスワード
   こんにちは。かみちゃん です。

> マクロ登録のボタンがズラーっと横に並んでいて、そのボタンを押すと
>列二つ上のセルの数字を取得するのような記述を教えて下さい。
>(A3の位置のボタンを押したのなら、A1内の数字を、D3のボタンはD1の・・・)

ボタンをどのように作成したのかによりますが、
MsgBox ActiveSheet.Buttons(Application.Caller).TopLeftCell..Offset(-2).Value
で取得できると思います。

> 1日→1と数字のみ取り出したいです

全角で入力してあるのでしょうか?
それであれば、半角に変換してから、Val関数で取り出せばいいと思います。
数字部分が半角で入力してあるならば、Val関数だけで取得できます。
Sub Test()
 Dim ss As String
 
 ss = "1日"
 MsgBox Val(StrConv(ss, vbNarrow))
 ss = "30日"
 MsgBox Val(ss)
End Sub

【64309】Re:コードを教えて下さい。
回答  UO3  - 10/1/30(土) 16:53 -

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

こんにちは

かみちゃんさんはら2つのテーマについてはアドバイスがありましたね。
さて、もうひとつの

>31個分の命令文をつくるのではなく1つにまとめたいのです、お願いします。

ユーザフォームのコマンドボタンであればイベントをクラスで受けて1つの
プロシジャで処理することはできますが、シート上のボタン等OLEObjectの
イベントの捕捉はサポートされていなかったように思います。
初心者ですので、もしかしたら勘違いで、ちゃんとできるのかもかもしれませんが・・

で、できないとすれば、しょうがないのでずらっとクリックイベントをかくしか
ないのかな? ただし、それぞれの31このルーティンでは共通のプロシジャに
飛ばすことで、処理コード自体は1つにするということはできますよね。

Option Explicit

Private Sub CommandButton1_Click()
 実際の処理 1
End Sub

Private Sub CommandButton1_Click()
 実際の処理 2
End Sub

Private Sub 実際の処理(index)

 '処理

End Sub

【64311】【訂正】:コードを教えて下さい。
発言  UO3  - 10/1/30(土) 16:56 -

引用なし
パスワード
   Private Sub CommandButton1_Click()
 実際の処理 2
End Sub

これは間違いで

Private Sub CommandButton2_Click()
 実際の処理 2
End Sub

です。

【64314】Re:【訂正】:コードを教えて下さい。
質問  heru  - 10/1/30(土) 17:05 -

引用なし
パスワード
   UO3 さん、かみちゃん さんありがとうございます。ですが分かりません。。
使用しているコードを記述しますのでお願い致します。

Sub 1日()
  Application.ScreenUpdating = False
  Range("B1:B10").Select
  Selection.Copy
  Range("D5").Select
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
  Application.CutCopyMode = False
  Range("d2").Select
End Sub
Sub 2日()
  Application.ScreenUpdating = False
  Range("B1:B10").Select
  Selection.Copy
  Range("G5").Select
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
  Application.CutCopyMode = False
  Range("G2").Select
End Sub
Sub 3日()
  Application.ScreenUpdating = False
  Range("B1:B10").Select
  Selection.Copy
  Range("J5").Select
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
  Application.CutCopyMode = False
  Range("J2").Select
End Sub
以下31日までとなっています。変わる部分はおなじですし、規則性があるため
短くまとめたいと考えています。 n = 3 * m + 1

【64318】Re:コードを教えて下さい。
発言  かみちゃん E-MAIL  - 10/1/30(土) 17:22 -

引用なし
パスワード
   こんにちは。かみちゃん です。

> ですが分かりません。

【64294】で提示したコードは、試していただいても、わからないのですか?
それがわからないと、解決には進まないと思いますけど?

使用しているコードに反映されていないようですが?

コードをまとめるのは、簡単ですが、規則性が必要になります。
私が提示したのは、その規則性を取得するための根幹になる部分です。

【64322】Re:ボタンが配置されている列に応じてマ...
発言  かみちゃん E-MAIL  - 10/1/30(土) 17:42 -

引用なし
パスワード
   こんにちは。かみちゃん です。

> ですが分かりません。。
> 使用しているコードを記述しますのでお願い致します。

まず
Sub 1日()
というようなプロシージャ名は、本当にそのようなものを使っていますか?
であれば、間違っています。
プロシージャ名は、変数の名前付け規則に従うこととなっていて、先頭を数字で始めることはできません。

さて、UO3さんからのアドバイスに基づくとし、
「ツール」−「フォーム」の「ボタン」にマクロの登録をしているならば、
以下のTestを登録しておくだけでできると思います。

Sub Test()
 Dim ss As String

 ss = ActiveSheet.Buttons(Application.Caller).TopLeftCell.Offset(-2).Value
 
 MsgBox ss & vbCrLf & Val(ss) & vbCrLf & Val(StrConv(ss, vbNarrow))
 
 実際の処理 Val(StrConv(ss, vbNarrow))
End Sub

Private Sub 実際の処理(lngIndex As Long)
  Application.ScreenUpdating = False
  
  With Range("B1:B10")
   Cells(5, 3 * lngIndex + 1).Resize(.Rows.Count).Value = .Value
  End With
  Range("D2").Select

  Application.ScreenUpdating = True
End Sub

※質問のタイトルを変更させていただきました。

【64325】Re:【訂正】:コードを教えて下さい。
回答  UO3  - 10/1/30(土) 17:58 -

引用なし
パスワード
   ▼heru さん:
>UO3 さん、かみちゃん さんありがとうございます。ですが分かりません。。
>使用しているコードを記述しますのでお願い致します。
>

規則性をご自分でn = 3 * m + 1と把握してらっしゃるんですから
これを小生がご提示したものにあてはめられればよろしいとは思いますが。
課題には関係ないことですがシート上のボタンはコントロールツールボックス
ではなくフォームのコマンドボタンなんですね。

ところで、プロシジャ名を1日とか2日とかしておられますが、エラーに
なりませんか?いずれにしても以下のようにされればよろしいかと。
(プロシジャ名はそのままにしておきますね。)

Sub 1日()
  共通処理 1
End Sub
Sub 2日()
  共通処理 2
End Sub
   ・
   ・
   ・
Privte Sub 共通処理(id)
Dim n as integer
  n = 3 * id + 1

  Application.ScreenUpdating = False
  Range("B1:B10").Select
  Selection.Copy
  Cells(5, n).Select  '<==ここをかえてあります。
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
  Application.CutCopyMode = False
  Cells(2, n).Select  '<==ここをかえてあります。
End Sub

【64327】Re:【訂正】:コードを教えて下さい。
お礼  heru  - 10/1/30(土) 18:17 -

引用なし
パスワード
   UO3 さん、かみちゃん さん本当にありがとうございます。
まだVBAをあたりはじめて数日ですので、理解するのに凄く時間がかかって
しまい(なかなか理解できていません)見当違いな事ばかりしているかと思います
。もっと勉強して理解できるようになりたいと思います。
私が数時間かけてもわからなかったことを数分で出来てしまう御二方にただただ驚かされました!!

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