1 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 12:25:04 ] 過去スレ 01 pc11.2ch.net/test/read.cgi/tech/1054356121/ 02 pc11.2ch.net/test/read.cgi/tech/1168308855/ 03 pc11.2ch.net/test/read.cgi/tech/1180192018/ 04 pc11.2ch.net/test/read.cgi/tech/1189814602/ 05 pc11.2ch.net/test/read.cgi/tech/1197448064/ 06 pc11.2ch.net/test/read.cgi/tech/1205231499/ 07 pc11.2ch.net/test/read.cgi/tech/1212587819/ 08 pc11.2ch.net/test/read.cgi/tech/1219673793/ 09 pc11.2ch.net/test/read.cgi/tech/1228372971/ 10 pc12.2ch.net/test/read.cgi/tech/1235332603/ 11 pc12.2ch.net/test/read.cgi/tech/1241885130/ 12 pc12.2ch.net/test/read.cgi/tech/1247566074/
2 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 13:09:23 ] ExcelのVBAに関する質問スレです 前スレ pc11.2ch.net/test/read.cgi/tech/1054356121/ ★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 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 13:12:29 ] いちおつ。 前スレ Sleep 1 の1はミリ秒だから、1秒なら1000を指定ね。
4 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 18:04:28 ] >>4 OSとIEのバージョンは、どっちの環境でもXP SP3にIE8で同じ?
6 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 18:15:07 ] >>5 はい,どちらもXP SP3 IE8です。
7 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 18:26:52 ] >>6 キー入力の前に、ちゃんとページの表示が完了するまで待つようになってる?
8 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 19:42:08 ] 手作業ではちゃんとできるのか? 手作業と同じようにやってるのか?
10 名前:デフォルトの名無しさん mailto:sage [2009/09/30(水) 19:55:58 ] >9 手作業ではできますし、手作業同様の指示をだしているつもりです。 ダイアログが開くまでは期待通りの動きをしています。 Select以降にwaitを15秒とってもダイアログには何も記入されません。
11 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 16:12:31 ] >>5 >>6 >>9 の方へ 自社で2007をインストールして試したところ、vbaはきちんと動きました。 verの問題ではなかったようです。今のところ何か常駐ソフト等が原因なのではと考えています。 ありがとうございました。
12 名前:デフォルトの名無しさん [2009/10/01(木) 20:17:45 ] OS XP SOFT EXCEL2007 1つのブックに300近いシートがあり、これを串刺し演算したいです しかしピボットテーブルを使おうと思っても4シートしか串刺しできません vbaではとんでもない行数になると思います こういう場合どうすればいいかヒントを下さい
13 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 20:26:15 ] >>12 たとえばシートが300枚あったとして、全シートのセルA1の合計ならこういう式 =SUM(Sheet1:Sheet300!A1) で一発で求められるけど、それ以外にどういう計算をしたい?
14 名前:デフォルトの名無しさん [2009/10/01(木) 21:30:24 ] >>13 情報は商品番号(100種以上)と数量だけなんですが商品番号がランダムに並んでるんです 串刺ししつつ商品の合計を出したいのです そんなのできますか?
15 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 21:52:18 ] 作業列使うとか条件式使うとかわずらわしくなるけど出来ないこともない 現状の体裁を変えないならVBAでも変数に格納するなり 出来ることは出来る
17 名前:デフォルトの名無しさん mailto:sage [2009/10/01(木) 22:00:37 ] >>14 複数のシートタブをShiftを押しながら指定する方法だと4枚までしか集計できない。 それじゃなくて、ピボットテーブルウィザードから「範囲の追加」を使えば 300枚のシートに別れたデータをいっぺんに集計できるようにはなる。 ttp://office.microsoft.com/ja-jp/excel/HA102265851041.aspx けど、入力にめっちゃ手間がかかる。 VBAでピボットテーブルを作るのが早いと思う。
18 名前:デフォルトの名無しさん [2009/10/01(木) 22:25:37 ] >>17 ありがとうございます 頑張ってみます。
19 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 00:03:19 ] WindowsXP Excel2000 Sheet1に列固定、行不定の約10000行ほどのデータを加工して Sheet2に表示させたいのですが、馬鹿正直にfor文とかでまわして セルに格納していってたら、処理速度がえらいことになりました。 非表示や再計算を手動化等やってみたのですが、やはりまだまだ遅いです。 何か良い案は無いでしょうか?よろしくお願いいたします。
20 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 00:09:01 ] セル格納は配列が協力 配列(myRow,0) とか作って、 range("B1:B" & myRow) = 配列 ←配列(,)じゃ無くて括弧なしの「配列」 で超高速
21 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 00:14:40 ] >>20 様 ご教示ありがとうございます。 カッコ無しの配列ですね。試してみます!
22 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 00:27:58 ] for myRow = 0 to 行 -1 配列(myRow,0) = cells(myRow,2) ' 配列にB列のセルを格納 next こうやって格納した後にだな、いちおう
23 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 02:12:29 ] >>20 ,22様 処理速度を10分の1程度まで落とすことができました! あとはデータ加工部分での処理等をもっと軽くできないかやってみます。 アドバイス、ありがとうございました。
24 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 04:46:07 ] >>22 全然違う。 セル2個以上の範囲のValueプロパティは2次元配列なので、それをVariant型変数に格納してからアクセスすればよい。
25 名前:19 mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 06:49:58 ] ReDim C(datasize - 1, 56)は この例ではReDim C(myRow - 1, 10)の間違いでした。失礼しました。
27 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 07:45:50 ] 最近質問や回答がまともなのが多いな。 いいことだ。
28 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 08:46:13 ] Yahooオークションの入札履歴から 落札者と入札額の取得をしエクセルのセルに書き込もうと考えています。 WEBクエリを使ったところ 何回か動かすと 真っ白い画面になって まったく取得できなくなります。 試しにIEなどブラウザで開いてみると 特に問題なくページを開くことができます。 真っ白にならないいい方法はありますでしょうか・・・? OSは XP でIE8 Office2007 と Vista IE8 Office2007 を使用しています。
29 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 08:47:55 ] 取得部分を抜粋します。 AuctionPageID = "page.auctions.yahoo.co.jp/jp/show/bid_hist?aID= " & 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 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 17:59:53 ] HPが開けないトラブルって言うのは大抵がデータを読み込む前に処理を行うからなんだけど 5秒くらい待機したら問題ないことがある
31 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 19:06:29 ] 全くの素人ならExcel vbaとACCESSvbaのどちらが取っ付きやすいですか?
32 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 19:12:54 ] EXCEL ACCはレコードアクセスが基本になる上、ADOだとか使う必要がある
33 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 21:49:53 ] 数式でもいいの? それともVBAを使うことが目的なの? このケースだとかなり基本的なことから説明しなくちゃだから、後者なら大変なんだが
35 名前:デフォルトの名無しさん [2009/10/02(金) 22:04:00 ] >>34 後者です。 VBAでの答えをよろしくお願いします。 説明は大変ということなのでいりません。 VBAの本があるのでそれで調べて見ます。 本当に知りたいのはVBAで、 IFで真のときにさらにもう一回IFで違う条件でかける方法です。
36 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/02(金) 23:27:12 ] >33 ★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。 ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。 丸投げならEXCEL相談室へどうぞ その前に、CELLSの使い方の再確認を www.happy2-island.com/excelsmile/smile03/capter00501.shtml
39 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 00:50:56 ] ヘルプの使い方をテンプレに入れたらdat落ちだな
40 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 03:04:59 ] >>37 演算子でつなげるものと同じ意味のIfネストは、なんだか格好悪いよね。
41 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 03:06:40 ] VBAって短絡評価が無いからIfネストの方がパフォーマンスが良かったりうんぬん
42 名前:デフォルトの名無しさん [2009/10/03(土) 07:50:07 ] >>36 >>37 ありがとうございました。
43 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 08:49:12 ] コードが冗長になってくると、一括判定が必要な演算子連結よりもネスト構造のほうが優れているとかなんとか
44 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 10:29:10 ] Ifネストは行単位で追加や削除ができるから改変しやすい 条件を外したいときは先頭に ' 入れてコメントにすればいいだけだし、 動作テストで条件を変えて試したい時とかよく使う
45 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 11:38:11 ] >>45 どのくら速かった?
47 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 12:28:15 ] ま〜た、速度厨か
48 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 13:54:45 ] 馬鹿?
50 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 16:41:50 ] >>48 >if a=1 or 2 or 3 then >でエラー吐き出して、最初のころ原因が分からなくて相当悩んだ記憶が。 本当にエラー吐いたの?、その条件だとa=1が真でも偽でも2と3が真だから 必ず真になってエラーにはならないと思うけど・・・
52 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 17:46:54 ] 文法くらい作法に従って書けよ それで動くと思ってるのは他の言語も経験したことないんだろ? クラス継承ができないとか、ポインタ使えないとか範囲コメントできないとかならともかく・・・
53 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 19:57:28 ] いや、コード書いてシステム動かすのが前提なんだから、ある程度速度を求めるのは当然だろう 速度厨とか何を言ってるんだ
54 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 19:59:36 ] VB.NETにはショートサーキットする演算子が追加されてるから、そのうちVBAにも追加されるかもしれん 個人的にはショートサーキットの有無で結果の変わるようなコーディングは避けるべきだと思う >>51 俺は>48ではないが 昔のVBAだと確かエラーになってた気がするんだが 今エクセルの2007で試したらエラーにならないな まあ、>48が思ってる通りには評価されてないんだが
55 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/03(土) 21:47:02 ] マクロの記録、がためになるよ
57 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 06:15:54 ] Office 2010から、VBA.netにならないんですか?
58 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 09:29:33 ] XP&2003です。 フォーム上のテキストボックスの数を数えるには、 どのようにすればよいでしょうか。 Controlsの引数は"名前"と"番号"なので種類が指定できないし、 GettypeはVBAでは使えないようで悩んでいます。
60 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 11:31:23 ] >>59 TypeName 使ってみてはどうですか
61 名前:59 mailto:sage [2009/10/04(日) 13:45:27 ] >>60 できましたぁぁぁぁぁぁ ありがとうございましたぁぁぁぁぁ!!!
62 名前:デフォルトの名無しさん [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/10/04(日) 22:31:45 ] >63さん ありがとうございます!! 早速やってみたんですが、 「プロシージャの呼び出し、または引数が不正です」とエラーが 出てしまいました。。。 なぜでしょう。。。 Columns(1).Find("りんご")… というところでエラーが出てるっぽいです。
65 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん [2009/10/04(日) 22:59:56 ] >>65 解決しました!!65さんの言っているとおりでした! すいません。私が書いてなかったのが悪かったんですが、 "貼り付け用"というセルは表の一番下にあるんです。 一度"りんご"のセルがあって、実行されちゃうと、 もう"貼り付け用"というセルがなくなってしまうことが原因でした! なので、Forを一番下から上にあがるような構文を書いたら エラーが出なくなりました! ありがとうございました!!
67 名前:デフォルトの名無しさん [2009/10/04(日) 23:15:00 ] 62です。 もう一つ教えてもらってもいいですか? もし"りんご"というセルがなかったら、 "貼り付け用"と書かれたセルとその隣のセルを削除したいのですが、 どのように書けばいいですか? elseを使うんだろうなぁと思って、 Else Columns(1).Find("貼り付け用").Resize(, 2).Delete shift:=xlShiftUp を入れてみたんですが、エラーになっちゃいました。。。 お時間があれば教えてください!よろしくお願いします。
68 名前:デフォルトの名無しさん mailto:sage [2009/10/04(日) 23:19:19 ] あとは自力で頑張れよ・・・
69 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 00:11:51 ] そんなこといわずにもう一息っ!
70 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 00:19:37 ] 俺はfindの時にはsetを使ってるんだけど、説明するのも大変そうだなぁ・・・。 見つかりませんってエラーが出るんだから、on error goto で飛ばしたら?
71 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 01:26:21 ] 最初の設計がだめなんじゃないの? りんごが無かったら削除するんじゃなくて りんごがあったら追加する仕様の方がいい希ガス
74 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 01:30:23 ] ?a=1 or 2 or 3 3 3と計算されるね
75 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 02:06:50 ] え?
76 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 03:18:19 ] λ
77 名前:デフォルトの名無しさん mailto:sage [2009/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 mailto:sage [2009/10/05(月) 12:04:44 ] 自己レスだが7になる理由は分った。
79 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 12:44:27 ] >>36 はプログラマとして優秀さを感じるな >>38 は人の程度が知れる
80 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 13:11:30 ] (;゚д゚)ァ
81 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 16:16:05 ] >>81 >>78 書いた時点で分ってるよ。
83 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/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 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 17:45:45 ] ビット演算の便利な使い方のケースってどんなものある?
86 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 17:52:54 ] >>85 一般論で言えばBoolean型の配列よりはビット演算の方がメモリが節約できてキャッシュの使用効率が上がるし 条件判断も高速になる。 可読性は落ちるけど昔からよく使われる手法だから、知ってないと人のソースが読めなかったりする。
87 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 19:49:26 ] vbsの質問ってここでいいですか?
88 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 20:24:16 ] vbaから呼ぶならある程度は良いと思うけど。個人的に。
89 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 20:31:15 ] vbaとあまり関係ないので別スレで質問してみます
90 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 20:31:50 ] >まぁ今時はコンパイラが大分やってくれるから高級言語ならあまり関係ないけど 組込とかで機械語表記するときゃ今でも普通に使うよ ハードに近づけば近づくほど限界性能を引き出せるけど分かりにくくなる とりあえずVBAって時点で、変な表記はせずに可読性に特化したコードを書くべきだと思う
91 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 20:38:55 ] 速度厨はその辺が気に食わないみたいで
92 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 20:43:24 ] VBAに速度求めてもな。 手作業の自動化くらいに使ってりゃいいんだよ。自分でやるより早いだろ。
93 名前:デフォルトの名無しさん [2009/10/05(月) 21:02:07 ] >>85 ハード叩くときの設定なんかで使う #ドライバー作る時なんかに必要なときがある(あまりいないと思うけど)
94 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 21:19:46 ] VBAでドライバ作るやつはいないだろ VBAでビット演算を使って便利なケースを語れ
95 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 21:23:14 ] ビット演算の宿題が出たとき
96 名前:デフォルトの名無しさん mailto:sage [2009/10/05(月) 21:35:17 ] >>94 フォームやシート上にcheckboxが多数ある場合のON/OFF判定とかは?
97 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 02:16:02 ] それにしても SQL に bit 演算ないのは理不尽だよなぁ
98 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 02:24:59 ] んなこたない
99 名前:デフォルトの名無しさん mailto:sage [2009/10/06(火) 02:40:06 ] あるの?
100 名前:デフォルトの名無しさん mailto:sage [2009/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