Excel VBA質問スレ Pa ..
[2ch|▼Menu]
181:デフォルトの名無しさん
09/10/09 00:37:28
元日 1月1日
成人の日 1月の第2月曜日
建国記念の日 2月11日
春分の日 春分日
昭和の日 4月29日
憲法記念日 5月3日
みどりの日 5月4日
こどもの日 5月5日
海の日 7月の第3月曜日
敬老の日 9月の第3月曜日
秋分の日 秋分日
体育の日 10月の第2月曜日
文化の日 11月3日
勤労感謝の日 11月23日
天皇誕生日 12月23日

について表示できれば良く、改定については考慮しません。


182:デフォルトの名無しさん
09/10/09 00:39:57
祝日を表示したいので、振替休日についても考慮しません。

183:デフォルトの名無しさん
09/10/09 01:13:42
かなり楽に成っちゃったね
ならば、日付が決まっている祝日
第二月曜日、第三月曜の祝日
秋分春分の三つに分けるのが正解かな

184:デフォルトの名無しさん
09/10/09 01:50:01
というか
後出し過ぎ

185:デフォルトの名無しさん
09/10/09 02:38:24
会社の創立記念日とか



186:デフォルトの名無しさん
09/10/09 08:24:30
ム板だよな?ここ・・・

187:デフォルトの名無しさん
09/10/09 08:52:50
そっか今みどりの日だから祝日扱いなんだな

188:デフォルトの名無しさん
09/10/09 21:28:17
質問をさせて下さい。スペックは
Windows2000
Excel2000
です。

シート1に

名前 日付 数 名前 日付 数 ・・・
A氏 10/1 12 E氏 10/3 10
B氏 10/1 11 F氏 10/2 10
C氏 10/2 10 G氏 10/4 11
D氏 10/3 10

のような感じでデータが横に長く入力されているのですが、
これをシート2に一括のデータとしてまとめたいです。

名前には重複はありません。日付のみ重複しています。

申し訳ありませんが、よろしくお願いします。

189:デフォルトの名無しさん
09/10/09 21:30:51
>>188に補足です
シート2は
名前 日付 数
A氏 10/1 12
B氏 10/1 11
C氏 10/2 10
D氏 10/3 10
E氏 10/3 10
F氏 10/2 10
G氏 10/4 11



の形にしたいです。

190:デフォルトの名無しさん
09/10/09 21:41:35
>>188-189
配列に入れたら簡単だよ。
それくらい人に頼らず自分で作れないとダメでしょ。

191:デフォルトの名無しさん
09/10/09 21:52:53
配列にいれんでも
名前には重複がないんだったら
そのままシート2へコピーすればいいだけてしょ
1)A氏〜D氏までのセルをコピー
2)その下にE氏〜G氏までのセルをコピー
てな感じで ループ処理していけば

192:デフォルトの名無しさん
09/10/09 22:07:04
>>188
もうちょっと具体的に。
シート1は縦4列?

193:デフォルトの名無しさん
09/10/09 22:11:29
つか 丸投げな匂いがするのは気のせい?

194:188
09/10/09 22:28:11
名前と日付と数でひとつのブロックになっていて、それが横に数十連なっています。
今までは手作業でコピーと貼り付けをしていたのですが
数が膨大になってきたので手作業ではまかなえなくなってしまいました。

とりあえず自分でマクロを組んでみたのですが、ブロックごとの数がまちまちで
シート2の一括データに空白が出来て穴あきデータになっていしまいます・・・

195:デフォルトの名無しさん
09/10/09 22:41:20
>>155
希望に沿うか分からないですけど、作ってみました。
URLリンク(excelerthanexcel.blog103.fc2.com)

3つのプロシージャをどう作るかを下の2択で迷い、後者にしました。
・ 祝日の性質別(固定日、第n月曜日、秋分春分)
・ 機能別(日付確定、曜日確定、1行出力)

よかったら参考にしてください。

196:デフォルトの名無しさん
09/10/09 22:57:49
>>194
デキタヨー

Sub a()
  Set S1 = Sheets("シート1")
  Set S2 = Sheets("シート2")
  With S1
    R_max = .UsedRange.Rows.Count
    C_max = .UsedRange.Columns.Count
    R_dest = 2
    For c = 1 To C_max Step 3
      For r = 2 To R_max
        If .Cells(r, c) <> "" Then
           S2.Cells(R_dest, 1) = .Cells(r, c)
           S2.Cells(R_dest, 2) = .Cells(r, c + 1)
           S2.Cells(R_dest, 3) = .Cells(r, c + 2)
           R_dest = R_dest + 1
        End If
      Next
    Next
  End With
End Sub

197:デフォルトの名無しさん
09/10/09 23:08:29
またコイツか・・・

何でわざわざSetするの?

198:デフォルトの名無しさん
09/10/09 23:11:46
>>195
本当にありがとうございます。助かります。
イミディエイトウインドウが表示されないです…

「春分秋分」については、月日は「春分日」「秋分日」、 曜日は「未定」
と表示すればよいのですが、その場合はどうすればよいか
教えていただきたいです。



199:デフォルトの名無しさん
09/10/09 23:14:50
変数の宣言しないと分かりにくいかもねぇ。

200:デフォルトの名無しさん
09/10/09 23:28:12
198です。
イミディエイトウィンドウは表示されました。すみません。

201:デフォルトの名無しさん
09/10/09 23:29:33
>>197
あとから修正する可能性のある部分を先頭にまとめてるだけだよ

202:デフォルトの名無しさん
09/10/09 23:38:16
>>198
 >学校で授業でやっていて、「テストまでには出来るようにしておけ」
じゃなかった?

あんまり人まかせだと テストで 赤点てな事になるよ!

203:195
09/10/10 00:03:23
>>198
自己解決したとはいえ、イミディエイトウィンドウぐらいは質問せずに自分で開きましょう。

ブログ内のコードをぐだぐだに編集して、結果だけは希望通りに出るようにしました。
質を下げたもので良ければ利用してください。

プログラム板にしては非常にぬるま湯的な対応をしてしまったことを
すごく後悔しています。でもまぁ、自分自身の勉強にはなったか。

204:デフォルトの名無しさん
09/10/10 00:17:17
>>196
ちゃんと内容は見ていないがSet □ = Nothing をする癖をつけた方がいいと思うよ。

205:デフォルトの名無しさん
09/10/10 00:51:40
>>203
ありがとうございました。


206:デフォルトの名無しさん
09/10/10 01:10:37
>>204
ローカル変数って、たとえオブジェクト型でもモジュールの出口で自動的に開放されるんじゃないの?

207:デフォルトの名無しさん
09/10/10 03:57:40
礼儀だよ。

208:デフォルトの名無しさん
09/10/10 04:17:30
モジュールが無事終了するとは限らないだろ

209:デフォルトの名無しさん
09/10/10 05:39:19
>>204
いらないよ。

>>207
何の礼儀だよ?

>>208
だから?

210:デフォルトの名無しさん
09/10/10 06:03:58
↑こいつ最高にアホw

211:デフォルトの名無しさん
09/10/10 07:23:40
↓こいつ最高に天才www

212:デフォルトの名無しさん
09/10/10 10:05:40
   ∩―、
  /(゚)丶_ 丶
  / (● (゚)|つ
 | (入_ノ ミ
 | (_/  ノ
  \___ノ゙ー-、
  /\    _ \
(⌒O /\   (_ノ
 \ノ  /  、  )0


213:188
09/10/10 10:16:15
>>196
テストしてみたところ問題なく動きました。
本当にありがとうございます。

214:デフォルトの名無しさん
09/10/10 10:51:27
>>210
羮に懲りて膾を吹く。
アプリ終了前にfreeしまくるがごとし。

215:デフォルトの名無しさん
09/10/10 12:23:40
>>197
>>196を擁護すればSetした方が速いんだよ。
まぁCellsは遅いから、速くしたければ配列だろうけどね。
それからわざわざシート参照の変数をSet 変数 = Nothingとする必要はねーよ。
そんなこと気にするやつは、他にもっと気にすべきことが抜けてる場合がほとんどだ。


216:デフォルトの名無しさん
09/10/10 12:55:55
>>196
>S2.Cells(R_dest, 1) = .Cells(r, c)
>S2.Cells(R_dest, 2) = .Cells(r, c + 1)
>S2.Cells(R_dest, 3) = .Cells(r, c + 2)
この部分は
S2.Cells(R_dest, 1).Resize(,3).Value= .Cells(r, c).Resize(,3).Value
と1行で書けそうだな。

217:デフォルトの名無しさん
09/10/10 13:10:30
オブジェクトがデカいと
メモリが少ないようなマシンで
set=nothingしないとその後辛くないかな
何もないなら必要ないだろうけど。
試して言っている訳ではないです。

218:デフォルトの名無しさん
09/10/10 16:16:35
プログラマはsetした後nothingしないなんていわない

219:デフォルトの名無しさん
09/10/10 19:06:03
>>217
Worksheet型のオブジェクト変数はシートを作ってるわけじゃない。
ワークシートへの参照への参照だ。
メモリは32ビットCPUで4バイトだ。
マクロが終了すりゃちゃんと参照カウンタは0になる。
Set ** = Nothingを書くのを否定はしないが、書くのがあたりまえって意見は否定する。

220:デフォルトの名無しさん
09/10/10 20:02:13
書くことを習慣づけろ

221:デフォルトの名無しさん
09/10/10 21:15:43
いらないものを書くやつは馬鹿じゃね?

222:デフォルトの名無しさん
09/10/10 21:18:02
これを習慣づけろっ!て言うことが
礼儀と呼ばれるんだろね
質問なんですが
他に礼儀ってどんなものが有りますか?

223:デフォルトの名無しさん
09/10/10 21:19:16
>>221
如何に記述量を増やすかがプロなんだよ。
最小限で簡潔になんてアマチュアのやること。

224:デフォルトの名無しさん
09/10/10 21:22:39
プロってすごいんだね。

225:デフォルトの名無しさん
09/10/10 21:26:09
うるさい、黙ってNothing書け!

226:デフォルトの名無しさん
09/10/10 21:27:51
なにこの流れww

227:デフォルトの名無しさん
09/10/10 21:36:46
つまり、理由も根拠もないんだが、自分のやりたいことを他人に強制したいときの
エクスキューズが「礼儀」ってことだ。

228:デフォルトの名無しさん
09/10/10 21:45:54
>>215
普通はSetした方が速いが>>196は未宣言のVariant型だから速くはならんね。
Nothing云々より変数宣言が大事だな。

229:デフォルトの名無しさん
09/10/10 21:57:25
つまりプログラムにおいて礼儀とはK&Rであると

230:デフォルトの名無しさん
09/10/10 21:57:50
で、それ百万回実行して何ms違うの?

231:デフォルトの名無しさん
09/10/10 21:59:54
>>217
関数抜けたら解放されるんじゃ?

232:デフォルトの名無しさん
09/10/10 22:02:12
>230
普通なら宣言しないほうが早い
でも場合によってはエラーが引き起こされたりメモリが足りなくなったりする
エラー処理するかどうかなんて人それぞれだし、押し付けるようなもんじゃないんじゃないん

233:デフォルトの名無しさん
09/10/10 22:16:56
Excel2007

シート上にボタンを2つ貼りつけています。
動作はブックのコピー先をどこにするかだけの違いだけです。
そこでボタンは2つで同じマクロを呼び出し、どのボタンから呼ばれたか
によって動作を変えたいのですが、そういう事出来ますか?

フォーム上のボタンであれば、

Private Sub btn_A_Click()
CopyExec A
End Sub

Private Sub btn_B_Click()
CopyExec B
End Sub

みたいにそれぞれパラメータを与えて切り替えというのが出来ると思うのですが


234:デフォルトの名無しさん
09/10/10 22:33:54
これから速度厨と礼儀厨の熾烈な戦いが始まります。

235:デフォルトの名無しさん
09/10/10 22:39:35
>>233
貼りつけているのは、CommandButtonなの?

Private Sub CommandButton1_Click()
End Sub
Private Sub CommandButton2_Click()
End Sub

てのが出来るどこれとは違うのかな?

236:デフォルトの名無しさん
09/10/10 22:49:17
10usくらいの差なんてどうでもいいよ

237:デフォルトの名無しさん
09/10/10 22:50:35
おまえらもういいよムリしなくて
速度とかIndexとかVlookupとかピボットとかNothingとか全部ネタのクセに
わかってるからさ!

238:235
09/10/10 22:53:23
同じマクロを呼び出したいのね

ただ
>フォーム上のボタンであれば、
以下の文面では
フォーム上でも同じマクロを呼び出してないけど
それはいいの?

239:233
09/10/10 22:55:20
>>235
そうです。CommandButtonです。

それはフォームについてVBEで書く時ではないですか?

シート上に貼りつけて、対象マクロを選択する時ってマクロの登録(N)から
マクロを選択するけど同じのを選択した時に、どのように区別がつけられるのか?
と思いまして質問しています。どうなんでしょうか。


240:デフォルトの名無しさん
09/10/10 22:56:50
>>238

あれは CopyExec というマクロに対して、パラメータとして AまたはBを与えるという意味で
書きました。判りにくくてすいません。


241:デフォルトの名無しさん
09/10/10 23:01:50
>>239
Excel2007じゃないんでなんとも言えないけれど
対象ボタンを右くりっくして
"コードの表示"をすると

シートオブジェクトのコード画面に
Private Sub CommandButton1_Click()

End Sub
とかできない?

242:239
09/10/10 23:08:48
>>241
ボタンを右クリックして出てくるメニューの一覧が
切り取り
コピー
貼りつけ
------
テキストの編集
------
グループ化
順序
------
マクロの登録
コントロールの書式設定

でコードの標示というのはここからは出来ないみたいですが


243:241
09/10/10 23:12:16
>>242
自分のExcel古いせいかメニューが違うようで

お力になれませんでした! すみません

244:デフォルトの名無しさん
09/10/10 23:41:15
>>242
VBE開いてボタン貼り付けたシートのコードの表示すればいい


245:デフォルトの名無しさん
09/10/10 23:49:31
デザインモードになってないだけじゃないの。
デザインモードにしてボタンをダブルクリックでVBEの画面になる。

246:デフォルトの名無しさん
09/10/11 00:36:01
エクセル2007で質問です。
アドインタブのユーザー 設定のツールバーのところにボタン1、ボタン2を作って、
ボタン1を押したら、ボタン1のEnabledをFalse、2をTrue
ボタン2を押したら1はTrue、2はFalseに設定したはずですが、
ボタン1を押したあと、ボタン2が押せる状態になっていません。タブを切り替えるとなぜかうまくいくんですが。
2007はこういう仕様なんでしょうか

247:デフォルトの名無しさん
09/10/11 00:43:51
またーり行こうぜ

248:デフォルトの名無しさん
09/10/11 00:54:36
タブってリボンのことか?


249:デフォルトの名無しさん
09/10/11 00:59:03
>>239
同じマクロを呼び出した場合、呼び出し元の区別はつかんだろうな
パラメータが指定できるなら そこで区別つけるしかない

あと
フォーム上でもシート上でも
クリックイベントのプロシージャは利用できる

250:239
09/10/11 06:55:15
>>249
>呼び出し元の区別はつかんだろうな

今回は同じマクロを使う事は諦めます。ありがとうございました。

251:デフォルトの名無しさん
09/10/11 07:38:14
それActiveXコントロールのボタンじゃなくて、フォームのボタンだよね。
application.callerでボタンのテキストが取得できるから、それで判断。

252:デフォルトの名無しさん
09/10/11 08:04:41
>>251
MsgBox "呼出し元 " & Application.Caller
でシート上のボタンでも呼出し元を判別する事が出来ました。ありがとう!

253:デフォルトの名無しさん
09/10/11 10:45:19
あー、まだ見てたんだ。よかったよかった。
フォームのボタンに限らず、イベントの発火元は大抵わかるようになってるんだよ。
まぁ、中にはわからにものや、任意のマクロ(イベントハンドラ)を登録できないのもあるけどね。

254:デフォルトの名無しさん
09/10/11 11:46:13
Private Sub CommandButton1_Click()
  MacroA pram:=1
End Sub
Private Sub CommandButton2_Click()
  MacroA pram:=2
End Sub

こういうのは駄目?

255:デフォルトの名無しさん
09/10/11 12:08:38
いや、それでいいし、実を言えばフォームのボタンの処理もそうしたほうがいいんだ。
プログラマ的な説明だと、イベントハンドラ内に直接処理を実装すると、凝集度が低くなるから。

256:デフォルトの名無しさん
09/10/11 17:21:22
>>凝集

臨床検査学以外で初めて聞いたよ。
まさか一般社会で聞く単語とは思ってもいなかった。

257:デフォルトの名無しさん
09/10/11 18:01:09
ちょっと教えてもらっていいですか?
Cellsの使い方について
このスレでも時々みかけるんですが

a = Sheets("Sheet1").Cells(1,1).Value

a = Sheets("Sheet1").Cells(1,1)

は結果的に両方共 A1セルの内容を変数aに代入している事になっているのだけど
前者と後者の違いってあるのですか?

本来は、前者であるべきとは思いますが
後者を使った時の弊害ってなにかあります?

258:デフォルトの名無しさん
09/10/11 18:22:07
>>257
人によってはデフォルトプロパティを中途半端に省略したソースを汚いと感じることもある。
自分一人で使うだけなら好きにすればいい。
あとは、タイピング量が数回増えるのも人によっては弊害と考えるかもしれない。

259:257
09/10/11 18:37:12
>>258
結局の所どちらでも結果は一緒なんだから
どちらを使ってもいいんですね

ソースが綺麗か汚いかはその人の主観なんだから
あまり気にしません

とは言え 自分自身のソースみて汚いと感じる事があるんで
精進しなくては

ありがとうございます

260:デフォルトの名無しさん
09/10/11 20:48:33
凝集度と結合度

261:デフォルトの名無しさん
09/10/11 23:13:40
>>259
また荒れる原因になるかもしれないんだけど、
やっぱりデフォルトプロパティは省略すべきじゃないと思うよ。
range型に代入する時なんか、可読性云々じゃなくて、
後から見て訳が分からなくなる・・・時がある。

262:デフォルトの名無しさん
09/10/11 23:36:28
個人的には最初は省略しないで書いた方がいいと思う。
で、覚えたら好きに書けばいいと思う。
覚えていれば省略しても、普通にも書けるが、覚えてないと普通には書けないと思うよ。

263:デフォルトの名無しさん
09/10/11 23:59:39
者によっては、特にオブジェクトに大量にアクセスする場合など処理が冗長になることがある
原則的に省略しないほうがいいと俺も思うけど、場面場面で使い分けるべきではある

264:デフォルトの名無しさん
09/10/12 00:00:30
C#に移行したいとかVBAが.NETベースになった時の事も考えて、
デフォルトプロパティは省略しない方がいいんじゃないだろうかと言ってみる
それならとばかりにWithステートメントを多用すると、
C#で「面倒臭ぇと」ボヤく事になる罠

265:デフォルトの名無しさん
09/10/12 00:09:21
それもこれも言語の貧弱さが原因なんだよな

266:デフォルトの名無しさん
09/10/12 00:13:01
単純ミス防止でoption explicit とか書くだろ
それと同じで曖昧な表現は極力明確にするほうが良いと思う
どこまでが曖昧な表現かは人によるw

267:257
09/10/12 01:14:57
>>261-266
みなさんありがとうこざいます
やはり省略しない方がよさそうですね
確かに単純なプログラムでは問題なくても
複雑なプログラムになるほど後で見て訳分からなくなりそうですもんね
でも
Itemプロパティぐらいは省略してもいいかなと思ってます(^^

268:デフォルトの名無しさん
09/10/12 06:01:17
セルの値が数値ならValueじゃなくValue2が普通だから、必然的にプロパティは書くことが多いな。
Itemまで書くとくどいよな。
Worksheets.Item("Sheet1")とかCells.Item(1,1)とかする奴はあまりいないな。

269:デフォルトの名無しさん
09/10/12 22:20:08
             /)
           ///)
          /,.=゙''"/
   /     i f ,.r='"-‐'つ____   こまけぇこたぁいいんだよ!!
  /      /   _,.-‐'~/⌒  ⌒\
    /   ,i   ,二ニ⊃( ●). (●)\
   /    ノ    il゙フ::::::⌒(__人__)⌒::::: \
      ,イ「ト、  ,!,!|     |r┬-|     |
     / iトヾヽ_/ィ"\      `ー'´     /


270:デフォルトの名無しさん
09/10/13 16:41:04
A1A2・・・に単語が並んでいて
B1B2・・・にグーグルかヤフーのその単語の検索件数を書き入れていくというような
Webクエリは作れないものでしょうか?

271:デフォルトの名無しさん
09/10/13 18:09:44
>>270
そのままでは件数がクエリで取り出せないので、VBAと組み合わせる必要がある

272:デフォルトの名無しさん
09/10/13 18:18:16
VBA使ってどうすればよいのでしょうか?
ぜひ御教授お願いします。数万の単語の検索に途方にくれています>__<

273:デフォルトの名無しさん
09/10/13 19:14:30
kwsk

274:デフォルトの名無しさん
09/10/13 19:26:29
ヒントだけでも教えてください。

1つのセルに1つの文字列が入っています。
各行はその文字列の集合とします。
その文字が何文字あるのかと、
各行の文字の全組み合わせ(各行の全部分集合)が全体の中で何個あるのか、
その結果を出力したいのですがどうしたらいいでしょうか?
例えば、
A,B,C,D
A,B
A,B,C
A
このように各セルに文字が入っていたとすると、
全体の中でAは4個、Bは3個、Cは2個、Dは1個あります。
また、組み合わせの個数は全体の中でそれぞれ、
(A,B)は3個、(A,C)は2個、(A,D)は1個
(B,C)は2個、(B,D)は1個
(C,D)は1個
(A,B,C)は2個、(A,B,D)は1個、(A,C,D)は1個
(B,C,D)は1個
(A,B,C,D)は1個となります。

これは具体的な例ですが、実際は何行何列でも何文字でも対応できるように一般化したいです。
意外と難しくてどうしたらいいかわかりませんでした。
こうすればできるだろうという方針だけでもどなたかご教授お願いします。

275:デフォルトの名無しさん
09/10/13 21:11:13
A,B,C,D なのに A,C がマッチするのかよ。
Instrで文字列内を検索すりゃ良いんでない?

てか、どんだけの文字数があるのかさっぱりわからん。
無数にある文字種類から検索するとなったら酷い事になりそうだ。

使われてる文字の一覧を作って、それを検索して行くのが良いかもな。
文字種類は無限です。って言うなら、俺は降りる。

276:デフォルトの名無しさん
09/10/13 21:53:11
>>275
わかりにくい説明で本当すいません。
「A,B,C,D」は1つの文字列ではありません。1つのセルに1つの文字が入っています。
コンマの区切りでセルを表したつもりでした。
「A,B,C,D」の、AはRange("A1")、BはRange("B1")、CはRange("C1")、DはRange("D1")
とに入っています。

実際はAとかBでなく、りんごとかバナナみたいな1つの単語が1つのセルに入ることになりますが。
(A,C)は(りんご、バナナ)という組み合わせだと考えていただけたらわかりやすいかと思います。

使われる単語は無限ではありません。
それでも仰るとおり数が増えれば酷いことにはなりますが、
そこはまた別問題で解決する算段はあります。

(りんご、バナナ)という組み合わせが全体に何個あるか?という話なんです。
わかりにくい説明ですいませんが。

VBAで、ある集合の部分集合を全て列挙するやり方だけでもどなたか
ご教示してくださいませんか?
一応自分でも調べてみましたがわかりませんでした。

277:デフォルトの名無しさん
09/10/13 22:05:47
>>274
ヒント モリケン

278:デフォルトの名無しさん
09/10/13 22:12:31
>276

275氏も書いてるがInStrでOK。

にしても説明ヘタだな、君は。

279:デフォルトの名無しさん
09/10/13 22:29:15
人に判り易く自分のやりたい事を説明するっつーのも訓練が必要っすよ。 w

他人には(特に掲示板なんかでは)質問者のレベル・環境、そして何をどうしたいのかなんて判らないのだから。

(ここはExcel VBAスレだから或る程度は限定されてるけど)



280:デフォルトの名無しさん
09/10/13 22:33:33
>>275-279
すいませんがんばってみます。
サンプルでもうpすればわかりやすかったかも・

281:デフォルトの名無しさん
09/10/13 23:35:10
1列に必ず同じ文字が入るなら簡単だろ。
この場合は4文字だから、組み合わせは
4C4=1
4C3=4
4C2=6
の11種類しかない。
組み合わせの形がわかるから、その組み合わせを順に行毎にループすりゃいい。



282:デフォルトの名無しさん
09/10/14 10:28:23
270です。
VBAはかなりいろいろできるようになったのですが、ネットにつなぐスクリプトは
挑んだことがありません。またどうやってヤフーやゴーグルのデータを取り込んで
加工するかがわかりません。
一単語ごとに検索して検索数をコピペする作業は300ぐらいこなすとぐったりです。
どうすれば自動化したいのです・・・

283:デフォルトの名無しさん
09/10/14 11:04:49
まずは日本語でどうぞ。

>1 ★5

284:283
09/10/14 11:06:50
>2 ★5

だった;;

285:デフォルトの名無しさん
09/10/14 11:09:03
データ→Webクエリ(で対象のアドレスを入れて)でシートに取り込むのをマクロで記録すればOK


ただし、こっからが問題ありでヤフーやらぐーぐる(だろ?w)が仕様変更でレイアウトなどを変更したら、それに合わせて
修正必須になる

286:デフォルトの名無しさん
09/10/14 11:13:47
>>282
とりあえずヒントだけ。(環境依存な部分があるので、このままじゃ動かない)

Sub 件数取得()

  kw = "ぬるぽ ガッ"

  Set ObjHttp = CreateObject("Microsoft.XMLHTTP")
  ObjHttp.Open "GET", "URLリンク(www.google.co.jp)" & kw, False
  ObjHttp.Send
  src = StrConv(ObjHttp.responseBody, vbUnicode)
  Set ObjHttp = Nothing

  src = Mid(src, InStr(InStr(src, "id=resultStats") + 24, src, "<b>") + 3)
  src = Left(src, InStr(src, "</b>") - 1)

  Debug.Print "「"; kw; "」のヒット件数="; src

End Sub

287:デフォルトの名無しさん
09/10/14 12:34:58
質問させてください。(Ecel2003)

複数のセルをcsv形式で文字列変数に格納したいのですが、
Webで探したら1セル+","を繰り返す方法しか見つかりません
でした。

実際試して見ましたが対象セルが数万あるので処理に非常
に時間が掛かっております。

Joinなどを利用して一括で行うなど、高速化の手段は無い
のでしょうか?
(対象セルは矩形で表現できます)

ちなみに最終目的は複数のBookのある範囲のセル値を1つ
のcsvファイルにまとめることです。

よろしくお願いします。

288:デフォルトの名無しさん
09/10/14 12:41:09
>>287
あくまでも想像だけど、時間がかかっているのは、たぶんセルの内容を1つずつ読み出してるから。
配列に一気に読み込んでから処理すれば、もっと速くなるはず。

289:デフォルトの名無しさん
09/10/14 13:01:44
>>287
Join関数は一次元配列しか指定できないから、二次元から一次元への変換部分だけは
自分で工夫して作るしかない。

290:デフォルトの名無しさん
09/10/14 13:11:04
>>288
違うと思うよ。
単純に連結すりゃだんだんサイズが大きくなってメモリに入りきれなくなり別のメモリ領域をしょっちゅう探して確保しなきゃならないから時間がかかるんだ。
昔は必要なサイズの文字列を用意しておいてMidステートメント(関数じゃない)ではめ込んでいくのが常道だったが、今はJoin関数があるから楽だな。

291:デフォルトの名無しさん
09/10/14 14:21:33
>>286
神様ありがとうございます。
どういうふうな勉強をされたのでしょうか。ネットワーク関係のお仕事など
されているのでしょうか。参考になる本などを教えていただけるとうれしいです☆
ありがとうございます。

292:287
09/10/14 14:26:52
回答ありがとうございました。

一次元に変換してJoinでやってみます。

293:287
09/10/14 15:53:51
度々すみません。
追加で質問させてください。

先の件は一次元にしたら体感で数十倍以上早くなりました。
ありがとうございました。

文字列変数に格納したデータをcsv形式で保存すると、期待した
結果が""で囲われたcsvファイルが出来上がりました。

(以下サンプル)
"1,2,3,4,5,
1,2,3,4,5,
"

この先頭/末尾の「"」を入れたくないのですがどうすれば良い
のでしょうか?



294:287
09/10/14 16:26:40
自己解決。

出力をWriteで行っておりましたがPrintに変えたら希望通りとなりました。
違いがよっく分かりませんが解決しましたのでご報告します。

ありがとうございました。

295:デフォルトの名無しさん
09/10/14 16:27:54
>>293
csv形式で保存するんじゃなくて、テキストファイルに出力する

296:デフォルトの名無しさん
09/10/14 17:05:17
動的配列について質問なのですが
googleで検索などしたところ

Dim aaa() as string

など()のみで宣言したアトに

ReDim aaa(0 to 10)

のように範囲を指定して使う。みたいな例しか検索できませんでした
しかし、範囲を指定して使うならそれはすでに動的ではなく静的じゃないか
とずっと頭を抱えているのですが

要素数不明の配列を扱うことは無理なのでしょうか?

配列にデータを入れる際に、データ数カウントしながら入れて
その後ReDimすりゃいいってことですかね??

297:デフォルトの名無しさん
09/10/14 17:10:03
と思ったら、データを入れる段階で「インデックスが範囲外」的なエラーでましたorz

入れる前に範囲決めろとか無茶なんですが・・・そういうのはvbaじゃ無理ですかね?

298:デフォルトの名無しさん
09/10/14 17:17:59
>>296
あとから何度でもサイズを変更できるというのも一種の動的。

>>297
インデックス値を変数に入れておき、データを入れる前に、そのインデックス値を使って
配列をどんどん拡張していけばいい。
ただしReDimを使うと配列の中身がクリアされてしまうので
データを保持したままサイズを変更するにはReDim Preserveを使う必要がある。
VBAでは一般的なテクニック。

299:デフォルトの名無しさん
09/10/14 17:20:39
>>286
繰り返し処理をしていたら400ほどでデータがなくなりました。
ブラウザでグーグルを見ると、あなたは拒絶しますのような画面が出てグーグル
使えなくなりました・・・
どうすれば・・・・・

300:デフォルトの名無しさん
09/10/14 17:23:17
We're sorry...

301:デフォルトの名無しさん
09/10/14 17:25:33
>>299
しばらく待つ

302:デフォルトの名無しさん
09/10/14 17:29:09
>>299
そのサンプルはOpenでコネクションが開きっぱなしだから、まずは1回ごとにCloseしてみ
あとは、まあ連続アクセスは避けるとか。たとえば10秒間隔でアクセスするよう修正してみる

303:デフォルトの名無しさん
09/10/14 17:46:57
Google にクエリを送信すること
をしてはいけないということです・・・

世界のグーグルを怒らせてしまって・・・

304:デフォルトの名無しさん
09/10/14 18:10:25
We're sorry...
... but your computer or network may be sending automated queries.
To protect our users, we can't process your request right now.

See Google Help for more information.

305:デフォルトの名無しさん
09/10/14 18:48:06
>>298
アドバイスありがとうございます

要素数をuboundで数えて、残り少なくなったら配列を拡張するという方法をとってみました
とりあえずはこれでなんとかなりそうです

306:デフォルトの名無しさん
09/10/14 23:45:51
>>305
そんなファジーな使い方をw
かっちりと要素数取得すれば良いんじゃないか?

307:デフォルトの名無しさん
09/10/15 00:12:46
>>299
別に質問でも回答でもないんだけど・・・
グーグルをそういう使い方したらいけないというのがわかって為になったわ

308:デフォルトの名無しさん
09/10/15 03:17:58
ボクも、>>286のプログラムを使ってみた。
URLリンク(kabutomo.net)

309:デフォルトの名無しさん
09/10/15 08:30:17
299です。
復旧しました。復旧にはゆがんだ画像の絵のなかの文字を入力
させる画面が二回出てきて、復旧。その後、何回かグーグルを
普通に利用したところ、またゆがんだ絵の文字を入れろと・・・
すっかりブラックリストに載ってしまったみたいです・・・・・

英語グーグルにアクセスしても同じことで、違うのは、
送信ボタンが、I'm human と書いてあるところでした・・・
かなりこわい経験でした。400か500連続で、ストップというところ
でしょうか。気をつけてください。

それにしてもあなたはグーグルとのこの契約を知っているでしょう
とは・・・・

310:デフォルトの名無しさん
09/10/15 08:59:36
やはりあなたは検索しすぎです
ばいばいおさるさんw

311:デフォルトの名無しさん
09/10/15 11:06:57
>>309
ここから先はネットサービス板あたりの領域かな。
Googleの検索は1時間あたり何回までが限界とかそういうのをきちんと調査した上で、
それを越えないようなプログラムを工夫して作ることになる。

312:デフォルトの名無しさん
09/10/15 11:30:00
ありがとうございます。頼っていたサービスなので非常に怖い思いをしました。
なんか世界から拒絶されたような・・・
手で作業するよりも早ければそれでいいです。一分に5つぐらいのペースのを
つくってみます。一月ほど休むことにします。
プログラマー向けのページには一日5000までとは書いてあったのですが・・・
ヤフーは5万までみたいです。

313:デフォルトの名無しさん
09/10/15 12:03:54
外部にproxy用意して色んなIPから接続してやるのが定番

314:デフォルトの名無しさん
09/10/15 12:11:35
外部にボットを用意して色んなPCから接続してやるのはどうでしょうか。

315:デフォルトの名無しさん
09/10/15 12:41:52
ボットってか
もう
googleを攻撃しないであげて

316:デフォルトの名無しさん
09/10/15 13:47:02
なるほど良く考えたらスクリプトアタックか

317:デフォルトの名無しさん
09/10/15 14:58:17
OS:XP EXCEL2003、2007にて
Ctrl+6 や Ctrl+7といった数字のショートカットキー
を禁止にする方法はありませんでしょうか?
検索しても回答がなく、OnKeyでも拾えないので
困っています。

318:デフォルトの名無しさん
09/10/15 18:03:21
VBAとどのような関係が?

319:デフォルトの名無しさん
09/10/15 20:53:16
>>318
VBAでそのキーを押した際の処理を無効化したいんでしょ。

320:デフォルトの名無しさん
09/10/15 21:27:48
フックは簡単にできるでしょ。

と思いやってみたが本当に拾えないな。
APIにあったと思うけど、スレ的にどうなんだろ。

321:デフォルトの名無しさん
09/10/15 22:20:20
カーネルに入ってなかったっけか。

322:デフォルトの名無しさん
09/10/15 22:23:40
結構前まではAPIの話題が出ただけで拒否反応する人はいたな
ライブラリ参照したりAPI使うのはエクセルVBAの構築手段として十分範囲内だと思うけど
API自体の話でもなければ

323:デフォルトの名無しさん
09/10/16 13:30:41
グーグルって自分ではロボットつかいまくってるのに自分には使わないでというのは
やっぱりおかしいわ

324:デフォルトの名無しさん
09/10/16 15:39:10
>>323

325:デフォルトの名無しさん
09/10/16 16:25:15
XP SP3
EXCEL2002

現在、クライアントPCのファイルをデスクトップ上にあるイントラネットショートカットアイコンに
ドラッグアンドドロップでファイルをアップロードしているのですが、
クライアントPCのファイルをイントラネットにアップロードする事はVBAで処理可能でしょうか?


326:デフォルトの名無しさん
09/10/16 17:57:05
VBAでTCP/IPって話は難しいとおもうが
VBAでイントラネットショートカットアイコンにドラッグアンドドロップ相当の
作業を行うのは幾分は簡単かと思う

327:デフォルトの名無しさん
09/10/16 20:17:36
>325
ショートカットアイコンは
何処へのどんなショートカットなの?

サーバとかの共有フォルダへのショートカットなら
VBA使わなくてもって気もするが
あえてVBAなら
FileCopy すればいいだけのような気がするのだけど
そのへんどうなの?

328:デフォルトの名無しさん
09/10/16 20:48:18
質問させてください。

Excel2003ですが、任意の文字列を配列の中から検索して
インデックス番号を返すような処理はどのように行うのでしょう
か?

任意の文字列は必ず配列の中に完全一致で存在します。
また配列内に重複する文字列はありません。

myArray(0)="あああ"
myArray(1)="いいい"
myArray(2)="ううう"
myArray(3)="えええ"
myArray(4)="おおお"

の場合、"ううう"をキーにすれば2を求めたいのですが、配列
を回して比較する程度しか思いつきません。
Findメソッドなどで実現できないでしょうか?

よろしくお願いします。

329:デフォルトの名無しさん
09/10/16 21:38:56
>>328
残念ながらVBAだけで一発で検索する方法はない。
検索を第一に考えるなら、2次元配列にデータを入れておき、
必要に応じてワークシートに転送してからワークシート関数で検索するという方法がある。
文字列の長さがすべて一定ならJoinで1つの文字列にまとめてから位置を調べるという手もある。

330:デフォルトの名無しさん
09/10/16 21:41:08
>>328
目的によってはDictionaryオブジェクトが使える場合もある

331:デフォルトの名無しさん
09/10/16 21:49:56
System.Collections.ArrayList

332:デフォルトの名無しさん
09/10/16 22:03:32
配列がとても大きくて順次比較していては時間がかかるって言う事なら
配列のキーの部分が 昇順または降順でソートされているという条件で
古典的なバイナリサーチ手法を使えぱ時間は短縮できる

333:デフォルトの名無しさん
09/10/16 22:08:25
ハイルデータが固定で数が多くないとか、なら連想配列だろうなあ
データ入力時に連想セットできたりするかね

334:328
09/10/16 22:37:34
回答ありがとうございます。

フォルダ内にYYMMDD.xlsというファイルが複数あり、それをソートして
格納してある配列があります。
コンボボックスから2つのファイルを選択したらその期間内のファイルに
対して処理を行うことが目的です。

インデックス番号を取得してFor〜Nextの初期値と最終値にしたか
ったので質問させていただきました。

対象ファイル数は100以下です。
後のメンテを考え、素直に全数比較して新たな配列に格納する
方法で対応してみます。

ありがとうございました。

335:デフォルトの名無しさん
09/10/17 08:07:18
>>334
要素数が65536以下ならWorksheetFunction.Matchが使える。
この関数でバイナリサーチも出来るが、要素数が65536も超える場合も考慮するなら自前の関数書いた方がいいな。
要素数がたった100以下ならバイナリサーチじゃなくても無問題だけどな。



336:325
09/10/17 10:22:18
>>326
D&D相当の作業、是非教えて頂きたいです。

>>327
ショートカットアイコンは通常のフォルダアイコンに地球の絵が描かれています。
FileCopyで試すと「パス名が無効です」
FS.CopyFileで試すと「ネットワークパス見つかりません」とエラーが出ます。
パス名は"\\サーバ名\フォルダ"」と間違いないと思うのですが・・・・

337:327
09/10/17 11:16:11
>>336
「パス名が無効です」 だと共有フォルダ名が間違っている可能性があるけど
確認した?
エクスプローラでそのサーバーが見えるなら パス名確認した方が良いかも

FileCopyは
 FileCopy "c:\temp\test.txt", "\\サーバ名\共有フォルダ名\test.txt
 FileCopy "c:\temp\test.txt", "\\サーバ名\共有フォルダ名\フォルダ名\test.txt
とかでいいはすなんだけど

サーバー系は、ここ数年やってないんで最新バージョンなんかで仕様が変わっていたら
お手上げですが....

338:337
09/10/17 11:19:58
あっチョット訂正

FileCopyの構文で 最後の " が抜けてた
 FileCopy "c:\temp\test.txt", "\\サーバ名\共有フォルダ名\test.txt"
 FileCopy "c:\temp\test.txt", "\\サーバ名\共有フォルダ名\フォルダ名\test.txt"
です
失礼しました (^^汗

339:325
09/10/17 14:59:31
>>337-338
パス名は何回も確認しました。プロパティーからコピペしたので間違えてないはずなんですが。
エクスプローラーのプロパティではパス名「http://サーバ名/フォルダ名」なんで、
「http:」外して/を\に変えたんですけど、根本的に間違ってるんでしょうか。

あと、補足ですがサーバはSharePointのワークグループです。



340:327
09/10/17 15:16:03
>>339
プロトコルがhttpなら
>>337の方法は使えないね

341:デフォルトの名無しさん
09/10/17 17:01:58
createobject("shell.application").namespace("http://サーバ名/フォルダ名").copyhere "c:\temp\test.txt"

342:325
09/10/17 17:12:19
>>340
やっぱそうなんですね。
xlsやSLK形式のデータはVBAで上書き保存出来たので、試行錯誤してみたんですが残念です。

>>341
ありがとうございます。試してみた所エラーは出ませんでしたが、コピー出来ていませんでした。
どこか違う所にコピーされたんでしょうかね(゚ー゚;Aアセアセ

343:デフォルトの名無しさん
09/10/17 17:35:43
CreateObject("WScript.Network").MapNetworkDrive "Z:", "http://サーバ名/フォルダ名"
FileCopy "c:\temp\test.txt", "z:\test.txt"

344:デフォルトの名無しさん
09/10/17 17:43:22
>>341
非同期なのかも
msgbox "ちょいと待つ"

345:デフォルトの名無しさん
09/10/17 17:50:48
>>339
sharepointはブラウザ上でみるとhttp://〜のリンクだけど、実際はWEBDAVでやりとりしてるよ。
http://〜のアドレスをコピペして、新しいブラウザに入力してファイルを開いてみ?
読み取り専用になるから。
対して、\\鯖名\〜だと読み書きできる。
「webdav vba」 で検索すると幸せになれるかも

346:デフォルトの名無しさん
09/10/18 11:54:53
excel2007です

vbaに登録されている(?)errの一覧を知る方法は無いでしょうか?

ループ内でロジックエラーが発生した時にerrに数値を設定してexitさせようと思ってるのですけど
その時にExcelに既に定義されているのとぶつかったら不味いかなと思いまして。


347:346
09/10/18 12:04:34
自己解決

Raise メソッドに
Visual Basic のエラー (Visual Basic の組み込みのエラーとユーザー定義エラー)
は、0 〜 65535 の範囲の値です。0 〜 512 の値はシステム エラー用に予約されてい
るため、ユーザー定義のエラーに使用できるのは、513 〜 65535 の範囲の値です。
クラス モジュール内で独自のエラー番号を設定するときには、エラー番号を定数
vbObjectError に追加します。たとえば、エラー番号 1050 を発生させるには、名前
付き引数 Number に vbObjectError + 513 を割り当てます。

とありました。スレ汚しすんません

348:デフォルトの名無しさん
09/10/18 21:13:43
VBA初めて作る初心者です。 土日をほぼ丸で使っても解決できませんでした。誰か助けてください。もしくは土日を返してくれ・・・。

目的 あるURLをIEで開き、全てを選択してエクセルに貼り付ける。



Sub ie_test_ExecWB()

Dim objIE As Object

Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True
objIE.Navigate "URLリンク(google.com)"

Do While objIE.Busy = True
DoEvents
Loop

objIE.SendKeys "^a"
objIE.SendKeys "^c"


Range("A1").Select
ActiveSheet.PasteSpecial Format:="HTML"

End Sub

実行すると、
実行時エラー’-2147417848(80010108)':オートメーションエラーです。
起動されたオブジェクトはクライアントから切断されました。
と表示されます。 objIE.SendKeys "^a"objIE.SendKeys "^c"
ではなく、objIE.ExecWB 17, 0 objIE.ExecWB 12, 0でもダメでした。

349:デフォルトの名無しさん
09/10/18 21:33:33
ほれ土日だよ

350:デフォルトの名無しさん
09/10/18 21:36:25
>>348
IEオブジェクトに SendKeys メソッドはないんじゃないの?
そんなことをしなくても、指定のページが開いたら

objIE.document.body.innerText

とすることで現在表示中のページのテキストを文字列として取得できる

351:デフォルトの名無しさん
09/10/18 21:44:59
メッセージからすると
Do While objIE.Busy = True
でエラーになってて開けないんだろ

352:デフォルトの名無しさん
09/10/18 22:03:22
>>348
ほい

Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hWnd As Long) As Long

Sub ie_test_ExecWB()
  Dim objIE As Object
  Set objIE = CreateObject("InternetExplorer.application")
  objIE.Visible = True
  objIE.Navigate "URLリンク(google.com)"
  Do While objIE.Busy = True
    DoEvents
  Loop

  If SetForegroundWindow(objIE.hWnd) Then
    SendKeys "+{TAB}^a^c", True
  End If
  Set objIE = Nothing

  Range("A1").Select
  ActiveSheet.PasteSpecial Format:="HTML"
End Sub

353:デフォルトの名無しさん
09/10/18 22:03:35
>>348
ではあなたの月火をわたしにください
そうすればあなたに土日をさしあげましょう


354:デフォルトの名無しさん
09/10/18 22:17:16
月火だよー
火憐だぜ

355:348
09/10/18 22:21:19
>>350~352

神々・・・!
ありがとうございます。

現在>>352様が提供してくださったコードで試していますがうまくいきません。
実行するとクリップボードにあるものがA1に貼り付けられてしまいます。

IEが起動するときに、googleのサイトと空のIEが二つ起動してしまうのですが
これが原因なのでしょうか?

ちなみにVISTA,IE7,officeXPという環境です。


>>353
わかりました。
私のカレンダーから月火を捕まえる為の縄を下さい。

356:デフォルトの名無しさん
09/10/18 22:21:22
>>352
>ほい
だってw

357:デフォルトの名無しさん
09/10/18 22:22:58
保護モード Navigateでぐぐれ

358:デフォルトの名無しさん
09/10/18 22:33:05
>>355
わざと後出ししたな

359:デフォルトの名無しさん
09/10/18 22:41:16
Webクエリをマクロで記録は気に食わないのか?
Sub Macro1()
With ActiveSheet.QueryTables.Add(Connection:="URL;URLリンク(www.google.co.jp)", _
Destination:=Range("$A$1"))
.Name = "www.google.co.jp"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.WebSelectionType = xlEntirePage
.WebFormatting = xlWebFormattingNone
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=False
End With
End Sub

360:348
09/10/18 22:41:33
>>356
だめか?

>>357
保護モードを解除したがだめです。

>>358
すまん




361:デフォルトの名無しさん
09/10/18 22:45:47
webbrowserコンポーネント使えば?

362:348
09/10/18 22:48:17
金曜日の夜からVBAを触り始めまして、WEBクエリという単語は何度か目にしましたが
スルーしてました。

これだとテキスト形式での貼り付けになってしまいますね?
ページを丸ごとコピーして(HTML、画像も)貼り付けたいのです。
できるのかな?ちょっとクエリについて勉強してみます。

残り73分で!

363:デフォルトの名無しさん
09/10/18 23:03:06
OSとIEのバージョンを後出しされてしまったでござるの巻


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4162日前に更新/218 KB
担当:undef