09/09/30 12:25:04
過去スレ
01 スレリンク(tech板)
02 スレリンク(tech板)
03 スレリンク(tech板)
04 スレリンク(tech板)
05 スレリンク(tech板)
06 スレリンク(tech板)
07 スレリンク(tech板)
08 スレリンク(tech板)
09 スレリンク(tech板)
10 スレリンク(tech板)
11 スレリンク(tech板)
12 スレリンク(tech板)
2:デフォルトの名無しさん
09/09/30 13:09:23
ExcelのVBAに関する質問スレです
前スレ スレリンク(tech板)
★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。
★2 ExcelのVBA以外の部分に関する質問はNGです。
但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。
★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。
VBAとは、『Visual Basic for Application』の略で
Application
├Workbooks
|└Workbook
| ├Worksheets
| |└Worksheet
というApplication以下のオブジェクトを、VB言語で操作するものを指します。
例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。
★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)
3:デフォルトの名無しさん
09/09/30 13:12:29
いちおつ。
前スレ
Sleep 1
の1はミリ秒だから、1秒なら1000を指定ね。
4:デフォルトの名無しさん
09/09/30 17:22:10
2003のExcelで作成したVBAが出向先の2007のExcelでは期待した動作をしませんでした。
どのようにコードを書き直せばよいのでしょうか教えてください。
XPsp3におけるIE8ブラウザにおいてinput=file型のフォームにファイル名を入力するものです。
以下コードです。
Sub PageUpCSV(objIE As Object)
With objIE
.Visible = True
'fileの入力 form name =CSVFile
.Document.all.CSVFile.Select 'ファイル入力窓を開く
Application.SendKeys " C:\test.txt ", True 'ダイアログにファイル名を送信
'Application.SendKeys "%o", True 'ALT+oを送信=ダイアログの開くをクリック
'
.
. その他処理
.
End With
End Sub
2007だとどうしてもC:\test.txtがダイアログに記入されません。空白のままです。
初めての2ch書き込みで失礼があるかもしれませんが、どうかお力を貸してください
5:デフォルトの名無しさん
09/09/30 18:04:28
>>4
OSとIEのバージョンは、どっちの環境でもXP SP3にIE8で同じ?
6:デフォルトの名無しさん
09/09/30 18:15:07
>>5
はい,どちらもXP SP3 IE8です。
7:デフォルトの名無しさん
09/09/30 18:26:52
>>6
キー入力の前に、ちゃんとページの表示が完了するまで待つようになってる?
8:デフォルトの名無しさん
09/09/30 18:42:46
そのつもりです。 表示完了の問題かと思い、
Sub WAIT(myTime As Single)
Dim TSTART As Single
TSTART = Timer
Do
DoEvents
Loop Until TSTART + myTime < Timer
End Sub
や
Do While .Busy = True And .ReadyState <> 4
DoEvents
Loop
をダイアログが開く前後に入れて色々チェックをしてみたのですが開いたダイアログにはカーソルが行くだけで値が入りません。
値が入ってから消えているわけではないようです。
9:デフォルトの名無しさん
09/09/30 19:42:08
手作業ではちゃんとできるのか?
手作業と同じようにやってるのか?
10:デフォルトの名無しさん
09/09/30 19:55:58
>9
手作業ではできますし、手作業同様の指示をだしているつもりです。
ダイアログが開くまでは期待通りの動きをしています。
Select以降にwaitを15秒とってもダイアログには何も記入されません。
11:デフォルトの名無しさん
09/10/01 16:12:31
>>5 >>6 >>9 の方へ
自社で2007をインストールして試したところ、vbaはきちんと動きました。
verの問題ではなかったようです。今のところ何か常駐ソフト等が原因なのではと考えています。
ありがとうございました。
12:デフォルトの名無しさん
09/10/01 20:17:45
OS XP
SOFT EXCEL2007
1つのブックに300近いシートがあり、これを串刺し演算したいです
しかしピボットテーブルを使おうと思っても4シートしか串刺しできません
vbaではとんでもない行数になると思います
こういう場合どうすればいいかヒントを下さい
13:デフォルトの名無しさん
09/10/01 20:26:15
>>12
たとえばシートが300枚あったとして、全シートのセルA1の合計ならこういう式
=SUM(Sheet1:Sheet300!A1)
で一発で求められるけど、それ以外にどういう計算をしたい?
14:デフォルトの名無しさん
09/10/01 21:30:24
>>13
情報は商品番号(100種以上)と数量だけなんですが商品番号がランダムに並んでるんです
串刺ししつつ商品の合計を出したいのです
そんなのできますか?
15:デフォルトの名無しさん
09/10/01 21:50:36
【1 OSの種類 .】 Windows XP P
【2 Excelのバージョン 】 Excel2003
【3 VBAが使えるか .】 勉強中
【4 VBAでの回答の可否】 可 よろしくお願いします。
VBAで
= Application.WorksheetFunction.Average(Worksheets("sheet1").Range(Cells(1, 3), Cells(10, 3)))
のように average でC1からC10まで求めるやり方ははかりました、
A3、A6、A9、A12 「Cells(1,h*3)」 のような飛び飛びのセルを
average したいのですがどのようにすればよいですか?
教えてください。よろしくお願いします。
16:デフォルトの名無しさん
09/10/01 21:52:18
作業列使うとか条件式使うとかわずらわしくなるけど出来ないこともない
現状の体裁を変えないならVBAでも変数に格納するなり
出来ることは出来る
17:デフォルトの名無しさん
09/10/01 22:00:37
>>14
複数のシートタブをShiftを押しながら指定する方法だと4枚までしか集計できない。
それじゃなくて、ピボットテーブルウィザードから「範囲の追加」を使えば
300枚のシートに別れたデータをいっぺんに集計できるようにはなる。
URLリンク(office.microsoft.com)
けど、入力にめっちゃ手間がかかる。
VBAでピボットテーブルを作るのが早いと思う。
18:デフォルトの名無しさん
09/10/01 22:25:37
>>17
ありがとうございます
頑張ってみます。
19:デフォルトの名無しさん
09/10/02 00:03:19
WindowsXP Excel2000
Sheet1に列固定、行不定の約10000行ほどのデータを加工して
Sheet2に表示させたいのですが、馬鹿正直にfor文とかでまわして
セルに格納していってたら、処理速度がえらいことになりました。
非表示や再計算を手動化等やってみたのですが、やはりまだまだ遅いです。
何か良い案は無いでしょうか?よろしくお願いいたします。
20:デフォルトの名無しさん
09/10/02 00:09:01
セル格納は配列が協力
配列(myRow,0) とか作って、
range("B1:B" & myRow) = 配列 ←配列(,)じゃ無くて括弧なしの「配列」
で超高速
21:デフォルトの名無しさん
09/10/02 00:14:40
>>20様
ご教示ありがとうございます。
カッコ無しの配列ですね。試してみます!
22:デフォルトの名無しさん
09/10/02 00:27:58
for myRow = 0 to 行 -1
配列(myRow,0) = cells(myRow,2) ' 配列にB列のセルを格納
next
こうやって格納した後にだな、いちおう
23:デフォルトの名無しさん
09/10/02 02:12:29
>>20,22様
処理速度を10分の1程度まで落とすことができました!
あとはデータ加工部分での処理等をもっと軽くできないかやってみます。
アドバイス、ありがとうございました。
24:デフォルトの名無しさん
09/10/02 04:46:07
>>22
全然違う。
セル2個以上の範囲のValueプロパティは2次元配列なので、それをVariant型変数に格納してからアクセスすればよい。
25:19
09/10/02 06:46:59
>>24
私が現在行っている方法で問題がある場所があればご指摘ください。※重要な場所のみ記載します
Dim C() As Variant
Dim output As Variant
'データ行数の確認
myRow = 1
Do While Sheets(1).Cells(myRow, 1) <> ""
myRow = myRow + 1
Loop
’配列サイズの確定
ReDim C(datasize - 1, 56)
'データ加工(実際はもっと色々やっています)
For i = 1 To myRow '行
For j = 1 To 10 '列
Select Case j
Case 1 To 5
output = Sheet(1).Cells(i, j)
Case 6 To 10
work = Sheet(1).Cells(i, j)
output = Sheets(2).Cells(work + 2, 3)
End Select
C(i - 1, j - 1) = output
Next j
Next i
'加工完了。データをセルに格納
Sheets(3).Range("B5:B" & myRow, "J5:J" & myRow) = C
26:デフォルトの名無しさん
09/10/02 06:49:58
ReDim C(datasize - 1, 56)は
この例ではReDim C(myRow - 1, 10)の間違いでした。失礼しました。
27:デフォルトの名無しさん
09/10/02 07:45:50
最近質問や回答がまともなのが多いな。
いいことだ。
28:デフォルトの名無しさん
09/10/02 08:46:13
Yahooオークションの入札履歴から
落札者と入札額の取得をしエクセルのセルに書き込もうと考えています。
WEBクエリを使ったところ 何回か動かすと
真っ白い画面になって まったく取得できなくなります。
試しにIEなどブラウザで開いてみると 特に問題なくページを開くことができます。
真っ白にならないいい方法はありますでしょうか・・・?
OSは XP でIE8 Office2007
と Vista IE8 Office2007
を使用しています。
29:デフォルトの名無しさん
09/10/02 08:47:55
取得部分を抜粋します。
AuctionPageID = "URLリンク(page.auctions.yahoo.co.jp)" & ActiveCell.Offset(0, 1).Text
Workbooks.Add
page = pageID
With ActiveSheet.QueryTables.Add(Connection:="URL;" + AuctionPageID, Destination:=Range("A1"))
.Name = "..."
.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
どうぞよろしくお願い致します。
30:デフォルトの名無しさん
09/10/02 17:59:53
HPが開けないトラブルって言うのは大抵がデータを読み込む前に処理を行うからなんだけど
5秒くらい待機したら問題ないことがある
31:デフォルトの名無しさん
09/10/02 19:06:29
全くの素人ならExcel vbaとACCESSvbaのどちらが取っ付きやすいですか?
32:デフォルトの名無しさん
09/10/02 19:12:54
EXCEL
ACCはレコードアクセスが基本になる上、ADOだとか使う必要がある
33:デフォルトの名無しさん
09/10/02 21:22:43
こんばんは。質問です。よろしくお願いします。
エクセル2003です。VBA
VBAで、
A1:A100 で "月" と表示のあるもの かつ
range(cells(10,h*3),cells(100,h*3)) で0より大きいものを
平均したいのですが、、、
sub k()
if If Range("A1:A100") = "月" Then
この先がわかりません。教えてください。お願いします。
”~かつ~”のVBAでの表現法がわかりません。
34:デフォルトの名無しさん
09/10/02 21:49:53
数式でもいいの?
それともVBAを使うことが目的なの?
このケースだとかなり基本的なことから説明しなくちゃだから、後者なら大変なんだが
35:デフォルトの名無しさん
09/10/02 22:04:00
>>34
後者です。
VBAでの答えをよろしくお願いします。
説明は大変ということなのでいりません。
VBAの本があるのでそれで調べて見ます。
本当に知りたいのはVBAで、
IFで真のときにさらにもう一回IFで違う条件でかける方法です。
36:デフォルトの名無しさん
09/10/02 22:16:58
>>33
「”~かつ~”のVBAでの表現法」とのことですので、下のサンプルを参考にしてください。
Sub msgTest()
' セルA1に「メッセージ」かつ、B1に「表示する」と入力されている場合にメッセージ表示。
If (Cells(1, 1).Value = "メッセージ") And (Cells(1, 2).Value = "表示する") Then
MsgBox "2条件とも満たしている"
End If
End Sub
37:デフォルトの名無しさん
09/10/02 22:43:04
>>35
演算子で繋いでも良いけど、ネスティングで良いと思うよ。
if a = 1 then
if b = 1 then
if c = 1 then
msgbox "aaa"
end if
end if
end if
38:デフォルトの名無しさん
09/10/02 23:27:12
>33
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。
丸投げならEXCEL相談室へどうぞ
その前に、CELLSの使い方の再確認を
URLリンク(www.happy2-island.com)
39:デフォルトの名無しさん
09/10/03 00:50:56
ヘルプの使い方をテンプレに入れたらdat落ちだな
40:デフォルトの名無しさん
09/10/03 03:04:59
>>37
演算子でつなげるものと同じ意味のIfネストは、なんだか格好悪いよね。
41:デフォルトの名無しさん
09/10/03 03:06:40
VBAって短絡評価が無いからIfネストの方がパフォーマンスが良かったりうんぬん
42:デフォルトの名無しさん
09/10/03 07:50:07
>>36
>>37
ありがとうございました。
43:デフォルトの名無しさん
09/10/03 08:49:12
コードが冗長になってくると、一括判定が必要な演算子連結よりもネスト構造のほうが優れているとかなんとか
44:デフォルトの名無しさん
09/10/03 10:29:10
Ifネストは行単位で追加や削除ができるから改変しやすい
条件を外したいときは先頭に ' 入れてコメントにすればいいだけだし、
動作テストで条件を変えて試したい時とかよく使う
45:デフォルトの名無しさん
09/10/03 11:18:50
And使うのは俺的にはIfのネストより不細工だと思うけど、人によっては綺麗だと感じる人いるみたいね。
そういえばAndじゃなくOr判定で以前、
Select Case i Mod 10
Case 1 ,6 ,7
'処理
と
j = i Mod 10
If j = 1 Or j = 6 Or j =7 Then
'処理
この二者の比較で後者が速いというやついたのでかみついたことがあるが、その後Core 2 Duoのパソコンで試したら
たしかに彼が言うように条件が3個のときはOrが速かった。
ただし条件が4個以上は短絡評価のSelect Caseが速いようだけど。
一昔前のパソコンなら条件が3個でもSelect Caseが速いんだけどな。
46:デフォルトの名無しさん
09/10/03 11:38:11
>>45
どのくら速かった?
47:デフォルトの名無しさん
09/10/03 12:28:15
ま~た、速度厨か
48:デフォルトの名無しさん
09/10/03 12:53:42
ショートサーキットがあればねぇ。
あとVBAって、右辺だけの演算子結合出来ないよね?確か。
if a=1 or a=2 or a=3 then
だよね、確か。
if a=1 or 2 or 3 then
でエラー吐き出して、最初のころ原因が分からなくて相当悩んだ記憶が。
49:デフォルトの名無しさん
09/10/03 13:54:45
馬鹿?
50:デフォルトの名無しさん
09/10/03 14:48:26
Sub MonthChk(Month as Integer)
If 0 < Month <=12 then
Debug.Print Month
Else
Debug.Print False
End If
End Sub
51:デフォルトの名無しさん
09/10/03 16:41:50
>>48
>if a=1 or 2 or 3 then
>でエラー吐き出して、最初のころ原因が分からなくて相当悩んだ記憶が。
本当にエラー吐いたの?、その条件だとa=1が真でも偽でも2と3が真だから
必ず真になってエラーにはならないと思うけど・・・
52:デフォルトの名無しさん
09/10/03 17:46:54
文法くらい作法に従って書けよ
それで動くと思ってるのは他の言語も経験したことないんだろ?
クラス継承ができないとか、ポインタ使えないとか範囲コメントできないとかならともかく・・・
53:デフォルトの名無しさん
09/10/03 19:57:28
いや、コード書いてシステム動かすのが前提なんだから、ある程度速度を求めるのは当然だろう
速度厨とか何を言ってるんだ
54:デフォルトの名無しさん
09/10/03 19:59:36
VB.NETにはショートサーキットする演算子が追加されてるから、そのうちVBAにも追加されるかもしれん
個人的にはショートサーキットの有無で結果の変わるようなコーディングは避けるべきだと思う
>>51
俺は>48ではないが
昔のVBAだと確かエラーになってた気がするんだが
今エクセルの2007で試したらエラーにならないな
まあ、>48が思ってる通りには評価されてないんだが
55:デフォルトの名無しさん
09/10/03 21:09:02
よろしくお願いします。この場合XLSM形式で保存する場合はどこに&”.xlsm”を書き足したらいいのですか?
If tmpSheet.Range("B" & r).Value <> tmpSheet.Range("B" & r + 1).Value Then '次のB列の値が違っていたら
book.SaveAs dataFolder & "\" & tmpSheet.Range("B" & r).Value '集計ブックを作業シートのB列の値(シート名)で保存
book.Close False '集計ブックを閉じる
isOpen = False '集計ブックが開いているかフラグを閉じているにする
End If
56:デフォルトの名無しさん
09/10/03 21:47:02
マクロの記録、がためになるよ
57:デフォルトの名無しさん
09/10/04 06:15:54
Office 2010から、VBA.netにならないんですか?
58:デフォルトの名無しさん
09/10/04 06:27:10
>>55
If tmpSheet.Range("B" & r).Value <> tmpSheet.Range("B" & r + 1).Value Then '次のB列の値が違っていたら
book.SaveAs dataFolder & "\" & tmpSheet.Range("B" & r).Value & ".xlsm", '集計ブックを作業シートのB列の値(シート名)で保存
book.Close False '集計ブックを閉じる
isOpen = False '集計ブックが開いているかフラグを閉じているにする
End If
59:デフォルトの名無しさん
09/10/04 09:29:33
XP&2003です。
フォーム上のテキストボックスの数を数えるには、
どのようにすればよいでしょうか。
Controlsの引数は"名前"と"番号"なので種類が指定できないし、
GettypeはVBAでは使えないようで悩んでいます。
60:デフォルトの名無しさん
09/10/04 11:31:23
>>59
TypeName 使ってみてはどうですか
61:59
09/10/04 13:45:27
>>60
できましたぁぁぁぁぁぁ
ありがとうございましたぁぁぁぁぁ!!!
62:デフォルトの名無しさん
09/10/04 21:10:56
こんばんは。
VBAを始めたばかりで、全然わからないので、
ここで質問させてください!!
A列に"リンゴ"と書かれたセルがあれば、
そのセルと隣のセルを切り取って、貼り付け用のセルに貼り付ける。
なければ、何もしないという構文を書きたいんです。
IF is nothingを使うのかなぁと思ったのですが、
どこに入れればいいのかわからなかったので。。。
ちなみに、貼り付け用のセルに貼り付けた後、
空白になったそのセルを切り取るっていう構文も入れて、
その時に、IFを使っています。
以下に構文を記載しますので、どうしたらいいか教えてください!
よろしくお願いいたします!!!!!
Dim myLastLow as Long
Dim i as Long
Columns(1).Find("りんご").Resize(, 2).Cut Sheets("Sheets1").Columns(1).Find("貼り付け用")
myLastLow = Range("A30").End(xlUp).Row
For i = myLastLow To 1 Step -1
If Cells(i, 1).Value = "" Then
Range("A" & i & ":B" & i).Delete shift:=xlShiftUp
End If
Next i
63:デフォルトの名無しさん
09/10/04 21:26:33
forで上から順番に判定させるのが分かりやすいと思うよ。
for i = 1 to cells(65536,1).end(xlup).row
if cells(i,1).value = "りんご" then
'コピペ処理
end if
next
64:デフォルトの名無しさん
09/10/04 22:31:45
>63さん
ありがとうございます!!
早速やってみたんですが、
「プロシージャの呼び出し、または引数が不正です」とエラーが
出てしまいました。。。
なぜでしょう。。。
Columns(1).Find("りんご")…
というところでエラーが出てるっぽいです。
65:デフォルトの名無しさん
09/10/04 22:52:55
>>62
Columns(1).Find("りんご").Resize(, 2).Cut Sheets("Sheets1").Columns(1).Find("貼り付け用")
この構文だとA列に"りんご"と記入されたセルが存在しないと実行時エラーになるよ
あとシートは指定した方がいいとおもうよ
Set A = Sheets("Sheet2").Columns(1).Find("りんご")
If Not A Is Nothing Then
Set A = A.Resize(, 2)
A.Cut Sheets("Sheets1").Columns(1).Find("貼り付け用")
End If
上記例でも"Sheets1"のA列に"貼り付け用"と記入されたセルが存在しないと実行時エラー
になると思うけど例を参考にがんばってみてください。
あと >>64で出てるえらーって
"Sheets1"のA列に"貼り付け用"と記入されたセルが存在しないんじゃないの
66:デフォルトの名無しさん
09/10/04 22:59:56
>>65
解決しました!!65さんの言っているとおりでした!
すいません。私が書いてなかったのが悪かったんですが、
"貼り付け用"というセルは表の一番下にあるんです。
一度"りんご"のセルがあって、実行されちゃうと、
もう"貼り付け用"というセルがなくなってしまうことが原因でした!
なので、Forを一番下から上にあがるような構文を書いたら
エラーが出なくなりました!
ありがとうございました!!
67:デフォルトの名無しさん
09/10/04 23:15:00
62です。
もう一つ教えてもらってもいいですか?
もし"りんご"というセルがなかったら、
"貼り付け用"と書かれたセルとその隣のセルを削除したいのですが、
どのように書けばいいですか?
elseを使うんだろうなぁと思って、
Else
Columns(1).Find("貼り付け用").Resize(, 2).Delete shift:=xlShiftUp
を入れてみたんですが、エラーになっちゃいました。。。
お時間があれば教えてください!よろしくお願いします。
68:デフォルトの名無しさん
09/10/04 23:19:19
あとは自力で頑張れよ・・・
69:デフォルトの名無しさん
09/10/05 00:11:51
そんなこといわずにもう一息っ!
70:デフォルトの名無しさん
09/10/05 00:19:37
俺はfindの時にはsetを使ってるんだけど、説明するのも大変そうだなぁ・・・。
見つかりませんってエラーが出るんだから、on error goto で飛ばしたら?
71:デフォルトの名無しさん
09/10/05 00:56:27
>>67
> Columns(1).Find("貼り付け用").Resize(, 2).Delete shift:=xlShiftUp
上の1行だけ試しに実行させたら正常に動いたので、
If~Else~End Ifの構文が正しく書けていない気がします。下はサンプル。
Set A = Sheets("Sheet1").Columns(1).Find("りんご")
Set B = Sheets("Sheet1").Columns(1).Find("貼り付け用")
'-- 「B is Nothing」な場合の処理は割愛
If A Is Nothing Then
B.Resize(, 2).Delete shift:=xlShiftUp
Else
Set A = A.Resize(, 2)
A.Cut B
End If
72:デフォルトの名無しさん
09/10/05 01:10:09
>>54
エクセル97で試したけどエラーにならないな
VBなら言語仕様的にはエラーになどならないはずだがな、間違った演算してるわけじゃないしな
a=1が真の場合は分り易く8ビットで表現すると11111111となる
次に11111111と00000010(十進数の2)をor演算すると11111111となる、
次に11111111と00000011(十進数の3)をor演算すると11111111となり、
すべて演算した結果は真となり、エラーにはならない
a=1が偽の場合は分り易く8ビットで表現すると00000000となる
次に00000000と00000010(十進数の2)をor演算すると00000010となる、
次に00000010と00000011(十進数の3)をor演算すると00000011となり、
すべて演算した結果は真となり、エラーにはならない
よってif a=1 or 2 or 3 thenの条件式は必ず真になるでしょ
73:デフォルトの名無しさん
09/10/05 01:26:21
最初の設計がだめなんじゃないの?
りんごが無かったら削除するんじゃなくて
りんごがあったら追加する仕様の方がいい希ガス
74:デフォルトの名無しさん
09/10/05 01:30:23
?a=1 or 2 or 3
3
3と計算されるね
75:デフォルトの名無しさん
09/10/05 02:06:50
え?
76:デフォルトの名無しさん
09/10/05 03:18:19
λ
77:デフォルトの名無しさん
09/10/05 11:59:57
>>74
Dim a
a = 1
MsgBox a = 1 Or 2 Or 3
これ、たしか最初は3になったはずだが、今は-1にしかならん。
おれの記憶違いかな?
それにしても
MsgBox 1 Or 2 Or 3 Or 4
これが7になるのはどうして?
78:77
09/10/05 12:04:44
自己レスだが7になる理由は分った。
79:デフォルトの名無しさん
09/10/05 12:44:27
>>36はプログラマとして優秀さを感じるな
>>38は人の程度が知れる
80:デフォルトの名無しさん
09/10/05 13:11:30
(;゚д゚)ァ
81:デフォルトの名無しさん
09/10/05 14:19:24
>>77
とりあえず And、Or、Xor は論理演算子じゃなくてビット演算子だと覚えておけ
a が 1 じゃない時
a = 1 Or 2 Or 3 ⇒ False Or 1 Or 2 Or 3 ⇒ 00000000 Or 00000001 Or 00000010 Or 00000011 ⇒ 00000011 ⇒ 3
a が 1 の時
a = 1 Or 2 Or 3 ⇒ True Or 1 Or 2 Or 3 ⇒ 11111111 Or 00000001 Or 00000010 Or 00000011 ⇒ 11111111 ⇒ -1
1 Or 2 Or 3 Or 4 ⇒ 00000001 Or 00000010 Or 00000011 Or 00000100 ⇒ 00000111 ⇒ 7
82:デフォルトの名無しさん
09/10/05 16:16:05
>>81
>>78書いた時点で分ってるよ。
83:デフォルトの名無しさん
09/10/05 16:39:52
>>81
a が 1 じゃない時
×a = 1 Or 2 Or 3 ⇒ False Or 1 Or 2 Or 3 ⇒ 00000000 Or 00000001 Or 00000010 Or 00000011 ⇒ 00000011 ⇒ 3
○a = 1 Or 2 Or 3 ⇒ False Or 2 Or 3 ⇒ 00000000 Or 00000010 Or 00000011 ⇒ 00000011 ⇒ 3
a が 1 の時
×a = 1 Or 2 Or 3 ⇒ True Or 1 Or 2 Or 3 ⇒ 11111111 Or 00000001 Or 00000010 Or 00000011 ⇒ 11111111 ⇒ -1
○a = 1 Or 2 Or 3 ⇒ True Or 2 Or 3 ⇒ 11111111 Or 00000010 Or 00000011 ⇒ 11111111 ⇒ -1
=演算子はOr演算子よりも優先順位が高いのでa = 1が演算されたあとにOrの演算が行われる
84:デフォルトの名無しさん
09/10/05 17:23:56
>>81
こまったことに2007のエクセルのヘルプには論理演算子と書いてあるんだがな
実際は論理演算も算術演算も区別がない。全部算術演算してる
問題の本質は、算術演算か論理演算かじゃなくて、型の優先順位の問題
Orで型が一致しない場合、booleanより他の型の方が優先順位が高い
おそらくこの式ならIntegerで値が帰っている
もしbooleanの方が優先順位が高ければ、2と3がbooleanに変換されるので
a = 1 Or 2 Or 3 ⇒ a = 1 Or True Or True ⇒ True
True=-1なので、常に-1が帰るはず
型がいい加減な言語の弊害だな
85:デフォルトの名無しさん
09/10/05 17:45:45
ビット演算の便利な使い方のケースってどんなものある?
86:デフォルトの名無しさん
09/10/05 17:52:54
>>85
一般論で言えばBoolean型の配列よりはビット演算の方がメモリが節約できてキャッシュの使用効率が上がるし
条件判断も高速になる。
可読性は落ちるけど昔からよく使われる手法だから、知ってないと人のソースが読めなかったりする。
87:デフォルトの名無しさん
09/10/05 19:49:26
vbsの質問ってここでいいですか?
88:デフォルトの名無しさん
09/10/05 20:24:16
vbaから呼ぶならある程度は良いと思うけど。個人的に。
89:デフォルトの名無しさん
09/10/05 20:31:15
vbaとあまり関係ないので別スレで質問してみます
90:デフォルトの名無しさん
09/10/05 20:31:50
>まぁ今時はコンパイラが大分やってくれるから高級言語ならあまり関係ないけど
組込とかで機械語表記するときゃ今でも普通に使うよ
ハードに近づけば近づくほど限界性能を引き出せるけど分かりにくくなる
とりあえずVBAって時点で、変な表記はせずに可読性に特化したコードを書くべきだと思う
91:デフォルトの名無しさん
09/10/05 20:38:55
速度厨はその辺が気に食わないみたいで
92:デフォルトの名無しさん
09/10/05 20:43:24
VBAに速度求めてもな。
手作業の自動化くらいに使ってりゃいいんだよ。自分でやるより早いだろ。
93:デフォルトの名無しさん
09/10/05 21:02:07
>>85
ハード叩くときの設定なんかで使う
#ドライバー作る時なんかに必要なときがある(あまりいないと思うけど)
94:デフォルトの名無しさん
09/10/05 21:19:46
VBAでドライバ作るやつはいないだろ
VBAでビット演算を使って便利なケースを語れ
95:デフォルトの名無しさん
09/10/05 21:23:14
ビット演算の宿題が出たとき
96:デフォルトの名無しさん
09/10/05 21:35:17
>>94
フォームやシート上にcheckboxが多数ある場合のON/OFF判定とかは?
97:デフォルトの名無しさん
09/10/06 02:16:02
それにしても SQL に bit 演算ないのは理不尽だよなぁ
98:デフォルトの名無しさん
09/10/06 02:24:59
んなこたない
99:デフォルトの名無しさん
09/10/06 02:40:06
あるの?
100:デフォルトの名無しさん
09/10/06 06:53:07
奇数かどうかを判定するのにビット演算使ってみたが12%しか速くならんね。
If i Mod 2 = 1 Then
と
If i And 1 Then
偶数かどうかを比較したらビット演算が45%速かった。
If i Mod 2 = 0 Then
と
If i And 0 Then
101:100
09/10/06 06:58:23
すまん、偶数かどうかの比較はまちがってるな。
102:デフォルトの名無しさん
09/10/06 07:11:08
ちなみに偶数かどうかは
If j And 1 = 0 Then
103:デフォルトの名無しさん
09/10/06 07:34:47
If not (i And 1) Then
104:デフォルトの名無しさん
09/10/06 07:50:32
>>103
それも書こうと思ったが、たしかにその方が少し速いね。
105:デフォルトの名無しさん
09/10/06 07:51:33
背伸びしてビット演算するレベルじゃないな。
106:デフォルトの名無しさん
09/10/06 07:54:49
ループの回数を多くして計りなおしたら>>102の方が速かったわ。
107:デフォルトの名無しさん
09/10/06 07:56:12
その程度は普通はMod使うよなぁ。
108:デフォルトの名無しさん
09/10/06 08:02:23
WorksheetFunction.IsEvenを使う俺様は最強
じゃねーな。最低だ。
109:デフォルトの名無しさん
09/10/06 08:15:34
>>108
よく見る似たような最低なものにWorksheetFunction.IsNumberがある。
他にもあったな。
110:デフォルトの名無しさん
09/10/06 08:29:22
質問スレがヲタスレ化してる・・・
111:デフォルトの名無しさん
09/10/06 09:39:21
速度厨はアセンブラでもやっとけ、アフォ
112:デフォルトの名無しさん
09/10/06 09:42:03
>>100
奇数の判定はこれでいいんじゃないか?
If i Mod 2 Then
113:デフォルトの名無しさん
09/10/06 09:45:17
俺は速度をことさら求めない派だが、やたら速度を否定するやつのソースって汚いのが多いよな。
114:デフォルトの名無しさん
09/10/06 09:51:38
>>112
普通はModだが、Andでビット演算で判定すればほんの少し速くなるって話だろ?
115:デフォルトの名無しさん
09/10/06 09:59:37
>>113
お前の美しいソースを見てみたいもんだな。
116:デフォルトの名無しさん
09/10/06 10:07:27
こんにちは。あたしはカウガール。
AAとして成り上がるため、スレを巡る旅をしています。
__
ヽ|__|ノ モォ
||‘‐‘||レ _)_, ―‐ 、
/(Y (ヽ_ /・ ヽ  ̄ヽ
∠_ゝ ` ^ヽ ノ.::::::__( ノヽ
_/ヽ /ヽ ̄ ̄/ヽ
117:デフォルトの名無しさん
09/10/06 10:27:45
>>114
いやそうじゃなくて「= 1」という比較演算が無駄じゃないかって指摘。
このおかげで遅くなってる希ガス
If i Mod 2 = 1 Then
と比較するなら
If i And 1 = 1 Then
とするべきだろうし、
If i And 1 Then
に書き方を合わせるなら
If i Mod 2 Then
と比較しないと不公平じゃないかなーって思った。それだけ。
118:デフォルトの名無しさん
09/10/06 10:35:49
>>117
たしかに公平にやるならそうだよな。
公平にやってもビット演算が少し速いみたいだけど、人に見せるコードならIf i Mod 2 = 1 Then だな。
119:デフォルトの名無しさん
09/10/06 12:31:35
おまえら仕事しろよ
120:デフォルトの名無しさん
09/10/06 19:37:14
速度の事は別スレ建てて、そこでやれ
121:デフォルトの名無しさん
09/10/06 19:50:09
俺はわからなかったよ!
122:デフォルトの名無しさん
09/10/07 02:02:48
お前ら、奇数ってマイナスもありなんだぜ
i Mod 2 = 1 ではマイナスの奇数が判定できない時点で失格
123:デフォルトの名無しさん
09/10/07 03:32:56
何の問題もない
たとえば4bitなら
-1 = 1111
-2 = 1110
-3 = 1101
124:デフォルトの名無しさん
09/10/07 07:11:14
>>123
ー3 mod 2 = 1 になった?
125:デフォルトの名無しさん
09/10/07 07:24:01
yes we can
126:デフォルトの名無しさん
09/10/07 08:52:58
>123
天然w
127:デフォルトの名無しさん
09/10/07 09:11:24
>>122
すみませんねぇ、あいにくマイナス志向じゃないもんでね。
じゃぁIf i Mod 2 <> 0 Thenならあなたのおきにメスでしょうか?
128:デフォルトの名無しさん
09/10/07 09:27:47
ド素人にはよくあることw
129:デフォルトの名無しさん
09/10/07 09:50:25
ちなみに
If i Mod 2 Then
なら負数でも問題ないんだが
130:デフォルトの名無しさん
09/10/07 10:48:04
ー3 mod 2 = 1
が偽になる環境って
ー(3 mod 2) = -1
と解釈されてるんだろ
((ー3) mod 2) = 1
と書けば問題無し
131:デフォルトの名無しさん
09/10/07 11:08:36
>130
天然w
132:デフォルトの名無しさん
09/10/07 11:17:12
Modで盛り上がってるところすみませんが、四捨五入ってVBAに関数ある?
Roundは微妙に違うし。
133:デフォルトの名無しさん
09/10/07 11:24:05
>>132
ない
数式を工夫したり、関数を自作する必要がある
またはWorksheetFunction.Round
134:デフォルトの名無しさん
09/10/07 11:26:43
>>130
キミはまず、とりあえずマイナス記号を入力する方法から勉強しようか
135:デフォルトの名無しさん
09/10/07 11:27:20
は-い(;゚д゚)ァ
136:デフォルトの名無しさん
09/10/07 13:37:07
>>133
一応VBAにもRoundって関数がある
まあ、これ使うと思わぬ結果が出ることもある
自作するなら、基本的には0.5足して切り捨てなんだが
これもマイナスのときどうするか考えると結構じゃまくさい
137:デフォルトの名無しさん
09/10/07 14:13:01
floor
138:デフォルトの名無しさん
09/10/07 15:44:12
>>136
ちゃんと最初から読みなさい
質問者はVBAのRoundではだめなことがわかった上で、どうすればいいか質問してる
VBAのRound関数とワークシート関数のROUNDは機能が異なるのは既知
139:デフォルトの名無しさん
09/10/07 16:17:08
VBAのRoundも立派な四捨五入ですが。
140:デフォルトの名無しさん
09/10/07 16:50:28
URLリンク(q.hatena.ne.jp)
を参考に、ExcelでSELECTを使えるようにしたのですが、うまくいきません。
データベースのテーブルの見出しを変更すると、きちんとした値を返しません。
デフォルトのIDとNAMEでは正常に値を取得できます。
具体的には、
Sheet2を以下のようにして、
| A | B
1 | ID | CATEGORY1
2 | 1 | a
3 | 2 | b
4 | 3 | c
Sheet1のA1に「3」を入れ、
A2に「=execsql("select CATEGORY1 from [Sheet2$] where ID = "&A1」と入力。
A2には値のエラーが返される。
どのあたりが問題でしょうか。
OS:WindowsXP
Excel ver:2003 (11.8307.8221)
141:デフォルトの名無しさん
09/10/07 17:15:52
ExecSQL = rs("NAME").Value
これを変更した?
142:デフォルトの名無しさん
09/10/07 17:19:59
>141
見落としていました。
ありがとうございます。
143:デフォルトの名無しさん
09/10/07 18:14:31
エクセルで指定セル内に文字を入力中、別のセル内にリアルタイムに
バイト数を表示させることはできるのでしょうか。
教えてください、エロい人。
144:デフォルトの名無しさん
09/10/07 18:25:56
>>143
無理
145:デフォルトの名無しさん
09/10/07 18:41:44
すみません。
すごく初歩的なことなんですが、
列が縦でrow、行が横でcolumですよね?
A5だとAが列で5が行ってことになりますよね?
A5セルからA10セルまでをループさせたいときに、
5や10の値の定数をrowみたいな名前で宣言してるのを見たんですが、
これってcolumじゃないんですか??
書籍なので間違いではなさそうなんですが・・・。
A列B列、C列・・・
5行、6行・・・
ですよね?
146:デフォルトの名無しさん
09/10/07 18:50:02
rowが行、colum列
辞書で調べてみ
147:デフォルトの名無しさん
09/10/07 19:12:00
>>139
違うんじゃねーの?
5は捨てたり入れたりだもんな。
Round(1.5)もRound(2.5)も同じだろ?
148:デフォルトの名無しさん
09/10/07 19:29:34
>>145
>>146の方の回答が全てだと思いますが、
下のExcel関数をいくつかのセルで試してみれば、理解しやすいかもしれません。
【関数】
=ROW() :この関数が入力されている行の行番号を調べます。
=COLUMN() :この関数が入力されている列の列番号を調べます。
149:デフォルトの名無しさん
09/10/07 19:31:05
いやでき・・・どうだろ
ループでバインドするなりキーイベントで捕捉するなり
フォームのTxtボックスとかなら普通に出来るけど、k
セル入力中ってどうだっけ
150:デフォルトの名無しさん
09/10/07 20:49:33
Excel2007
正しい言い方が判らないので上手い事伝わるかどうか…なんですけど。
フォーム上にコマンドボタンを縦に5つ貼りつけています。
エンターキーを叩いた時、初期状態では一番上のボタンのマクロが実行され
ますが、これを3番目のボタンのマクロが実行される様に変えたいです。
テキストボックスとかだったらタブオーダーを設定すれば順番を指定できま
すけど、コマンドボタンについて同一フォーム上で最優先のものを指定する
事出来ますか?
151:デフォルトの名無しさん
09/10/07 20:51:48
>>149
セルはテキストボックスか何かを継承してるはずなんで、
ハンドルさえ取得できればなんとかなる可能性はあるけど、
かなり大変じゃないかと思う。
それにバージョンごとに方法が違ってくると思う。
たぶんだけど2007が一番やりやすそうな気がする。
入力途中のキーイベントはVBAには存在しないので
自前でフックする必要がある。
152:デフォルトの名無しさん
09/10/07 20:54:47
>>150
コマンドボタンにもタブオーダーはあるよ
153:デフォルトの名無しさん
09/10/07 20:58:42
>>145
A1セルの場合
A=横=列=Column
1=縦=行=Row
154:150
09/10/07 21:12:30
>>152
プロパティのTabIndexをいじってみたら希望道理になりました。
どうもお騒がせしました m(_ _)m
155:デフォルトの名無しさん
09/10/07 23:40:36
西暦(2000年以降)年を入力したとき、その1年間の祝日の祝日名、月日及び曜日をイミディエイトウインドウに
表示するプログラムで、サブルーチンプロシージャまたは関数プロシージャを3つ利用しなくてはなりません。
ひたすらサイトを検索したのですが、見つかりませんでした。
全く手が出せず、困っています。どなたか教えてください。よろしくお願いします。
156:デフォルトの名無しさん
09/10/08 00:06:09
155です。
Excel2007を使用しています。
157:デフォルトの名無しさん
09/10/08 00:28:45
>>155
検索すると結構、マクロ、祝日関数あるよね
ダウンロードしてそのソースをみて
考えればいんじゃない
解説してるサイトもあった気がする
158:デフォルトの名無しさん
09/10/08 00:32:56
155です。ありがとうございます。
祝日判定や、日にちを入れて表示させるものは
見つかったのですが、祝日名を表示させるものは
ひとつしか見つからず、ダウンロードしても
マクロは見られませんでした…
159:デフォルトの名無しさん
09/10/08 00:38:20
>>155
祝日名を表示させるコードの一例が載っています。
URLリンク(www.h3.dion.ne.jp)
160:デフォルトの名無しさん
09/10/08 00:45:27
先ほど参照していたのですが、
kt関数は使ったことがなく、わかりませんでした…。
161:デフォルトの名無しさん
09/10/08 01:36:09
>>155
質問の意図がちょっとわからんな。
そういう関数を作れっていう宿題なのか、どこかから手に入れたマクロの使い方を知りたいのか。
ちなみにkt関数は肝心の部分がプロテクトかかってて見えないんじゃなかったっけ?
162:デフォルトの名無しさん
09/10/08 13:09:35
全くの初心者の質問なのですが、
URLリンク(www.matsumae.hokkaido-c.ed.jp)
このサイトにある例13の問題の、
ex13 上の例13のプログラムを参考にして,自然数Nを入力したとき,
Nの約数の個数を求めるプログラムを,次の手順で作れ。
変数sを準備し,N以下の自然数で割り切れたとき,sに1を加える。
これのやり方が全くわかりません。
どなたか簡単に教えてくれないでしょうか。
163:デフォルトの名無しさん
09/10/08 13:45:39
>>162
宿題スレにいけ。ぼけ。
Sub test()
Dim inputNum As Integer
Dim count As Integer
Dim divNums As Integer
inputNum = InputBox("整数入力してね")
For count = 1 To inputNum
If inputNum Mod count = 0 Then
divNums = divNums + 1
End If
Next
Debug.Print divNums
End Sub
ちなみにサンプル例が間違えてるからなw
松前高等学校のプログラム担当の先生に言っといて。
164:デフォルトの名無しさん
09/10/08 14:11:18
>>163
ありがとうございます。
165:デフォルトの名無しさん
09/10/08 15:16:46
これか
スレリンク(tech板:115-番)
166:デフォルトの名無しさん
09/10/08 16:01:04
>>143
入力したキーのフックに使えるAPI関数があるにはある
SetWindowsHookEx
恒常ループを設定して
多分出来ないんだろうが
167:デフォルトの名無しさん
09/10/08 16:13:28
>>多分出来ないんだろうが
何しに出てきたんだwww
168:デフォルトの名無しさん
09/10/08 17:13:36
>>167
キー入力のバインドは出来るんだろうが、他のセルに書きながら元セルのアクティブどうするかとか、全角や変換どうするんだとか考えたら難しいかなあと
キー入力関係なく、一定時間ごとにセル内容を参照してってのも、入力を確定してないから無理だろうし
セル入力中のデータを捕捉出来れば或いは
169:デフォルトの名無しさん
09/10/08 18:17:21
155です。
学校で授業でやっていて、「テストまでには出来るようにしておけ」
といわれています。
サブルーチンもまだ1度しか使ったことがなく、
マクロを見て理解するのが精一杯の状態です。
170:デフォルトの名無しさん
09/10/08 18:39:53
課題には剥かないよな
休日と振替は法律で決まってるからアルゴリズムまるぱく出来るが、最近は数年で法律改正されてる
171:デフォルトの名無しさん
09/10/08 19:36:09
頭のおかしな人には気をつけましょう
URLリンク(info.2ch.net)
172:デフォルトの名無しさん
09/10/08 19:40:37
なんだ突然
173:デフォルトの名無しさん
09/10/08 19:49:36
Excel2002で3D積み上げ棒グラフを作る方法を教えてください。
URLリンク(terrapy.sakura.ne.jp)
174:デフォルトの名無しさん
09/10/08 20:14:32
>>169
カレンダー関連の処理は簡単に見えて実はかなり難しい。
はっきり言って初心者には無理。
> プロシージャを3つ利用しなくてはなりません。
てのがひっかかるんだけど、
学校が用意したサブルーチンがあって、それを呼び出せって話じゃないの?
175:デフォルトの名無しさん
09/10/08 23:37:56
サブルーチンも別マクロで自分で作らなければなりません…
176:デフォルトの名無しさん
09/10/08 23:46:19
>>175
自分も初心者には少し荷が重い気がするけど
一度に全てやろうとするよりも
一つずつ片付けた方が良いとおもうよ
祝日に関しては内閣府ページ
URLリンク(www8.cao.go.jp)
が参考になると思うんで
どのような処理が必要かまず検討してみたら?
テーブルに1年分(1/1~12/31)のデータ作成して
それに祝日データを入れていく方法が一番分かり易いんじゃないかな
振替休日の判定とか
休日 平日 休日 → 休日 休日 休日 とする処理とかあるし
177:デフォルトの名無しさん
09/10/09 00:07:41
西暦年を入力→1/1の曜日を求める→出力「元日 1月1日 ○曜日」
→1月第二月曜の日を求める→出力「成人の日 1月○日 月曜日」
…の繰り返しをする、ということしか…
さまざまなサイトに出ている「春分秋分」については、月日は「春分日」「秋分日」、
曜日は「未定」と表示すればよいのですが…
178:デフォルトの名無しさん
09/10/09 00:23:56
2012以上の数字が入力されたら「その年の祝日はまだ決定していません」と表示するのが正解
179:デフォルトの名無しさん
09/10/09 00:26:24
祝日法は数年ごとに改定されてるから、計算で求めようとしてもプログラムが長くなるだけ。
ワークシートか配列に50年分の一覧表を入れておいて、それを表示するだけの方がよっぽどコンパクトで正確。
180:デフォルトの名無しさん
09/10/09 00:36:00
日付が決まっている祝日
第二月曜日など動く祝日
祝日と祝日の間、振替休日
の三つに別けてやるのがこの宿題の正解だな
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のバージョンを後出しされてしまったでござるの巻
364:デフォルトの名無しさん
09/10/18 23:06:24
> ちなみにVISTA,IE7,officeXPという環境です。
正直言おう
その環境を再現して動作確認するのが面倒
365:デフォルトの名無しさん
09/10/18 23:11:07
VistaにIE7にOfficeXPって、わざといらない子ばかり集めて何してんの?何かの罰ゲーム?
366:デフォルトの名無しさん
09/10/18 23:17:04
Webクエリで画像まで取り込む方法ってあったっけ?
367:デフォルトの名無しさん
09/10/18 23:24:31
>>348
VBA初めて作る初心者です
初めてでIEからデータ取得なんてできるわけないし、
ここにソースを貼ってもらっても使いこなせるわけ無い
むだ