[表示 : 全て 最新50 1-99 101- 201- 301- 401- 2chのread.cgiへ]
Update time : 12/08 08:49 / Filesize : 136 KB / Number-of Response : 496
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA質問スレ Part11



1 名前:デフォルトの名無しさん mailto:sage [2009/05/10(日) 01:05:30 ]
Excelの「VBA」に関する質問スレです

前スレ pc12.2ch.net/test/read.cgi/tech/1235332603/

★1 質問をするときはOSとExcelのバージョンを必ず書きましょう

★2 わからなければとりあえず「マクロの記録」をしてみましょう

★3 丸投げのプログラム作成依頼は受け付けていません

★4 VBAを使わない、Excelの使い方に関する質問はスレ違いです
    Excel総合相談所 82
    pc11.2ch.net/test/read.cgi/bsoft/1241825062/

452 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 13:06:37 ]
>>444
レジストリ

453 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 20:25:43 ]
VBAの年月を取得したいのですが

以下のように作成したのですが、

年:XXXX 4桁で取得できました。
月:XX 2桁ができません、1桁になります。

  5月なら05として取得したいのですが、修正方法がわかりません
  A1には、2009/5/1と入力しています。

VBAに詳しい方で簡単に、どうぞお願いします。

Sub sample()
Dim myDate As Date
myDate = Range("A1").Value

Range("B7").Value = Year(myDate)
Range("C7").Value = Month(myDate)
Range("D7").Value = Day(myDate)

End Sub


454 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 20:51:04 ]
>>445
>>452

ウイルスとかじゃなくて、あちこちアップデートが必要ににりそうなファイルを
自動でパッチあてる感じにしたいんだ

レジストリはVBEマクロでいじれるもんなの?

455 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 20:56:16 ]
>>453
A1が日付なら
Range("B7").Resize(, 3).Value = Split(Format$(Range("A1").Value, "yyyy/mm/dd"), "/")
の1行で充分じゃね?

456 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 20:57:19 ]
>>453
書式設定か、

Range("C7").Value = "0" & Month(myDate)

457 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:00:18 ]
>>450
そうなのですが、いろいろ試してもうまくいかなくて…

>>451
すみません。どんな動作をしたいか、書いておくべきでした。
なるほど…2次元ですか。
ただ、できれば動的配列にしたいかなぁなんて思ってまして。
2次元だと、Preserveは片方にしか利かないとか。

ありがとうございました。また、自分でも考えてみます。

458 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:03:50 ]
>>456
それじゃ10月は010になってまずいんじゃないかなぁ。
右2文字を取り出せばいいけどね。

459 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:25:21 ]
>>455
>>456
サンクス
 宣言した変数(例、TTTTTTT)に05を文字列として入力したい)

 A1に2009/5/1と入力して、あるフォルダの2009年05月XXX.xlsというファイルを
 読み込むマクロを書いています。

 よろしくお願いします。

460 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:29:22 ]
>>453
Range("C7").Value = "'" & Format(myDate, "mm")

これじゃダメかな?



461 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:35:54 ]
>>459
Format$(Range("A1").Value,"yyyy年mm月XXX")の文字列を作ってWorkbokks.Openと組み合わせるだけ。

462 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 21:37:25 ]
>>460
できました。
 サンクス
   , - ,----、
  (U(    )
  | |∨T∨
  (__)_)


463 名前:デフォルトの名無しさん mailto:  [2009/06/12(金) 01:08:40 ]
取得した文字列を、すでに宣言した変数名と一致させて
使いたいのですが、できますか?
やりたいのは

Dim ABCDE As Integer
Dim moji As String

moji = AB
"moji"CDE = 5

みたいな感じです




464 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 03:32:11 ]
>>463
変数はただの入れ物だから、無理じゃないかなぁ

何がやりたいか詳しく書いてくれたら、
別の方法になるかもしれないけれど、実現できるコードを考えられるかも

465 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 04:26:27 ]
>>464
たぶん>>463が言いたいのはリフレクションを使って
動的に変数を追加・参照することは出来ないかってことじゃね?
そんなことをして、なんになるのか分からないが、そういうことだと思う
# javascriptで関数電卓のフレームワーク+プラグイン(関数やらが定義されてたりする)を作ったときに使ったくらいかな?

たぶん、VBAのリフレクションは貧弱だから出来なさそうな気がする。
だけど、サンプルを見る限り、連想配列で良いんじゃね?って思うな。

最終的にやりたいことは
userStatus("Jonson") = "空腹"
userStatus("Harris") = "眠い"
userStatus("cherry") = "ピヨピヨ来た"
ってことでしょ。

VBAでどうやって連想配列を使うか知らないけど。
# たぶん、つかえないだろうなぁ
# 無かったら、自分で作ればいいけど、速度面でどうなんでしょうねぇ。
# 下手なハッシュ関数作るより、 配列二つ並べて、逐一中身を検索した方が早かったりしてw

466 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 05:21:46 ]
>>463
okwave.jp/qa2033484.html
これみたいなカンジ?

467 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 06:05:14 ]
>>465
なんか、全然わかってなくて書いちゃって恥ずかしいっす。
教えてくれてあんがと。

連想配列の使い方を調べたら、Dictionaryオブジェクトだらしいです。

468 名前:463 mailto:  [2009/06/12(金) 07:51:24 ]
"moji"CDEってのが変数ABCDEのつもりです


たとえば
takeda
aoyama
tanaka
sirakawa
aoyama
koyama

みたいな50種類くらいの名前がかぶりつつ列挙されてて、それぞれ何個
でてきたかしりたいのです。
変数 aoyama_name,koyama_name,takeda_name
と人数分の変数を宣言しておいて、セルの文字列を順に取得し、
その文字列に対応する変数にカウントしていく方法ができないかと



469 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 08:13:29 ]
該当したらインクリメントすりゃ良いんでないかい?
Instrでもlikeでも正規表現でも、何でも良い様な気がする。

470 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 09:34:58 ]
>468 こういうことでいいのかな。
A列に(1行目から)集計対象があり、B列、C列に集計結果を出力する。
Option Explicit
Dim 名前(100) As String, 件数(100) As Integer, i As Integer, i_max As Integer, 縦 As Long, 内容 As String
Sub カウント()
  Call 初期処理
  内容 = Cells(縦, 1).Value
  Do While (内容 <> "")
    If i_max = 0 Then
      名前(0) = 内容: 件数(0) = 1: i_max = 1
    Else
      For i = 0 To i_max
        If 内容 = 名前(i) Then
          件数(i) = 件数(i) + 1
          Exit For
        Else
          If i = i_max Then
            名前(i_max) = 内容: 件数(i_max) = 1: i_max = i_max + 1
            Exit For
          End If
        End If
      Next i
    End If
    縦 = 縦 + 1: 内容 = Cells(縦, 1).Value
  Loop
  For i = 0 To i_max - 1  '集計結果の出力
    Cells(i + 1, 2).Value = 名前(i): Cells(i + 1, 3).Value = 件数(i)
  Next i
End Sub
to be continued



471 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 09:38:23 ]
続きです
Private Sub 初期処理()
  For i = 0 To 100
    名前(i) = "": 件数(i) = 0
  Next i
  i_max = 0: 縦 = 1
  Exit Sub
End Sub
以上
出現順に名前を格納する配列と件数を格納する配列を用意して、セルの内容を読み込む都度
名前配列を順に調べていく、初めてならば添字を+1して名前を格納し、同じ添字の件数配列
に1をセットするというやり方です。もっとスマートな方法があればお知らせください。

472 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:25:10 ]
>>468
Excelの本来の機能は表計算ソフトだから、個数を集計する方法はいくつもあるよ。
COUNTIFとかピボットテーブルとか。
VBAだけでやろうとするより、ワークシートにデータを入れちゃって集計の関数を使った方が早い。

VBAだけでやりたいならDictionaryって便利な機能がある。同じ物があったかどうかのチェックが
とても簡単。

Sub 集計()
  Dim name() As String  'テスト用データを用意
  name = Split("takeda,aoyama,tanaka,sirakawa,aoyama,koyama", ",")
  Set dic = CreateObject("Scripting.Dictionary")

  For Each n In name  '配列で集計
    If dic.exists(n) Then
      dic(n) = dic(n) + 1
    Else
      dic.Add n, 1
    End If
  Next

  For Each d In dic  '結果出力
    Debug.Print d, dic(d)
  Next
End Sub

473 名前:470 mailto:sage [2009/06/12(金) 13:14:48 ]
>472
こういうことができるんですね。
集計対象データが大量の場合は、いったん文字列変数にに","をはさんで連ねていくことになりますね。
Dictionaryの機能は半角英数の大文字・小文字の別とか日本語対応はどうなんでしょう。


474 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 13:25:58 ]
>>473
あくまでもサンプルだから , で区切ったデータを用意したけど、
実際のデータはワークシートやファイルから読み込むのが普通。
キーワードには日本語も使える。英字の大小は区別される。
データを "鈴木,高橋,山田,田中,鈴木,高橋" に変えて試してみ。

475 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 14:28:42 ]
50件程度なら重複チェックを省略しても、とりたてて問題はない。

  For Each n In name  '配列で集計
    dic(n) = dic(n) + 1
  Next

たったこれだけで集計できる。
データが増えると遅くなるけど。

476 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 16:22:18 ]
UserFormから数式を入力させて、その数式に該当するセルに処理を行いたいのですが、
ヒントになるサイトか関数などあれば教えてください。よろしくお願いします

477 名前:463 [2009/06/12(金) 16:27:12 ]
実は集計するだけではなく、
高橋 100点
三根 98点
山田 100点
高橋 100点
青山 97点
山田 99点 
(50人くらい、データは1000件くらい)

で100点の人だけ集計して100点の高橋が何人いて、
100点の山田が何人いるみたいなことをしたかったので、
100点で検索して左のセルをみて、
文字列を取得して、その取得した文字列と
関連するの配列名にカウントしたかった
のですが、どうもdictionaryでできそうです。
みなさんありがとうございました。

478 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 16:27:50 ]
「数式に該当するセル」が意味不明
実例を示せ

479 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 16:30:15 ]
>>477
その程度ならVBAなんぞ使わんでも一発で集計できるがね


480 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 16:43:26 ]
>>478
失礼しました

やりたいことは条件付き書式設定のようなことで、
例えば

30
20
50
60
40
80

というセルを選択した後、ユーザーフォームから数式を入力してボタンを押すと
数式に該当するセルに対して、処理を行うということです。
条件付き書式設定を使えというのは無しでお願いします。。。



481 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 17:31:32 ]
列なの行なの?
なんなのその数字。

482 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 18:13:09 ]
Chr(13)とvbCrlfの使い分けの判断は何?

483 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 19:49:23 ]
vbCrLf = Chr(13) & Chr(10)
Chr(13) = vbCr
Chr(10) = vbLf

484 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 21:11:04 ]
>>482
改行コードは状況によって変わることがあるから
Chr(13)とかChr(10)とかに固定すると具合が悪いこともある

485 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 21:20:26 ]
ぜんぜん「数式に該当するセル」の説明になってない…

486 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 09:26:08 ]
俺がエスパーすると
数式の解に該当する数字の入ったセル

487 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 10:58:14 ]
数式: >=50
数式に該当するセル: 50 60 80

ってことじゃね

488 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 11:10:30 ]
俺がエスパーすると、

フォームから「A2=A1+10」と入力する。A1に5が入っていたとしたらA2に15を入れる。

どうだ?

489 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 12:27:04 ]
463が説明しようとする度にエスパーが大量に必要になりそうな悪寒
何をどうしたいのか細切れに話そうとしてるからますます判らん w

490 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 12:28:17 ]
       ____
     /_ノ  ヽ、_\
   o゚((●)) ((●))゚o   ,. -- 、
  /::::::⌒(__人__)⌒:::::: /    __,>─ 、
  |     |r┬-|    /          ヽ
  |     | |  |   {            |__
  |     | |  |    }  \       ,丿 ヽ
  |     | |  |   /   、 `┬----‐1    }
  |     | |  |  /   `¬|      l   ノヽ  wwwwwwwwwwwwwwwww
  \      `ー'ォ /    、 !_/l    l    /  }
           {       \     l   /  ,'
           \      ´`ヽ.__,ノ  /   ノ
             \     ヽ、\ __,ノ /
               ̄ ヽ、_  〉 ,!、__/





491 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 16:20:49 ]
>>480
数式からEvaluateで戻り値を求めて、その戻り値でフィルターにかけりゃいいじゃん。
それともフィルタオプションで検索条件範囲の1行目を空白にして、2行目に=A2=数式と書きだして抽出するとかね。

492 名前:491 mailto:sage [2009/06/13(土) 16:24:49 ]
俺のエスパー度はマグニチュード7くらいの自信があるから上で間違いないな。

493 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 16:52:40 ]
463まとめ
>>463
>>468
>>477
>>480


494 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 21:30:24 ]
>>493
仲間はずれがいるぜ。
>>480>>476だな。

495 名前:デフォルトの名無しさん mailto:sage [2009/06/13(土) 22:23:18 ]

                  /   ノノ ノノノ ヾヽ、ヽ
               /   ノj `      ´ i |    
               i    {   ` , ,-,、´  i | 
              {    i     )-―-'(  i |    
                 ヽ   i     ⌒   } |_,,,. -‐- 、  
              __)), ,ノ人   、_,  ノ''"´   ,      \ 
                /       ` ー--,. '´   . : :`(      ゝ、
               /           : : :: :´: .         : :\ , ' ´_   ヽ
           /  r´: :       : : : :       ,. ' ´ ヽ>'´    ,'ヽ!
             / γ: :        ノ    _   ,, 、,, ,,__i  。 ./       ; ,!
           i   ir' " ヽ    ,,, ''' ´         `"7         :/ 
         i  |、 ° }, '                 ` y'         /
   "'''‐‐- ...,,,_|   ヽ、ー/           __    _/          /
             `'''-,,,て          ´    ̄ ̄ /          ,イ 
             `''-、__/            /    `  / ,!    _,
                     `''-,,_     ,..、_,,..イ´      i'´  `ゝ''"´
                    \_ ,,,,,...ゞ、_           |ー-/  
                           ミ〉       !r'´
                         ヽ   ミ/、 /|  i  i }







[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<136KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef