Excel VBA質問スレ Part13

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
2デフォルトの名無しさん:2009/09/30(水) 13:09:23
ExcelのVBAに関する質問スレです

前スレ http://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デフォルトの名無しさん:2009/09/30(水) 13:12:29
いちおつ。

前スレ
Sleep 1
の1はミリ秒だから、1秒なら1000を指定ね。
4デフォルトの名無しさん: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デフォルトの名無しさん:2009/09/30(水) 18:04:28
>>4
OSとIEのバージョンは、どっちの環境でもXP SP3にIE8で同じ?
6デフォルトの名無しさん:2009/09/30(水) 18:15:07
>>5
はい,どちらもXP SP3 IE8です。
7デフォルトの名無しさん:2009/09/30(水) 18:26:52
>>6
キー入力の前に、ちゃんとページの表示が完了するまで待つようになってる?
8デフォルトの名無しさん: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デフォルトの名無しさん:2009/09/30(水) 19:42:08
手作業ではちゃんとできるのか?
手作業と同じようにやってるのか?
10デフォルトの名無しさん:2009/09/30(水) 19:55:58
>9
手作業ではできますし、手作業同様の指示をだしているつもりです。
ダイアログが開くまでは期待通りの動きをしています。
Select以降にwaitを15秒とってもダイアログには何も記入されません。
11デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/10/01(木) 21:52:18
作業列使うとか条件式使うとかわずらわしくなるけど出来ないこともない
現状の体裁を変えないならVBAでも変数に格納するなり
出来ることは出来る
17デフォルトの名無しさん: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デフォルトの名無しさん:2009/10/02(金) 00:03:19
WindowsXP Excel2000

Sheet1に列固定、行不定の約10000行ほどのデータを加工して
Sheet2に表示させたいのですが、馬鹿正直にfor文とかでまわして
セルに格納していってたら、処理速度がえらいことになりました。
非表示や再計算を手動化等やってみたのですが、やはりまだまだ遅いです。
何か良い案は無いでしょうか?よろしくお願いいたします。
20デフォルトの名無しさん:2009/10/02(金) 00:09:01
セル格納は配列が協力

配列(myRow,0) とか作って、
range("B1:B" & myRow) = 配列  ←配列(,)じゃ無くて括弧なしの「配列」
で超高速
21デフォルトの名無しさん:2009/10/02(金) 00:14:40
>>20
ご教示ありがとうございます。
カッコ無しの配列ですね。試してみます!
22デフォルトの名無しさん:2009/10/02(金) 00:27:58
for myRow = 0 to 行 -1
配列(myRow,0) = cells(myRow,2) ' 配列にB列のセルを格納
next

こうやって格納した後にだな、いちおう
23デフォルトの名無しさん:2009/10/02(金) 02:12:29
>>20,22様
処理速度を10分の1程度まで落とすことができました!
あとはデータ加工部分での処理等をもっと軽くできないかやってみます。
アドバイス、ありがとうございました。
24デフォルトの名無しさん:2009/10/02(金) 04:46:07
>>22
全然違う。
セル2個以上の範囲のValueプロパティは2次元配列なので、それをVariant型変数に格納してからアクセスすればよい。
2519: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デフォルトの名無しさん:2009/10/02(金) 06:49:58
ReDim C(datasize - 1, 56)は
この例ではReDim C(myRow - 1, 10)の間違いでした。失礼しました。
27デフォルトの名無しさん:2009/10/02(金) 07:45:50
最近質問や回答がまともなのが多いな。
いいことだ。
28デフォルトの名無しさん:2009/10/02(金) 08:46:13
Yahooオークションの入札履歴から
落札者と入札額の取得をしエクセルのセルに書き込もうと考えています。

WEBクエリを使ったところ 何回か動かすと
真っ白い画面になって まったく取得できなくなります。

試しにIEなどブラウザで開いてみると 特に問題なくページを開くことができます。
真っ白にならないいい方法はありますでしょうか・・・?

OSは XP でIE8 Office2007
と Vista IE8 Office2007

を使用しています。
29デフォルトの名無しさん:2009/10/02(金) 08:47:55
取得部分を抜粋します。
AuctionPageID = "http://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デフォルトの名無しさん:2009/10/02(金) 17:59:53
HPが開けないトラブルって言うのは大抵がデータを読み込む前に処理を行うからなんだけど
5秒くらい待機したら問題ないことがある
31デフォルトの名無しさん:2009/10/02(金) 19:06:29
全くの素人ならExcel vbaとACCESSvbaのどちらが取っ付きやすいですか?
32デフォルトの名無しさん: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デフォルトの名無しさん:2009/10/02(金) 21:49:53
数式でもいいの?
それともVBAを使うことが目的なの?

このケースだとかなり基本的なことから説明しなくちゃだから、後者なら大変なんだが
35デフォルトの名無しさん:2009/10/02(金) 22:04:00
>>34
後者です。
VBAでの答えをよろしくお願いします。
説明は大変ということなのでいりません。
VBAの本があるのでそれで調べて見ます。

本当に知りたいのはVBAで、
IFで真のときにさらにもう一回IFで違う条件でかける方法です。
36デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/10/02(金) 23:27:12
>33
★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。

丸投げならEXCEL相談室へどうぞ
その前に、CELLSの使い方の再確認を
http://www.happy2-island.com/excelsmile/smile03/capter00501.shtml
39デフォルトの名無しさん:2009/10/03(土) 00:50:56
ヘルプの使い方をテンプレに入れたらdat落ちだな
40デフォルトの名無しさん:2009/10/03(土) 03:04:59
>>37
演算子でつなげるものと同じ意味のIfネストは、なんだか格好悪いよね。
41デフォルトの名無しさん:2009/10/03(土) 03:06:40
VBAって短絡評価が無いからIfネストの方がパフォーマンスが良かったりうんぬん
42デフォルトの名無しさん:2009/10/03(土) 07:50:07
>>36
>>37
ありがとうございました。
43デフォルトの名無しさん:2009/10/03(土) 08:49:12
コードが冗長になってくると、一括判定が必要な演算子連結よりもネスト構造のほうが優れているとかなんとか
44デフォルトの名無しさん:2009/10/03(土) 10:29:10
Ifネストは行単位で追加や削除ができるから改変しやすい
条件を外したいときは先頭に ' 入れてコメントにすればいいだけだし、
動作テストで条件を変えて試したい時とかよく使う
45デフォルトの名無しさん: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デフォルトの名無しさん:2009/10/03(土) 11:38:11
>>45
どのくら速かった?
47デフォルトの名無しさん:2009/10/03(土) 12:28:15
ま〜た、速度厨か


48デフォルトの名無しさん: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デフォルトの名無しさん:2009/10/03(土) 13:54:45
馬鹿?
50デフォルトの名無しさん: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デフォルトの名無しさん:2009/10/03(土) 16:41:50
>>48
>if a=1 or 2 or 3 then
>でエラー吐き出して、最初のころ原因が分からなくて相当悩んだ記憶が。

本当にエラー吐いたの?、その条件だとa=1が真でも偽でも2と3が真だから
必ず真になってエラーにはならないと思うけど・・・
52デフォルトの名無しさん:2009/10/03(土) 17:46:54
文法くらい作法に従って書けよ
それで動くと思ってるのは他の言語も経験したことないんだろ?
クラス継承ができないとか、ポインタ使えないとか範囲コメントできないとかならともかく・・・
53デフォルトの名無しさん:2009/10/03(土) 19:57:28
いや、コード書いてシステム動かすのが前提なんだから、ある程度速度を求めるのは当然だろう
速度厨とか何を言ってるんだ
54デフォルトの名無しさん: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デフォルトの名無しさん:2009/10/03(土) 21:47:02
マクロの記録、がためになるよ
57デフォルトの名無しさん:2009/10/04(日) 06:15:54
Office 2010から、VBA.netにならないんですか?
58デフォルトの名無しさん: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デフォルトの名無しさん:2009/10/04(日) 09:29:33
XP&2003です。

フォーム上のテキストボックスの数を数えるには、
どのようにすればよいでしょうか。

Controlsの引数は"名前"と"番号"なので種類が指定できないし、
GettypeはVBAでは使えないようで悩んでいます。
60デフォルトの名無しさん:2009/10/04(日) 11:31:23
>>59
TypeName 使ってみてはどうですか
6159: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デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/10/04(日) 23:19:19
あとは自力で頑張れよ・・・
69デフォルトの名無しさん:2009/10/05(月) 00:11:51
そんなこといわずにもう一息っ!
70デフォルトの名無しさん:2009/10/05(月) 00:19:37
俺はfindの時にはsetを使ってるんだけど、説明するのも大変そうだなぁ・・・。

見つかりませんってエラーが出るんだから、on error goto で飛ばしたら?
71デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/10/05(月) 01:26:21
最初の設計がだめなんじゃないの?

りんごが無かったら削除するんじゃなくて
りんごがあったら追加する仕様の方がいい希ガス
74デフォルトの名無しさん:2009/10/05(月) 01:30:23
?a=1 or 2 or 3
3

3と計算されるね
75デフォルトの名無しさん:2009/10/05(月) 02:06:50
え?
76デフォルトの名無しさん:2009/10/05(月) 03:18:19
λ
77デフォルトの名無しさん: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になるのはどうして?
7877:2009/10/05(月) 12:04:44
自己レスだが7になる理由は分った。
79デフォルトの名無しさん:2009/10/05(月) 12:44:27
>>36はプログラマとして優秀さを感じるな
>>38は人の程度が知れる
80デフォルトの名無しさん:2009/10/05(月) 13:11:30
(;゚д゚)ァ
81デフォルトの名無しさん: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デフォルトの名無しさん:2009/10/05(月) 16:16:05
>>81
>>78書いた時点で分ってるよ。
83デフォルトの名無しさん: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デフォルトの名無しさん: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デフォルトの名無しさん:2009/10/05(月) 17:45:45
ビット演算の便利な使い方のケースってどんなものある?
86デフォルトの名無しさん:2009/10/05(月) 17:52:54
>>85
一般論で言えばBoolean型の配列よりはビット演算の方がメモリが節約できてキャッシュの使用効率が上がるし
条件判断も高速になる。
可読性は落ちるけど昔からよく使われる手法だから、知ってないと人のソースが読めなかったりする。
87デフォルトの名無しさん:2009/10/05(月) 19:49:26
vbsの質問ってここでいいですか?
88デフォルトの名無しさん:2009/10/05(月) 20:24:16
vbaから呼ぶならある程度は良いと思うけど。個人的に。
89デフォルトの名無しさん:2009/10/05(月) 20:31:15
vbaとあまり関係ないので別スレで質問してみます
90デフォルトの名無しさん:2009/10/05(月) 20:31:50
>まぁ今時はコンパイラが大分やってくれるから高級言語ならあまり関係ないけど
組込とかで機械語表記するときゃ今でも普通に使うよ
ハードに近づけば近づくほど限界性能を引き出せるけど分かりにくくなる
とりあえずVBAって時点で、変な表記はせずに可読性に特化したコードを書くべきだと思う
91デフォルトの名無しさん:2009/10/05(月) 20:38:55
速度厨はその辺が気に食わないみたいで
92デフォルトの名無しさん:2009/10/05(月) 20:43:24
VBAに速度求めてもな。
手作業の自動化くらいに使ってりゃいいんだよ。自分でやるより早いだろ。
93デフォルトの名無しさん:2009/10/05(月) 21:02:07
>>85
ハード叩くときの設定なんかで使う
#ドライバー作る時なんかに必要なときがある(あまりいないと思うけど)
94デフォルトの名無しさん:2009/10/05(月) 21:19:46
VBAでドライバ作るやつはいないだろ
VBAでビット演算を使って便利なケースを語れ
95デフォルトの名無しさん:2009/10/05(月) 21:23:14
ビット演算の宿題が出たとき
96デフォルトの名無しさん:2009/10/05(月) 21:35:17
>>94
フォームやシート上にcheckboxが多数ある場合のON/OFF判定とかは?
97デフォルトの名無しさん:2009/10/06(火) 02:16:02
それにしても SQL に bit 演算ないのは理不尽だよなぁ
98デフォルトの名無しさん:2009/10/06(火) 02:24:59
んなこたない
99デフォルトの名無しさん:2009/10/06(火) 02:40:06
あるの?
100デフォルトの名無しさん: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
101100:2009/10/06(火) 06:58:23
すまん、偶数かどうかの比較はまちがってるな。
102デフォルトの名無しさん:2009/10/06(火) 07:11:08
ちなみに偶数かどうかは
If j And 1 = 0 Then
103デフォルトの名無しさん:2009/10/06(火) 07:34:47
If not (i And 1) Then
104デフォルトの名無しさん:2009/10/06(火) 07:50:32
>>103
それも書こうと思ったが、たしかにその方が少し速いね。
105デフォルトの名無しさん:2009/10/06(火) 07:51:33
背伸びしてビット演算するレベルじゃないな。
106デフォルトの名無しさん:2009/10/06(火) 07:54:49
ループの回数を多くして計りなおしたら>>102の方が速かったわ。
107デフォルトの名無しさん:2009/10/06(火) 07:56:12
その程度は普通はMod使うよなぁ。
108デフォルトの名無しさん:2009/10/06(火) 08:02:23
WorksheetFunction.IsEvenを使う俺様は最強





















じゃねーな。最低だ。
109デフォルトの名無しさん:2009/10/06(火) 08:15:34
>>108
よく見る似たような最低なものにWorksheetFunction.IsNumberがある。
他にもあったな。
110デフォルトの名無しさん:2009/10/06(火) 08:29:22
質問スレがヲタスレ化してる・・・
111デフォルトの名無しさん:2009/10/06(火) 09:39:21
速度厨はアセンブラでもやっとけ、アフォ
112デフォルトの名無しさん:2009/10/06(火) 09:42:03
>>100
奇数の判定はこれでいいんじゃないか?
If i Mod 2 Then
113デフォルトの名無しさん:2009/10/06(火) 09:45:17
俺は速度をことさら求めない派だが、やたら速度を否定するやつのソースって汚いのが多いよな。
114デフォルトの名無しさん:2009/10/06(火) 09:51:38
>>112
普通はModだが、Andでビット演算で判定すればほんの少し速くなるって話だろ? 
115デフォルトの名無しさん:2009/10/06(火) 09:59:37
>>113
お前の美しいソースを見てみたいもんだな。
116デフォルトの名無しさん:2009/10/06(火) 10:07:27
こんにちは。あたしはカウガール。
AAとして成り上がるため、スレを巡る旅をしています。
    __
  ヽ|__|ノ    モォ
  ||‘‐‘||レ   _)_, ―‐ 、
  /(Y (ヽ_ /・ ヽ     ̄ヽ
  ∠_ゝ  ` ^ヽ ノ.::::::__( ノヽ
   _/ヽ      /ヽ ̄ ̄/ヽ
117デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/10/06(火) 10:35:49
>>117
たしかに公平にやるならそうだよな。
公平にやってもビット演算が少し速いみたいだけど、人に見せるコードならIf i Mod 2 = 1 Then だな。
119デフォルトの名無しさん:2009/10/06(火) 12:31:35
おまえら仕事しろよ
120デフォルトの名無しさん:2009/10/06(火) 19:37:14
速度の事は別スレ建てて、そこでやれ
121デフォルトの名無しさん:2009/10/06(火) 19:50:09
俺はわからなかったよ!
122デフォルトの名無しさん:2009/10/07(水) 02:02:48
お前ら、奇数ってマイナスもありなんだぜ
i Mod 2 = 1 ではマイナスの奇数が判定できない時点で失格
123デフォルトの名無しさん:2009/10/07(水) 03:32:56
何の問題もない
たとえば4bitなら
-1 = 1111
-2 = 1110
-3 = 1101
124デフォルトの名無しさん:2009/10/07(水) 07:11:14
>>123
ー3 mod 2 = 1 になった?
125デフォルトの名無しさん:2009/10/07(水) 07:24:01
yes we can
126デフォルトの名無しさん:2009/10/07(水) 08:52:58
>123

天然w
127デフォルトの名無しさん:2009/10/07(水) 09:11:24
>>122
すみませんねぇ、あいにくマイナス志向じゃないもんでね。
じゃぁIf i Mod 2 <> 0 Thenならあなたのおきにメスでしょうか?
128デフォルトの名無しさん:2009/10/07(水) 09:27:47
ド素人にはよくあることw
129デフォルトの名無しさん:2009/10/07(水) 09:50:25
ちなみに
If i Mod 2 Then
なら負数でも問題ないんだが
130デフォルトの名無しさん:2009/10/07(水) 10:48:04
ー3 mod 2 = 1
が偽になる環境って
ー(3 mod 2) = -1
と解釈されてるんだろ
((ー3) mod 2) = 1
と書けば問題無し
131デフォルトの名無しさん:2009/10/07(水) 11:08:36
>130

天然w
132デフォルトの名無しさん:2009/10/07(水) 11:17:12
Modで盛り上がってるところすみませんが、四捨五入ってVBAに関数ある?
Roundは微妙に違うし。
133デフォルトの名無しさん:2009/10/07(水) 11:24:05
>>132
ない
数式を工夫したり、関数を自作する必要がある
またはWorksheetFunction.Round
134デフォルトの名無しさん:2009/10/07(水) 11:26:43
>>130
キミはまず、とりあえずマイナス記号を入力する方法から勉強しようか
135デフォルトの名無しさん:2009/10/07(水) 11:27:20
は-い(;゚д゚)ァ
136デフォルトの名無しさん:2009/10/07(水) 13:37:07
>>133
一応VBAにもRoundって関数がある
まあ、これ使うと思わぬ結果が出ることもある

自作するなら、基本的には0.5足して切り捨てなんだが
これもマイナスのときどうするか考えると結構じゃまくさい
137デフォルトの名無しさん:2009/10/07(水) 14:13:01
floor
138デフォルトの名無しさん:2009/10/07(水) 15:44:12
>>136
ちゃんと最初から読みなさい
質問者はVBAのRoundではだめなことがわかった上で、どうすればいいか質問してる
VBAのRound関数とワークシート関数のROUNDは機能が異なるのは既知
139デフォルトの名無しさん:2009/10/07(水) 16:17:08
VBAのRoundも立派な四捨五入ですが。
140デフォルトの名無しさん:2009/10/07(水) 16:50:28
ttp://q.hatena.ne.jp/1154589462
を参考に、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デフォルトの名無しさん:2009/10/07(水) 17:15:52
ExecSQL = rs("NAME").Value

これを変更した?
142デフォルトの名無しさん:2009/10/07(水) 17:19:59
>141
見落としていました。
ありがとうございます。
143デフォルトの名無しさん:2009/10/07(水) 18:14:31
エクセルで指定セル内に文字を入力中、別のセル内にリアルタイムに
バイト数を表示させることはできるのでしょうか。
教えてください、エロい人。
144デフォルトの名無しさん:2009/10/07(水) 18:25:56
>>143
無理
145デフォルトの名無しさん:2009/10/07(水) 18:41:44
すみません。
すごく初歩的なことなんですが、
列が縦でrow、行が横でcolumですよね?
A5だとAが列で5が行ってことになりますよね?
A5セルからA10セルまでをループさせたいときに、
5や10の値の定数をrowみたいな名前で宣言してるのを見たんですが、
これってcolumじゃないんですか??
書籍なので間違いではなさそうなんですが・・・。
A列B列、C列・・・
5行、6行・・・
ですよね?
146デフォルトの名無しさん:2009/10/07(水) 18:50:02
rowが行、colum列
辞書で調べてみ
147デフォルトの名無しさん:2009/10/07(水) 19:12:00
>>139
違うんじゃねーの?
5は捨てたり入れたりだもんな。
Round(1.5)もRound(2.5)も同じだろ?
148デフォルトの名無しさん:2009/10/07(水) 19:29:34
>>145
>>146の方の回答が全てだと思いますが、
下のExcel関数をいくつかのセルで試してみれば、理解しやすいかもしれません。

【関数】
=ROW()   :この関数が入力されている行の行番号を調べます。
=COLUMN() :この関数が入力されている列の列番号を調べます。
149デフォルトの名無しさん:2009/10/07(水) 19:31:05
いやでき・・・どうだろ
ループでバインドするなりキーイベントで捕捉するなり
フォームのTxtボックスとかなら普通に出来るけど、k
セル入力中ってどうだっけ
150デフォルトの名無しさん:2009/10/07(水) 20:49:33
Excel2007

正しい言い方が判らないので上手い事伝わるかどうか…なんですけど。

フォーム上にコマンドボタンを縦に5つ貼りつけています。
エンターキーを叩いた時、初期状態では一番上のボタンのマクロが実行され
ますが、これを3番目のボタンのマクロが実行される様に変えたいです。

テキストボックスとかだったらタブオーダーを設定すれば順番を指定できま
すけど、コマンドボタンについて同一フォーム上で最優先のものを指定する
事出来ますか?
151デフォルトの名無しさん:2009/10/07(水) 20:51:48
>>149
セルはテキストボックスか何かを継承してるはずなんで、
ハンドルさえ取得できればなんとかなる可能性はあるけど、
かなり大変じゃないかと思う。
それにバージョンごとに方法が違ってくると思う。
たぶんだけど2007が一番やりやすそうな気がする。

入力途中のキーイベントはVBAには存在しないので
自前でフックする必要がある。
152デフォルトの名無しさん:2009/10/07(水) 20:54:47
>>150
コマンドボタンにもタブオーダーはあるよ
153デフォルトの名無しさん:2009/10/07(水) 20:58:42
>>145
A1セルの場合
A=横=列=Column
1=縦=行=Row
154150:2009/10/07(水) 21:12:30
>>152
プロパティのTabIndexをいじってみたら希望道理になりました。
どうもお騒がせしました m(_ _)m
155デフォルトの名無しさん:2009/10/07(水) 23:40:36
西暦(2000年以降)年を入力したとき、その1年間の祝日の祝日名、月日及び曜日をイミディエイトウインドウに
表示するプログラムで、サブルーチンプロシージャまたは関数プロシージャを3つ利用しなくてはなりません。

ひたすらサイトを検索したのですが、見つかりませんでした。
全く手が出せず、困っています。どなたか教えてください。よろしくお願いします。


156デフォルトの名無しさん:2009/10/08(木) 00:06:09
155です。
Excel2007を使用しています。
157デフォルトの名無しさん:2009/10/08(木) 00:28:45
>>155
検索すると結構、マクロ、祝日関数あるよね
ダウンロードしてそのソースをみて
考えればいんじゃない
解説してるサイトもあった気がする
158デフォルトの名無しさん:2009/10/08(木) 00:32:56
155です。ありがとうございます。
祝日判定や、日にちを入れて表示させるものは
見つかったのですが、祝日名を表示させるものは
ひとつしか見つからず、ダウンロードしても
マクロは見られませんでした…
159デフォルトの名無しさん:2009/10/08(木) 00:38:20
>>155
祝日名を表示させるコードの一例が載っています。
ttp://www.h3.dion.ne.jp/~sakatsu/holiday_logic.htm#VBA
160デフォルトの名無しさん:2009/10/08(木) 00:45:27
先ほど参照していたのですが、
kt関数は使ったことがなく、わかりませんでした…。
161デフォルトの名無しさん:2009/10/08(木) 01:36:09
>>155
質問の意図がちょっとわからんな。
そういう関数を作れっていう宿題なのか、どこかから手に入れたマクロの使い方を知りたいのか。

ちなみにkt関数は肝心の部分がプロテクトかかってて見えないんじゃなかったっけ?
162デフォルトの名無しさん:2009/10/08(木) 13:09:35
全くの初心者の質問なのですが、
ttp://www.matsumae.hokkaido-c.ed.jp/02school/kyouka_01.pdf
このサイトにある例13の問題の、
ex13 上の例13のプログラムを参考にして,自然数Nを入力したとき,
Nの約数の個数を求めるプログラムを,次の手順で作れ。
変数sを準備し,N以下の自然数で割り切れたとき,sに1を加える。
これのやり方が全くわかりません。
どなたか簡単に教えてくれないでしょうか。
163デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/10/08(木) 14:11:18
>>163

ありがとうございます。
165デフォルトの名無しさん:2009/10/08(木) 15:16:46
166デフォルトの名無しさん:2009/10/08(木) 16:01:04
>>143
入力したキーのフックに使えるAPI関数があるにはある
SetWindowsHookEx

恒常ループを設定して

多分出来ないんだろうが
167デフォルトの名無しさん:2009/10/08(木) 16:13:28
>>多分出来ないんだろうが

何しに出てきたんだwww
168デフォルトの名無しさん:2009/10/08(木) 17:13:36
>>167
キー入力のバインドは出来るんだろうが、他のセルに書きながら元セルのアクティブどうするかとか、全角や変換どうするんだとか考えたら難しいかなあと
キー入力関係なく、一定時間ごとにセル内容を参照してってのも、入力を確定してないから無理だろうし
セル入力中のデータを捕捉出来れば或いは
169デフォルトの名無しさん:2009/10/08(木) 18:17:21
155です。
学校で授業でやっていて、「テストまでには出来るようにしておけ」
といわれています。
サブルーチンもまだ1度しか使ったことがなく、
マクロを見て理解するのが精一杯の状態です。
170デフォルトの名無しさん:2009/10/08(木) 18:39:53
課題には剥かないよな
休日と振替は法律で決まってるからアルゴリズムまるぱく出来るが、最近は数年で法律改正されてる
171デフォルトの名無しさん:2009/10/08(木) 19:36:09
頭のおかしな人には気をつけましょう
http://info.2ch.net/before.html
172デフォルトの名無しさん:2009/10/08(木) 19:40:37
なんだ突然
173デフォルトの名無しさん:2009/10/08(木) 19:49:36
Excel2002で3D積み上げ棒グラフを作る方法を教えてください。
ttp://terrapy.sakura.ne.jp/image/3DStackedColumn.gif
174デフォルトの名無しさん:2009/10/08(木) 20:14:32
>>169
カレンダー関連の処理は簡単に見えて実はかなり難しい。
はっきり言って初心者には無理。

> プロシージャを3つ利用しなくてはなりません。

てのがひっかかるんだけど、
学校が用意したサブルーチンがあって、それを呼び出せって話じゃないの?
175デフォルトの名無しさん:2009/10/08(木) 23:37:56
サブルーチンも別マクロで自分で作らなければなりません…
176デフォルトの名無しさん:2009/10/08(木) 23:46:19
>>175
自分も初心者には少し荷が重い気がするけど

一度に全てやろうとするよりも
一つずつ片付けた方が良いとおもうよ

祝日に関しては内閣府ページ
http://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html
が参考になると思うんで

どのような処理が必要かまず検討してみたら?

テーブルに1年分(1/1〜12/31)のデータ作成して
それに祝日データを入れていく方法が一番分かり易いんじゃないかな

振替休日の判定とか
休日 平日 休日 → 休日 休日 休日 とする処理とかあるし
177デフォルトの名無しさん:2009/10/09(金) 00:07:41
西暦年を入力→1/1の曜日を求める→出力「元日 1月1日 ○曜日」
→1月第二月曜の日を求める→出力「成人の日 1月○日 月曜日」
…の繰り返しをする、ということしか…

さまざまなサイトに出ている「春分秋分」については、月日は「春分日」「秋分日」、
曜日は「未定」と表示すればよいのですが…
178デフォルトの名無しさん:2009/10/09(金) 00:23:56
2012以上の数字が入力されたら「その年の祝日はまだ決定していません」と表示するのが正解
179デフォルトの名無しさん:2009/10/09(金) 00:26:24
祝日法は数年ごとに改定されてるから、計算で求めようとしてもプログラムが長くなるだけ。
ワークシートか配列に50年分の一覧表を入れておいて、それを表示するだけの方がよっぽどコンパクトで正確。
180デフォルトの名無しさん:2009/10/09(金) 00:36:00
日付が決まっている祝日
第二月曜日など動く祝日
祝日と祝日の間、振替休日

の三つに別けてやるのがこの宿題の正解だな
181デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/10/09(金) 00:39:57
祝日を表示したいので、振替休日についても考慮しません。
183デフォルトの名無しさん:2009/10/09(金) 01:13:42
かなり楽に成っちゃったね
ならば、日付が決まっている祝日
第二月曜日、第三月曜の祝日
秋分春分の三つに分けるのが正解かな
184デフォルトの名無しさん:2009/10/09(金) 01:50:01
というか
後出し過ぎ
185デフォルトの名無しさん:2009/10/09(金) 02:38:24
会社の創立記念日とか

186デフォルトの名無しさん:2009/10/09(金) 08:24:30
ム板だよな?ここ・・・
187デフォルトの名無しさん:2009/10/09(金) 08:52:50
そっか今みどりの日だから祝日扱いなんだな
188デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/10/09(金) 21:41:35
>>188-189
配列に入れたら簡単だよ。
それくらい人に頼らず自分で作れないとダメでしょ。
191デフォルトの名無しさん:2009/10/09(金) 21:52:53
配列にいれんでも
名前には重複がないんだったら
そのままシート2へコピーすればいいだけてしょ
1)A氏〜D氏までのセルをコピー
2)その下にE氏〜G氏までのセルをコピー
てな感じで ループ処理していけば
192デフォルトの名無しさん:2009/10/09(金) 22:07:04
>>188
もうちょっと具体的に。
シート1は縦4列?
193デフォルトの名無しさん:2009/10/09(金) 22:11:29
つか 丸投げな匂いがするのは気のせい?
194188:2009/10/09(金) 22:28:11
名前と日付と数でひとつのブロックになっていて、それが横に数十連なっています。
今までは手作業でコピーと貼り付けをしていたのですが
数が膨大になってきたので手作業ではまかなえなくなってしまいました。

とりあえず自分でマクロを組んでみたのですが、ブロックごとの数がまちまちで
シート2の一括データに空白が出来て穴あきデータになっていしまいます・・・
195デフォルトの名無しさん:2009/10/09(金) 22:41:20
>>155
希望に沿うか分からないですけど、作ってみました。
ttp://excelerthanexcel.blog103.fc2.com/blog-entry-1.html

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

よかったら参考にしてください。
196デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/10/09(金) 23:08:29
またコイツか・・・

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

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

199デフォルトの名無しさん:2009/10/09(金) 23:14:50
変数の宣言しないと分かりにくいかもねぇ。
200デフォルトの名無しさん:2009/10/09(金) 23:28:12
198です。
イミディエイトウィンドウは表示されました。すみません。
201デフォルトの名無しさん:2009/10/09(金) 23:29:33
>>197
あとから修正する可能性のある部分を先頭にまとめてるだけだよ
202デフォルトの名無しさん:2009/10/09(金) 23:38:16
>>198
 >学校で授業でやっていて、「テストまでには出来るようにしておけ」
じゃなかった?

あんまり人まかせだと テストで 赤点てな事になるよ!
203195:2009/10/10(土) 00:03:23
>>198
自己解決したとはいえ、イミディエイトウィンドウぐらいは質問せずに自分で開きましょう。

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

プログラム板にしては非常にぬるま湯的な対応をしてしまったことを
すごく後悔しています。でもまぁ、自分自身の勉強にはなったか。
204デフォルトの名無しさん:2009/10/10(土) 00:17:17
>>196
ちゃんと内容は見ていないがSet □ = Nothing をする癖をつけた方がいいと思うよ。
205デフォルトの名無しさん:2009/10/10(土) 00:51:40
>>203
ありがとうございました。
206デフォルトの名無しさん:2009/10/10(土) 01:10:37
>>204
ローカル変数って、たとえオブジェクト型でもモジュールの出口で自動的に開放されるんじゃないの?
207デフォルトの名無しさん:2009/10/10(土) 03:57:40
礼儀だよ。
208デフォルトの名無しさん:2009/10/10(土) 04:17:30
モジュールが無事終了するとは限らないだろ
209デフォルトの名無しさん:2009/10/10(土) 05:39:19
>>204
いらないよ。

>>207
何の礼儀だよ?

>>208
だから?
210デフォルトの名無しさん:2009/10/10(土) 06:03:58
↑こいつ最高にアホw
211デフォルトの名無しさん:2009/10/10(土) 07:23:40
↓こいつ最高に天才www
212デフォルトの名無しさん:2009/10/10(土) 10:05:40
   ∩――、
  /(゚)丶_ 丶
  / (● (゚)|つ
 | (入_ノ ミ
 | (_/  ノ
  \___ノ゙ー-、
  /\    _ \
(⌒O /\   (_ノ
 \ノ  /  、  )0
213188:2009/10/10(土) 10:16:15
>>196
テストしてみたところ問題なく動きました。
本当にありがとうございます。
214デフォルトの名無しさん:2009/10/10(土) 10:51:27
>>210
羮に懲りて膾を吹く。
アプリ終了前にfreeしまくるがごとし。
215デフォルトの名無しさん:2009/10/10(土) 12:23:40
>>197
>>196を擁護すればSetした方が速いんだよ。
まぁCellsは遅いから、速くしたければ配列だろうけどね。
それからわざわざシート参照の変数をSet 変数 = Nothingとする必要はねーよ。
そんなこと気にするやつは、他にもっと気にすべきことが抜けてる場合がほとんどだ。
216デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/10/10(土) 13:10:30
オブジェクトがデカいと
メモリが少ないようなマシンで
set=nothingしないとその後辛くないかな
何もないなら必要ないだろうけど。
試して言っている訳ではないです。
218デフォルトの名無しさん:2009/10/10(土) 16:16:35
プログラマはsetした後nothingしないなんていわない
219デフォルトの名無しさん:2009/10/10(土) 19:06:03
>>217
Worksheet型のオブジェクト変数はシートを作ってるわけじゃない。
ワークシートへの参照への参照だ。
メモリは32ビットCPUで4バイトだ。
マクロが終了すりゃちゃんと参照カウンタは0になる。
Set ** = Nothingを書くのを否定はしないが、書くのがあたりまえって意見は否定する。
220デフォルトの名無しさん:2009/10/10(土) 20:02:13
書くことを習慣づけろ
221デフォルトの名無しさん:2009/10/10(土) 21:15:43
いらないものを書くやつは馬鹿じゃね?
222デフォルトの名無しさん:2009/10/10(土) 21:18:02
これを習慣づけろっ!て言うことが
礼儀と呼ばれるんだろね
質問なんですが
他に礼儀ってどんなものが有りますか?
223デフォルトの名無しさん:2009/10/10(土) 21:19:16
>>221
如何に記述量を増やすかがプロなんだよ。
最小限で簡潔になんてアマチュアのやること。
224デフォルトの名無しさん:2009/10/10(土) 21:22:39
プロってすごいんだね。
225デフォルトの名無しさん:2009/10/10(土) 21:26:09
うるさい、黙ってNothing書け!
226デフォルトの名無しさん:2009/10/10(土) 21:27:51
なにこの流れww
227デフォルトの名無しさん:2009/10/10(土) 21:36:46
つまり、理由も根拠もないんだが、自分のやりたいことを他人に強制したいときの
エクスキューズが「礼儀」ってことだ。
228デフォルトの名無しさん:2009/10/10(土) 21:45:54
>>215
普通はSetした方が速いが>>196は未宣言のVariant型だから速くはならんね。
Nothing云々より変数宣言が大事だな。
229デフォルトの名無しさん:2009/10/10(土) 21:57:25
つまりプログラムにおいて礼儀とはK&Rであると
230デフォルトの名無しさん:2009/10/10(土) 21:57:50
で、それ百万回実行して何ms違うの?
231デフォルトの名無しさん:2009/10/10(土) 21:59:54
>>217
関数抜けたら解放されるんじゃ?
232デフォルトの名無しさん:2009/10/10(土) 22:02:12
>230
普通なら宣言しないほうが早い
でも場合によってはエラーが引き起こされたりメモリが足りなくなったりする
エラー処理するかどうかなんて人それぞれだし、押し付けるようなもんじゃないんじゃないん
233デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/10/10(土) 22:33:54
これから速度厨と礼儀厨の熾烈な戦いが始まります。
235デフォルトの名無しさん:2009/10/10(土) 22:39:35
>>233
貼りつけているのは、CommandButtonなの?

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

てのが出来るどこれとは違うのかな?
236デフォルトの名無しさん:2009/10/10(土) 22:49:17
10usくらいの差なんてどうでもいいよ
237デフォルトの名無しさん:2009/10/10(土) 22:50:35
おまえらもういいよムリしなくて
速度とかIndexとかVlookupとかピボットとかNothingとか全部ネタのクセに
わかってるからさ!
238235:2009/10/10(土) 22:53:23
同じマクロを呼び出したいのね

ただ
>フォーム上のボタンであれば、
以下の文面では
フォーム上でも同じマクロを呼び出してないけど
それはいいの?
239233:2009/10/10(土) 22:55:20
>>235
そうです。CommandButtonです。

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

シート上に貼りつけて、対象マクロを選択する時ってマクロの登録(N)から
マクロを選択するけど同じのを選択した時に、どのように区別がつけられるのか?
と思いまして質問しています。どうなんでしょうか。
240デフォルトの名無しさん:2009/10/10(土) 22:56:50
>>238

あれは CopyExec というマクロに対して、パラメータとして AまたはBを与えるという意味で
書きました。判りにくくてすいません。
241デフォルトの名無しさん:2009/10/10(土) 23:01:50
>>239
Excel2007じゃないんでなんとも言えないけれど
対象ボタンを右くりっくして
"コードの表示"をすると

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

End Sub
とかできない?
242239:2009/10/10(土) 23:08:48
>>241
ボタンを右クリックして出てくるメニューの一覧が
切り取り
コピー
貼りつけ
------
テキストの編集
------
グループ化
順序
------
マクロの登録
コントロールの書式設定

でコードの標示というのはここからは出来ないみたいですが
243241:2009/10/10(土) 23:12:16
>>242
自分のExcel古いせいかメニューが違うようで

お力になれませんでした! すみません
244デフォルトの名無しさん:2009/10/10(土) 23:41:15
>>242
VBE開いてボタン貼り付けたシートのコードの表示すればいい
245デフォルトの名無しさん:2009/10/10(土) 23:49:31
デザインモードになってないだけじゃないの。
デザインモードにしてボタンをダブルクリックでVBEの画面になる。
246デフォルトの名無しさん:2009/10/11(日) 00:36:01
エクセル2007で質問です。
アドインタブのユーザー 設定のツールバーのところにボタン1、ボタン2を作って、
ボタン1を押したら、ボタン1のEnabledをFalse、2をTrue
ボタン2を押したら1はTrue、2はFalseに設定したはずですが、
ボタン1を押したあと、ボタン2が押せる状態になっていません。タブを切り替えるとなぜかうまくいくんですが。
2007はこういう仕様なんでしょうか
247デフォルトの名無しさん:2009/10/11(日) 00:43:51
またーり行こうぜ
248デフォルトの名無しさん:2009/10/11(日) 00:54:36
タブってリボンのことか?
249デフォルトの名無しさん:2009/10/11(日) 00:59:03
>>239
同じマクロを呼び出した場合、呼び出し元の区別はつかんだろうな
パラメータが指定できるなら そこで区別つけるしかない

あと
フォーム上でもシート上でも
クリックイベントのプロシージャは利用できる
250239:2009/10/11(日) 06:55:15
>>249
>呼び出し元の区別はつかんだろうな

今回は同じマクロを使う事は諦めます。ありがとうございました。
251デフォルトの名無しさん:2009/10/11(日) 07:38:14
それActiveXコントロールのボタンじゃなくて、フォームのボタンだよね。
application.callerでボタンのテキストが取得できるから、それで判断。
252デフォルトの名無しさん:2009/10/11(日) 08:04:41
>>251
MsgBox "呼出し元 " & Application.Caller
でシート上のボタンでも呼出し元を判別する事が出来ました。ありがとう!
253デフォルトの名無しさん:2009/10/11(日) 10:45:19
あー、まだ見てたんだ。よかったよかった。
フォームのボタンに限らず、イベントの発火元は大抵わかるようになってるんだよ。
まぁ、中にはわからにものや、任意のマクロ(イベントハンドラ)を登録できないのもあるけどね。
254デフォルトの名無しさん:2009/10/11(日) 11:46:13
Private Sub CommandButton1_Click()
  MacroA pram:=1
End Sub
Private Sub CommandButton2_Click()
  MacroA pram:=2
End Sub

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

臨床検査学以外で初めて聞いたよ。
まさか一般社会で聞く単語とは思ってもいなかった。
257デフォルトの名無しさん:2009/10/11(日) 18:01:09
ちょっと教えてもらっていいですか?
Cellsの使い方について
このスレでも時々みかけるんですが

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

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

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

本来は、前者であるべきとは思いますが
後者を使った時の弊害ってなにかあります?
258デフォルトの名無しさん:2009/10/11(日) 18:22:07
>>257
人によってはデフォルトプロパティを中途半端に省略したソースを汚いと感じることもある。
自分一人で使うだけなら好きにすればいい。
あとは、タイピング量が数回増えるのも人によっては弊害と考えるかもしれない。
259257:2009/10/11(日) 18:37:12
>>258
結局の所どちらでも結果は一緒なんだから
どちらを使ってもいいんですね

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

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

ありがとうございます
260デフォルトの名無しさん:2009/10/11(日) 20:48:33
凝集度と結合度
261デフォルトの名無しさん:2009/10/11(日) 23:13:40
>>259
また荒れる原因になるかもしれないんだけど、
やっぱりデフォルトプロパティは省略すべきじゃないと思うよ。
range型に代入する時なんか、可読性云々じゃなくて、
後から見て訳が分からなくなる・・・時がある。
262デフォルトの名無しさん:2009/10/11(日) 23:36:28
個人的には最初は省略しないで書いた方がいいと思う。
で、覚えたら好きに書けばいいと思う。
覚えていれば省略しても、普通にも書けるが、覚えてないと普通には書けないと思うよ。
263デフォルトの名無しさん:2009/10/11(日) 23:59:39
者によっては、特にオブジェクトに大量にアクセスする場合など処理が冗長になることがある
原則的に省略しないほうがいいと俺も思うけど、場面場面で使い分けるべきではある
264デフォルトの名無しさん:2009/10/12(月) 00:00:30
C#に移行したいとかVBAが.NETベースになった時の事も考えて、
デフォルトプロパティは省略しない方がいいんじゃないだろうかと言ってみる
それならとばかりにWithステートメントを多用すると、
C#で「面倒臭ぇと」ボヤく事になる罠
265デフォルトの名無しさん:2009/10/12(月) 00:09:21
それもこれも言語の貧弱さが原因なんだよな
266デフォルトの名無しさん:2009/10/12(月) 00:13:01
単純ミス防止でoption explicit とか書くだろ
それと同じで曖昧な表現は極力明確にするほうが良いと思う
どこまでが曖昧な表現かは人によるw
267257:2009/10/12(月) 01:14:57
>>261-266
みなさんありがとうこざいます
やはり省略しない方がよさそうですね
確かに単純なプログラムでは問題なくても
複雑なプログラムになるほど後で見て訳分からなくなりそうですもんね
でも
Itemプロパティぐらいは省略してもいいかなと思ってます(^^
268デフォルトの名無しさん:2009/10/12(月) 06:01:17
セルの値が数値ならValueじゃなくValue2が普通だから、必然的にプロパティは書くことが多いな。
Itemまで書くとくどいよな。
Worksheets.Item("Sheet1")とかCells.Item(1,1)とかする奴はあまりいないな。
269デフォルトの名無しさん:2009/10/12(月) 22:20:08
             /)
           ///)
          /,.=゙''"/
   /     i f ,.r='"-‐'つ____   こまけぇこたぁいいんだよ!!
  /      /   _,.-‐'~/⌒  ⌒\
    /   ,i   ,二ニ⊃( ●). (●)\
   /    ノ    il゙フ::::::⌒(__人__)⌒::::: \
      ,イ「ト、  ,!,!|     |r┬-|     |
     / iトヾヽ_/ィ"\      `ー'´     /
270デフォルトの名無しさん:2009/10/13(火) 16:41:04
A1A2・・・に単語が並んでいて
B1B2・・・にグーグルかヤフーのその単語の検索件数を書き入れていくというような
Webクエリは作れないものでしょうか?
271デフォルトの名無しさん:2009/10/13(火) 18:09:44
>>270
そのままでは件数がクエリで取り出せないので、VBAと組み合わせる必要がある
272デフォルトの名無しさん:2009/10/13(火) 18:18:16
VBA使ってどうすればよいのでしょうか?
ぜひ御教授お願いします。数万の単語の検索に途方にくれています>__<
273デフォルトの名無しさん:2009/10/13(火) 19:14:30
kwsk
274デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/10/13(火) 21:11:13
A,B,C,D なのに A,C がマッチするのかよ。
Instrで文字列内を検索すりゃ良いんでない?

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

使われてる文字の一覧を作って、それを検索して行くのが良いかもな。
文字種類は無限です。って言うなら、俺は降りる。
276デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/10/13(火) 22:05:47
>>274
ヒント モリケン
278デフォルトの名無しさん:2009/10/13(火) 22:12:31
>276

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

にしても説明ヘタだな、君は。
279デフォルトの名無しさん:2009/10/13(火) 22:29:15
人に判り易く自分のやりたい事を説明するっつーのも訓練が必要っすよ。 w

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

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

280デフォルトの名無しさん:2009/10/13(火) 22:33:33
>>275-279
すいませんがんばってみます。
サンプルでもうpすればわかりやすかったかも・
281デフォルトの名無しさん:2009/10/13(火) 23:35:10
1列に必ず同じ文字が入るなら簡単だろ。
この場合は4文字だから、組み合わせは
4C4=1
4C3=4
4C2=6
の11種類しかない。
組み合わせの形がわかるから、その組み合わせを順に行毎にループすりゃいい。

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

>1 ★5
284283:2009/10/14(水) 11:06:50
>2 ★5

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


ただし、こっからが問題ありでヤフーやらぐーぐる(だろ?w)が仕様変更でレイアウトなどを変更したら、それに合わせて
修正必須になる
286デフォルトの名無しさん:2009/10/14(水) 11:13:47
>>282
とりあえずヒントだけ。(環境依存な部分があるので、このままじゃ動かない)

Sub 件数取得()

  kw = "ぬるぽ ガッ"

  Set ObjHttp = CreateObject("Microsoft.XMLHTTP")
  ObjHttp.Open "GET", "http://www.google.co.jp/search?hl=ja&q=" & 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デフォルトの名無しさん:2009/10/14(水) 12:34:58
質問させてください。(Ecel2003)

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

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

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

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

よろしくお願いします。
288デフォルトの名無しさん:2009/10/14(水) 12:41:09
>>287
あくまでも想像だけど、時間がかかっているのは、たぶんセルの内容を1つずつ読み出してるから。
配列に一気に読み込んでから処理すれば、もっと速くなるはず。
289デフォルトの名無しさん:2009/10/14(水) 13:01:44
>>287
Join関数は一次元配列しか指定できないから、二次元から一次元への変換部分だけは
自分で工夫して作るしかない。
290デフォルトの名無しさん:2009/10/14(水) 13:11:04
>>288
違うと思うよ。
単純に連結すりゃだんだんサイズが大きくなってメモリに入りきれなくなり別のメモリ領域をしょっちゅう探して確保しなきゃならないから時間がかかるんだ。
昔は必要なサイズの文字列を用意しておいてMidステートメント(関数じゃない)ではめ込んでいくのが常道だったが、今はJoin関数があるから楽だな。
291デフォルトの名無しさん:2009/10/14(水) 14:21:33
>>286
神様ありがとうございます。
どういうふうな勉強をされたのでしょうか。ネットワーク関係のお仕事など
されているのでしょうか。参考になる本などを教えていただけるとうれしいです☆
ありがとうございます。
292287:2009/10/14(水) 14:26:52
回答ありがとうございました。

一次元に変換してJoinでやってみます。
293287:2009/10/14(水) 15:53:51
度々すみません。
追加で質問させてください。

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

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

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

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

294287:2009/10/14(水) 16:26:40
自己解決。

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

ありがとうございました。
295デフォルトの名無しさん:2009/10/14(水) 16:27:54
>>293
csv形式で保存するんじゃなくて、テキストファイルに出力する
296デフォルトの名無しさん:2009/10/14(水) 17:05:17
動的配列について質問なのですが
googleで検索などしたところ

Dim aaa() as string

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

ReDim aaa(0 to 10)

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

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

配列にデータを入れる際に、データ数カウントしながら入れて
その後ReDimすりゃいいってことですかね??
297デフォルトの名無しさん:2009/10/14(水) 17:10:03
と思ったら、データを入れる段階で「インデックスが範囲外」的なエラーでましたorz

入れる前に範囲決めろとか無茶なんですが・・・そういうのはvbaじゃ無理ですかね?
298デフォルトの名無しさん:2009/10/14(水) 17:17:59
>>296
あとから何度でもサイズを変更できるというのも一種の動的。

>>297
インデックス値を変数に入れておき、データを入れる前に、そのインデックス値を使って
配列をどんどん拡張していけばいい。
ただしReDimを使うと配列の中身がクリアされてしまうので
データを保持したままサイズを変更するにはReDim Preserveを使う必要がある。
VBAでは一般的なテクニック。
299デフォルトの名無しさん:2009/10/14(水) 17:20:39
>>286
繰り返し処理をしていたら400ほどでデータがなくなりました。
ブラウザでグーグルを見ると、あなたは拒絶しますのような画面が出てグーグル
使えなくなりました・・・
どうすれば・・・・・
300デフォルトの名無しさん:2009/10/14(水) 17:23:17
We're sorry...
301デフォルトの名無しさん:2009/10/14(水) 17:25:33
>>299
しばらく待つ
302デフォルトの名無しさん:2009/10/14(水) 17:29:09
>>299
そのサンプルはOpenでコネクションが開きっぱなしだから、まずは1回ごとにCloseしてみ
あとは、まあ連続アクセスは避けるとか。たとえば10秒間隔でアクセスするよう修正してみる
303デフォルトの名無しさん:2009/10/14(水) 17:46:57
Google にクエリを送信すること
をしてはいけないということです・・・

世界のグーグルを怒らせてしまって・・・
304デフォルトの名無しさん:2009/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デフォルトの名無しさん:2009/10/14(水) 18:48:06
>>298
アドバイスありがとうございます

要素数をuboundで数えて、残り少なくなったら配列を拡張するという方法をとってみました
とりあえずはこれでなんとかなりそうです
306デフォルトの名無しさん:2009/10/14(水) 23:45:51
>>305
そんなファジーな使い方をw
かっちりと要素数取得すれば良いんじゃないか?
307デフォルトの名無しさん:2009/10/15(木) 00:12:46
>>299
別に質問でも回答でもないんだけど・・・
グーグルをそういう使い方したらいけないというのがわかって為になったわ
308デフォルトの名無しさん:2009/10/15(木) 03:17:58
ボクも、>>286のプログラムを使ってみた。
http://kabutomo.net/img.php?filename=dc_740000_1_1255544121.png
309デフォルトの名無しさん:2009/10/15(木) 08:30:17
299です。
復旧しました。復旧にはゆがんだ画像の絵のなかの文字を入力
させる画面が二回出てきて、復旧。その後、何回かグーグルを
普通に利用したところ、またゆがんだ絵の文字を入れろと・・・
すっかりブラックリストに載ってしまったみたいです・・・・・

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

それにしてもあなたはグーグルとのこの契約を知っているでしょう
とは・・・・
310デフォルトの名無しさん:2009/10/15(木) 08:59:36
やはりあなたは検索しすぎです
ばいばいおさるさんw
311デフォルトの名無しさん:2009/10/15(木) 11:06:57
>>309
ここから先はネットサービス板あたりの領域かな。
Googleの検索は1時間あたり何回までが限界とかそういうのをきちんと調査した上で、
それを越えないようなプログラムを工夫して作ることになる。
312デフォルトの名無しさん:2009/10/15(木) 11:30:00
ありがとうございます。頼っていたサービスなので非常に怖い思いをしました。
なんか世界から拒絶されたような・・・
手で作業するよりも早ければそれでいいです。一分に5つぐらいのペースのを
つくってみます。一月ほど休むことにします。
プログラマー向けのページには一日5000までとは書いてあったのですが・・・
ヤフーは5万までみたいです。
313デフォルトの名無しさん:2009/10/15(木) 12:03:54
外部にproxy用意して色んなIPから接続してやるのが定番
314デフォルトの名無しさん:2009/10/15(木) 12:11:35
外部にボットを用意して色んなPCから接続してやるのはどうでしょうか。
315デフォルトの名無しさん:2009/10/15(木) 12:41:52
ボットってか
もう
googleを攻撃しないであげて
316デフォルトの名無しさん:2009/10/15(木) 13:47:02
なるほど良く考えたらスクリプトアタックか
317デフォルトの名無しさん:2009/10/15(木) 14:58:17
OS:XP EXCEL2003、2007にて
Ctrl+6 や Ctrl+7といった数字のショートカットキー
を禁止にする方法はありませんでしょうか?
検索しても回答がなく、OnKeyでも拾えないので
困っています。
318デフォルトの名無しさん:2009/10/15(木) 18:03:21
VBAとどのような関係が?
319デフォルトの名無しさん:2009/10/15(木) 20:53:16
>>318
VBAでそのキーを押した際の処理を無効化したいんでしょ。
320デフォルトの名無しさん:2009/10/15(木) 21:27:48
フックは簡単にできるでしょ。

と思いやってみたが本当に拾えないな。
APIにあったと思うけど、スレ的にどうなんだろ。
321デフォルトの名無しさん:2009/10/15(木) 22:20:20
カーネルに入ってなかったっけか。
322デフォルトの名無しさん:2009/10/15(木) 22:23:40
結構前まではAPIの話題が出ただけで拒否反応する人はいたな
ライブラリ参照したりAPI使うのはエクセルVBAの構築手段として十分範囲内だと思うけど
API自体の話でもなければ
323デフォルトの名無しさん:2009/10/16(金) 13:30:41
グーグルって自分ではロボットつかいまくってるのに自分には使わないでというのは
やっぱりおかしいわ
324デフォルトの名無しさん:2009/10/16(金) 15:39:10
325デフォルトの名無しさん:2009/10/16(金) 16:25:15
XP SP3
EXCEL2002

現在、クライアントPCのファイルをデスクトップ上にあるイントラネットショートカットアイコンに
ドラッグアンドドロップでファイルをアップロードしているのですが、
クライアントPCのファイルをイントラネットにアップロードする事はVBAで処理可能でしょうか?
326デフォルトの名無しさん:2009/10/16(金) 17:57:05
VBAでTCP/IPって話は難しいとおもうが
VBAでイントラネットショートカットアイコンにドラッグアンドドロップ相当の
作業を行うのは幾分は簡単かと思う
327デフォルトの名無しさん:2009/10/16(金) 20:17:36
>325
ショートカットアイコンは
何処へのどんなショートカットなの?

サーバとかの共有フォルダへのショートカットなら
VBA使わなくてもって気もするが
あえてVBAなら
FileCopy すればいいだけのような気がするのだけど
そのへんどうなの?
328デフォルトの名無しさん:2009/10/16(金) 20:48:18
質問させてください。

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

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

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

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

よろしくお願いします。
329デフォルトの名無しさん:2009/10/16(金) 21:38:56
>>328
残念ながらVBAだけで一発で検索する方法はない。
検索を第一に考えるなら、2次元配列にデータを入れておき、
必要に応じてワークシートに転送してからワークシート関数で検索するという方法がある。
文字列の長さがすべて一定ならJoinで1つの文字列にまとめてから位置を調べるという手もある。
330デフォルトの名無しさん:2009/10/16(金) 21:41:08
>>328
目的によってはDictionaryオブジェクトが使える場合もある
331デフォルトの名無しさん:2009/10/16(金) 21:49:56
System.Collections.ArrayList
332デフォルトの名無しさん:2009/10/16(金) 22:03:32
配列がとても大きくて順次比較していては時間がかかるって言う事なら
配列のキーの部分が 昇順または降順でソートされているという条件で
古典的なバイナリサーチ手法を使えぱ時間は短縮できる
333デフォルトの名無しさん:2009/10/16(金) 22:08:25
ハイルデータが固定で数が多くないとか、なら連想配列だろうなあ
データ入力時に連想セットできたりするかね
334328:2009/10/16(金) 22:37:34
回答ありがとうございます。

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

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

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

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

336325:2009/10/17(土) 10:22:18
>>326
D&D相当の作業、是非教えて頂きたいです。

>>327
ショートカットアイコンは通常のフォルダアイコンに地球の絵が描かれています。
FileCopyで試すと「パス名が無効です」
FS.CopyFileで試すと「ネットワークパス見つかりません」とエラーが出ます。
パス名は"\\サーバ名\フォルダ"」と間違いないと思うのですが・・・・
337327:2009/10/17(土) 11:16:11
>>336
「パス名が無効です」 だと共有フォルダ名が間違っている可能性があるけど
確認した?
エクスプローラでそのサーバーが見えるなら パス名確認した方が良いかも

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

サーバー系は、ここ数年やってないんで最新バージョンなんかで仕様が変わっていたら
お手上げですが....
338337:2009/10/17(土) 11:19:58
あっチョット訂正

FileCopyの構文で 最後の " が抜けてた
 FileCopy "c:\temp\test.txt", "\\サーバ名\共有フォルダ名\test.txt"
 FileCopy "c:\temp\test.txt", "\\サーバ名\共有フォルダ名\フォルダ名\test.txt"
です
失礼しました (^^汗
339325:2009/10/17(土) 14:59:31
>>337-338
パス名は何回も確認しました。プロパティーからコピペしたので間違えてないはずなんですが。
エクスプローラーのプロパティではパス名「http://サーバ名/フォルダ名」なんで、
「http:」外して/を\に変えたんですけど、根本的に間違ってるんでしょうか。

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

340327:2009/10/17(土) 15:16:03
>>339
プロトコルがhttpなら
>>337の方法は使えないね
341デフォルトの名無しさん:2009/10/17(土) 17:01:58
createobject("shell.application").namespace("http://サーバ名/フォルダ名").copyhere "c:\temp\test.txt"
342325:2009/10/17(土) 17:12:19
>>340
やっぱそうなんですね。
xlsやSLK形式のデータはVBAで上書き保存出来たので、試行錯誤してみたんですが残念です。

>>341
ありがとうございます。試してみた所エラーは出ませんでしたが、コピー出来ていませんでした。
どこか違う所にコピーされたんでしょうかね(゚ー゚;Aアセアセ
343デフォルトの名無しさん:2009/10/17(土) 17:35:43
CreateObject("WScript.Network").MapNetworkDrive "Z:", "http://サーバ名/フォルダ名"
FileCopy "c:\temp\test.txt", "z:\test.txt"
344デフォルトの名無しさん:2009/10/17(土) 17:43:22
>>341
非同期なのかも
msgbox "ちょいと待つ"
345デフォルトの名無しさん:2009/10/17(土) 17:50:48
>>339
sharepointはブラウザ上でみるとhttp://〜のリンクだけど、実際はWEBDAVでやりとりしてるよ。
http://〜のアドレスをコピペして、新しいブラウザに入力してファイルを開いてみ?
読み取り専用になるから。
対して、\\鯖名\〜だと読み書きできる。
「webdav vba」 で検索すると幸せになれるかも
346デフォルトの名無しさん:2009/10/18(日) 11:54:53
excel2007です

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

ループ内でロジックエラーが発生した時にerrに数値を設定してexitさせようと思ってるのですけど
その時にExcelに既に定義されているのとぶつかったら不味いかなと思いまして。
347346:2009/10/18(日) 12:04:34
自己解決

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

とありました。スレ汚しすんません
348デフォルトの名無しさん:2009/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 "http://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デフォルトの名無しさん:2009/10/18(日) 21:33:33
ほれ土日だよ
350デフォルトの名無しさん:2009/10/18(日) 21:36:25
>>348
IEオブジェクトに SendKeys メソッドはないんじゃないの?
そんなことをしなくても、指定のページが開いたら

objIE.document.body.innerText

とすることで現在表示中のページのテキストを文字列として取得できる
351デフォルトの名無しさん:2009/10/18(日) 21:44:59
メッセージからすると
Do While objIE.Busy = True
でエラーになってて開けないんだろ
352デフォルトの名無しさん:2009/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 "http://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デフォルトの名無しさん:2009/10/18(日) 22:03:35
>>348
ではあなたの月火をわたしにください
そうすればあなたに土日をさしあげましょう
354デフォルトの名無しさん:2009/10/18(日) 22:17:16
月火だよー
火憐だぜ
355348:2009/10/18(日) 22:21:19
>>350~352

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

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

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

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


>>353
わかりました。
私のカレンダーから月火を捕まえる為の縄を下さい。
356デフォルトの名無しさん:2009/10/18(日) 22:21:22
>>352
>ほい
だってw
357デフォルトの名無しさん:2009/10/18(日) 22:22:58
保護モード Navigateでぐぐれ
358デフォルトの名無しさん:2009/10/18(日) 22:33:05
>>355
わざと後出ししたな
359デフォルトの名無しさん:2009/10/18(日) 22:41:16
Webクエリをマクロで記録は気に食わないのか?
Sub Macro1()
With ActiveSheet.QueryTables.Add(Connection:="URL;http://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
360348:2009/10/18(日) 22:41:33
>>356
だめか?

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

>>358
すまん


361デフォルトの名無しさん:2009/10/18(日) 22:45:47
webbrowserコンポーネント使えば?
362348:2009/10/18(日) 22:48:17
金曜日の夜からVBAを触り始めまして、WEBクエリという単語は何度か目にしましたが
スルーしてました。

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

残り73分で!
363デフォルトの名無しさん:2009/10/18(日) 23:03:06
OSとIEのバージョンを後出しされてしまったでござるの巻
364デフォルトの名無しさん:2009/10/18(日) 23:06:24
> ちなみにVISTA,IE7,officeXPという環境です。

正直言おう
その環境を再現して動作確認するのが面倒
365デフォルトの名無しさん:2009/10/18(日) 23:11:07
VistaにIE7にOfficeXPって、わざといらない子ばかり集めて何してんの?何かの罰ゲーム?
366デフォルトの名無しさん:2009/10/18(日) 23:17:04
Webクエリで画像まで取り込む方法ってあったっけ?
367デフォルトの名無しさん:2009/10/18(日) 23:24:31
>>348
VBA初めて作る初心者です


初めてでIEからデータ取得なんてできるわけないし、
ここにソースを貼ってもらっても使いこなせるわけ無い


むだ
368348:2009/10/19(月) 00:29:41
できた。

みんなありがとう
369デフォルトの名無しさん:2009/10/19(月) 00:32:13
シートにwebbrowser貼れば?
370デフォルトの名無しさん:2009/10/19(月) 00:59:37
>>368
できたら何がダメだったか原因書こうな
たとえショボミスでも、だ
同じ質問がきたときウザいだろ
371デフォルトの名無しさん:2009/10/19(月) 02:03:39
VBA使いの皆様へ

VBAとExcelは余り相性が良くありません。
VBAをExcelの上で使うとVBAもExcelも下手になることが
多いです。Excelを使う場合は、出来る限りVBAを使わず
シートの上の数式だけでなんとか出来ないか先ず考えま
しょう。
Excelで本格的な大量計算を行うのは向いていません。
Excelは概して計算が早く無いからです。
VBAを学びたいというのであればAccessのほうが
がおすすめです。
372デフォルトの名無しさん:2009/10/19(月) 04:51:58
hagedo
373325:2009/10/19(月) 12:55:44
>>343
ネットワークドライブの割り当てもやってみたんですが、「ネットワーク名がみつかりません」になってしまうんです。

>>341
やってみましたが、結果は変わらずでした。ありがとうございます。

>>342
オフコン系SEなのでWEBDAVとは初耳でした、ありがとうございます。色々調べてみます。
ちなみに新しいブラウザにURL入力しファイルを開いてもhttp://〜のままでした。
374デフォルトの名無しさん:2009/10/19(月) 13:33:05
>>371
WorksheetFunction使えばいいやん
375デフォルトの名無しさん:2009/10/19(月) 13:47:51
userformを見えなくするのに

unload meと
userform1.hide

が有りますけど(他にもあるのか知りませんが)、この違いって何ですか?
376デフォルトの名無しさん:2009/10/19(月) 14:33:00
>>375
hideは見えなくなるだけでまた復活させることができる。例えばテキストボックスの中身とかそのまま残ってる。
unloadは完全に消去
377デフォルトの名無しさん:2009/10/19(月) 16:21:50
>>375
簡単に言うとUnloadはメモリから削除してしまう。
hideは字の如くメモリに残したまま見えなくするだけ。
378デフォルトの名無しさん:2009/10/19(月) 17:22:44
>>376-377
ありがとです。

後で再利用するなら hide もう要らないなら unload ですね。
379デフォルトの名無しさん:2009/10/19(月) 17:47:45
unload 378
380デフォルトの名無しさん:2009/10/19(月) 18:28:22
>>379

379.visible = false
381デフォルトの名無しさん:2009/10/19(月) 19:12:37
ユーザーフォームを印刷しようと思ってるのですが、ユーザーフォーム自体のサイズが大きいのでA4のサイズに納まらずはみ出てしまいます…

A4サイズに縮小して印刷する方法はないでしょうか?

コードはシンプルに
userform1.printform
だけです。
かなりググッたりしてみましたが、良いホムペもなかったので…
382デフォルトの名無しさん:2009/10/19(月) 19:37:40
383デフォルトの名無しさん:2009/10/19(月) 19:43:01
>>381
縮小印刷はプリンタドライバの仕事。機種依存になるので自力で試行錯誤が必要
384デフォルトの名無しさん:2009/10/19(月) 20:33:33
excel2007

リストボックスに3列データを入れる事が出来るようになったとこなんですけど

(1) これタイトルみたいなのを付ける事は出来ないんですか?

コード  商品名  支店 ←付けたいタイトル
9999 xxxxxxxxx xxxxxxx ←データ

みたいな感じで。

(2)
code=Userform1..ListBox1.Text
で選択したコードを拾う事は出来たんですが、この例で商品名を拾うにはどのようにすれば良いのですか?


385デフォルトの名無しさん:2009/10/19(月) 21:22:18
【1 OSの種類      】 Windows XP SP2
【2 Excelのバージョン】 Excel2000
【3 VBAが使えるか  】 4日目 勉強中
【4 VBAでの回答の可否】 可
まだひよっこちゃんですが皆さんよろしくお願います。

マクロの勉強兼ね、エクセルでTOEICの単語帳を作ろうと思っています。
形としましては、
英単語および日本語訳をシートのA、B列に羅列し、
ユーザーフォームで、
英単語用のテキストBOX1、コマンドボタン1、
日本語用のテキストBOX2、コマンドボタン2
暗記済みのチェックボックスが3つ
という構成で、
コマンドボタン1を押すとランダムで英単語が選択され、テキストボックス1に表示
その状態でコマンドボタン2を押すとその訳がテキストボックス2に表示され、
暗記済みの時はチェックボックスにチェックをつけ、3つたまるとその単語は二度と出てこないようにしようと思います。
また、再度ファイルを開いても単語ごとに同じ状態が保存されているようにしたいと思います。

単語数が600あるという設定で、以下のように作ってみましたが、日本語訳表示の時点で詰まってしまいました。
386385:2009/10/19(月) 21:24:01
Private Sub UserForm_Click()
End Sub

Private Sub UserForm_Initialize()
End Sub

Private Sub CommandButton1_Click()
Dim intmax As Integer
Dim intmin As Integer
intmax = 600
intmin = 1
TextBox1.Value = Cells(Int((intmax - intmin + 1) * Rnd + intmin), 1)
End Sub

Private Sub CommandButton2_Click()
TextBox2.Value = TextBox1.Value.Offset(0, 1)
End Sub

CommandButton2 の TextBox2.Value = TextBox1.Value.Offset(0, 1)なんかは
明らかにおかしいかと思いますが、テキストボックス1に表示した、英単語をどのように返せばいいのでしょうか。
Cells(Int((intmax - intmin + 1) * Rnd + intmin), 1)を再度使うと、新たなランダム値を取得してしまうのですしょうか?
かなり初歩的かもしれませんが、紙にプリントしてさっさと単語覚えた方が早いんじゃないかと、焦ってきましたもんで
でも何とか完成させたいので、どなたか以下のいずれでもいいのでご教授ください。

・ランダム値が同じ順序ではなく、常に変化する方法
・チェックが各英単語ごとに反映させる方法
・そのチェックがファイルを閉じても保存される方法
・3回チェック済みの英単語を非表示にする方法(削除ではなく)

よろしくお願いします
387デフォルトの名無しさん:2009/10/19(月) 21:56:18
>>385
・ Cellsを使う時は、シートを指定したほうが良い

・テキストボックス2に日本語訳を返す為に
 英単語を表示する時に使用したセルの行位置を保存しておく
 →モジュールレベル変数を利用する

つー事で下記はいかが?

Private mRow As Integer

Private Sub CommandButton1_Click()
Dim intmax As Integer
Dim intmin As Integer
intmax = 9
intmin = 1
mRow = Int((intmax - intmin + 1) * Rnd + intmin)
TextBox1.Value = Worksheets("sheet1").Cells(mRow, 1).Value
End Sub

Private Sub CommandButton2_Click()
TextBox2.Value = Worksheets("sheet1").Cells(mRow, 2).Value
End Sub
388デフォルトの名無しさん:2009/10/19(月) 22:07:56
今まで快適に使えていたエクセルファイルが、
突然アホみたいに重くなって起動が容易じゃない。
色々調べたけどさっぱり解らない…。
誰か助けてください。

・サイズは600KBほど
・隠れてるオブジェクト無し
・使用範囲以外に隠れデータ一切無し
 (書式設定やリンクなど)
・シート30枚ほど
・モジュールの解放もやってみたが改善せず

389デフォルトの名無しさん:2009/10/19(月) 22:13:45
特定ファイルだけ?
ハードディスクが死にかけてるとか
390デフォルトの名無しさん:2009/10/19(月) 22:18:01
ウィルスチェックoffにして開いてみれ
391デフォルトの名無しさん:2009/10/19(月) 22:19:53
他のファイルのシートと連動させてるようなのだと
ファイルの置き場所変わっただけで
リンク先行方不明連発で死亡とかあるから
Excelきらい
392388:2009/10/19(月) 22:54:19
>389
特定ファイルだけです。
会社で作成したデータ集計用のファイルです。
これ1つだけが異常に重くなり、開く時に
CPU100%を食う状況になっています。

>390
ウィルスチェックoffにすることは出来ないです。
会社で常にネットワーク接続されてるもので…。


393デフォルトの名無しさん:2009/10/19(月) 23:22:01
>>388
ここは Excel VBAスレなんでスレ的に考えると

VBAの処理が 異常に時間がかかってるのでは?
原因として
 ・VBAのコードを変更した為に 異常なループが発生した
 ・元々のVBAのコードにバグがあって あるデータの組み合わせで
  異常なループとなった
とか?

だとすれば
とりあえずオープン時実行するイベント処理停めてみたら?
イベントプロシージャの先頭に Exit Sub を入れてみる
394デフォルトの名無しさん:2009/10/19(月) 23:31:32
>>392
ローカルにコピって
スタンドアロンのPCでテスト汁
さらにウィルスチェックoffにして開いてみれ
395デフォルトの名無しさん:2009/10/19(月) 23:46:05
>>392
xlbファイルを削除する。
CドライブをExcel*.xlbで検索してみて。
396デフォルトの名無しさん:2009/10/19(月) 23:58:33
>>391
そんな使い方しないよ。
397385:2009/10/20(火) 00:54:42
387さんありがとうございます。
値を保存するという便利な方法があったんですね。
勉強になります。おかげさまで単語帳っぽくなりました。

残りのチェックボックスにかかわる部分ですが、もう少し努力してみます。

ただ
・チェックを各英単語ごとに反映させる方法
・3回チェック済みの英単語を非表示にする方法(削除ではなく)
これらがどうにもできそうにないです… すんません

チェックボックスにチェック入れた単語のどこかの列に、何かしら数字など加え
その値を返して、状態を判断することしか思いつかないのですが、
何かもっと良い方法ありますかね?


398デフォルトの名無しさん:2009/10/20(火) 01:21:27
とりあえず出来る方法を思いついたなら、それでやればいい
その方法だとこんな問題がある、とかならそれを質問すればいい
もっと良い方法とか漠然と聞かれると速度房がアップ始めるぞ
399384:2009/10/20(火) 08:16:29
自己解決


(1) これタイトルみたいなのを付ける事は出来ないんですか?
フォームのリストボックスの上方にラベルを配置し、それをタイトルとするように
しました。

(2)code=Userform1..ListBox1.Text で選択したコードを拾う事は出来たんですが、
この例で商品名を拾うにはどのようにすれば良いのですか?

Dim n As Integer

n=UserForm1.Listbox1.ListIndex

xxx = ListBox1.List(n,0)
yyy = ListBox1.List(n,1)
zzz = ListBox1.List(n,2)


以上、スレ汚しでした
400デフォルトの名無しさん:2009/10/20(火) 10:28:27
あらあらこんなに汚しちゃうなんて……イヤラシイ子ね……フフフ
401デフォルトの名無しさん:2009/10/20(火) 12:38:07
ここに速度厨なんている?
俺は速度より美しいか汚いかにこだわるが、たまに速度厨と勘違いされる。
汚いのは遅いって大体決まってるけどな。
そこの君、お前だよw
402デフォルトの名無しさん:2009/10/20(火) 19:25:43
>>385
完成したらサンプル見せてください。お願いします。
403デフォルトの名無しさん:2009/10/20(火) 21:14:22
VBA勉強中の初心者です。
セルA1〜A10まで100
A11に1
この状態で1がある行番号を手に入れたいんですが
結果は2です。
どうやったら11を入手出来るんでしょうか?
Dim rng As Range
Set rng = ActiveSheet.Range("A1:A11").Find(1)
A = rng.Address
B = Rows(A)
404デフォルトの名無しさん:2009/10/20(火) 21:21:06
>>401
誰を煽ってるんだよw
唐突過ぎてわろたわ
405デフォルトの名無しさん:2009/10/20(火) 21:49:07
>>403
100 という文字列での 1の部分でヒットしているみたいね
とりあえず下記ではどう?
Set rng = ActiveSheet.Range("A1:A11").Find(1, LookAt:=xlWhole)
406デフォルトの名無しさん:2009/10/20(火) 21:56:20
Find関数はいろいろとバグがある。
407405:2009/10/20(火) 22:08:06
>>406
たしかに今回の場合だと
セルの表示形式を数値にすると ヒットしなくなるね
408デフォルトの名無しさん:2009/10/20(火) 22:09:02
たしかにオートフィルタとかのVBAの使い勝手がいい
409392:2009/10/20(火) 22:43:00
解決しました。
tmpファイルを全て削除してみたところ、
かなり軽減されましたがまだ反応が鈍かったため、
思い切って新規エクセルに全て
コピーしてみました。

結果、快適に動くようになりました。
おまけにサイズも400kbまで小さくなりました。
410デフォルトの名無しさん:2009/10/20(火) 22:57:36
>405
有難うございます。
明日になってしまいますけど、試してみます。
上手くいったら、その時に
LookAt:=xlWhole
の意味を理解したく教えて下さい。
411デフォルトの名無しさん:2009/10/20(火) 23:29:44
特定の文字列にヒットする条件ならワークシート関数が強力だが
勉強しはじめなら、セルを一個一個確認してループさせる手法からハイルべき
特にエクセルVBAなら
412405:2009/10/20(火) 23:37:10
>>410 & 411

>>411 の意見には賛成です
今回の場合は特に

>>410 の質問の回答ですが

Findは Excel本体の検索とほぼ同じものです
マクロの記録をいろいろしてみると分かると思いますが
"完全に同一のセルだけを検索する"です

それと>>407 へ書いたけど
セルの表示形式が数値だと失敗するかもです
一応 標準形式だとうまく検索できたのだけど
413デフォルトの名無しさん:2009/10/21(水) 07:11:50
Findメソッドは基本的に文字列を検索するもんだ。
まさか数値を検索してバグがあるなんて言ってるんじゃねーだろうな。
414デフォルトの名無しさん:2009/10/21(水) 13:53:11
ちょっと暇なときにVBA勉強しようと思うんですが、勉強するなら2003と2007どっちがいいですか?
415325:2009/10/21(水) 15:09:21
>>382
ありがとうございます。勘違いしてました・・・・
しかし、\\サーバIPにしてもだめでした。

Sub COPY_SAMPLE()
Dim objShell
Dim objFolder

Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace("\\サーバ名\フォルダ名1\フォルダ名2")

If (Not objFolder Is Nothing) Then
objFolder.CopyHere "c:\TEST.txt"
Else
MsgBox "Nothing"
End If

Set objFolder = Nothing
Set objShell = Nothing

End Sub

Nothingのメッセージボックスが出ます・・・
416デフォルトの名無しさん:2009/10/21(水) 15:37:47
>>414
自分が持ってんのがどっちなのかによるでしょ。
今からなら2007の方が良いのかなとは思うけど。
417デフォルトの名無しさん:2009/10/21(水) 16:11:22
>>416
ありがとうございます。持ってるのが2000と2007だったので2007勉強することにしました
418デフォルトの名無しさん:2009/10/21(水) 20:02:12
2000と2007しかもってないのに2003を選択肢にするとは・・・できる
419デフォルトの名無しさん:2009/10/21(水) 20:03:45
>>415
http://q.hatena.ne.jp/1108018134
これでやってみな。
ヒントはきちんといかそうぜ。
420410:2009/10/21(水) 21:43:51
>411-412
上手くいきました。有難うございます。

>413
そのまさかなんですが・・・
なんとか上手くいきました。独学&ヘルプ@2007ではなかなか上達しないですね。今度、本屋行ってきます!
421デフォルトの名無しさん:2009/10/21(水) 22:04:58
いやバグはあるよ。
422デフォルトの名無しさん:2009/10/21(水) 22:09:25
【合法】みんなズッキーニでヘヴン状態しようぜ!!
http://namidame.2ch.net/test/read.cgi/yasai/1223375038/
423デフォルトの名無しさん:2009/10/21(水) 22:51:50
初心者です。質問させてください。
XP、office2000において、onactionで呼び出すsub hogeにsingleの引数を複数渡したいのですが、どのようにすればよいか教えてください。

.onaction("'hoge, arg1,arg2'")

とかだとうまくいきませんでした。
424デフォルトの名無しさん:2009/10/21(水) 23:41:28
select case の使い方についてですが

例えば、A4の値及びB4の値によって条件を分岐させたい時に (A4 1または2 B4 同じく 1または2)
Select Ccase Cells(4,1) Cells(4,2)
case 1 1
case 1 2

end select

みたいな使い方出来ないんですかね?Excel2007では

select case cells(4,1) cells(4,2) でエンター押した瞬間に
エラーになっちまいましたが。
425デフォルトの名無しさん:2009/10/21(水) 23:52:34
二十判定は出来ない
変数とかに格納したり論理結合したり
ただ1か2のどちらかなら、文字列結合すりゃいい
426デフォルトの名無しさん:2009/10/21(水) 23:58:26
>>425
了解しました
427デフォルトの名無しさん:2009/10/22(木) 09:32:17
>>423
.OnAction = ”'hoge””arg1””,””arg2””'”
428デフォルトの名無しさん:2009/10/22(木) 11:55:51
java経験しかないまったくの初心者ですが、質問させてください

列AQの行n1の文字列hoge1を取得して、hoge1を列Cより検索、
発見したらその行n2の列Bの文字列hoge2を列AUのn1のセルに代入
これをAQの行全てで実行したいのです

Cにおいてhoge1が重複することはありません

どうかよろしくお願いいたします
429デフォルトの名無しさん:2009/10/22(木) 12:04:24
vlookup
430デフォルトの名無しさん:2009/10/22(木) 12:21:27
何行あるかしらんが、列全部にvlookupに限らず参照判定関数入れるのは

そーゆーときは配列に流して連想しる
431デフォルトの名無しさん:2009/10/22(木) 13:47:33
Ver.書くのを忘れてました!ごめんなさい

XPでExcel2003です

列Dの行n1の文字列hoge1を取得して、hoge1を列Cより検索、
発見したらその行n2の列Bの文字列hoge2を列Hのn1のセルに代入
これをDの行全てで実行したい、に変更させてください

VBAとExcelマクロの知識が0なんです…
vlookupという関数を使えばいいのですか?
Cは2988行、Dは1284行です

sub test()
dim name as string

for i = 1 to 1284
name = cells(i, 4)
if (vlookup(D$i, C1:C2988, 2, false)) = name then
copy()
pastespecial()

endsub

こんな方向性で大丈夫ですか?
432325:2009/10/22(木) 14:38:41
>>419
そのURLはググってる最中に何度か訪れたんですけど、
ちょっと私には扱えそうもなかったんでスルーしてたんですけど、
頑張って調べながらやってみたら2〜3度エラーが出ましたが、
希望通りアップロード出来ました!誠にありがとうございました。
一年分の便秘が治ったようなすがすがしい気分ですw
433デフォルトの名無しさん:2009/10/22(木) 15:16:28
>>431
no
434325:2009/10/22(木) 15:22:42
>>419
すいません、これってLZHファイルとかは扱えないんでしょうか?
TXTやSLK形式は成功したんですけど、LZH形式はエラーになったんです・・・
435434(325):2009/10/22(木) 15:26:16
自己解決しました。
LZH形式もいけました。ファイル名が不味かったようです。
436434(325):2009/10/22(木) 15:28:23
連投すみません。
LZH形式、エラーこそ出ませんでしたが、解凍すると文字化けしてまいした。
437434(325):2009/10/22(木) 15:46:49
再度自己解決しました。.typeと.charaset外したら正常に解凍出来ました。
スレ汚しすみませんでした。逝ってきます。
438デフォルトの名無しさん:2009/10/23(金) 00:08:18
>>431
言いたい事は分かるんだけどさ。
列Dだの列Hだの、n1だn2だって、そんなのどうでもいいよ。
それで作りたいんだろうけど、読んでて辛いです。
Aから探してBにコピーとかでいいじゃん。組み合わせるだけでしょ。

for i = 1 to 1284
name = cells(i,4).value
set rng = columns(3).find(name)
if not rng is nothing then
rng.offset(0,1).value = rng.value
end if
next

みたいな考え方でやるよ。俺なら。
今ブラウザで書いたんで、動作保障も無し。
439434(325):2009/10/23(金) 09:54:04
>>419さんの方法でアップロード解決したんですが、半角カナ等のファイル名をうpすると、
実行時エラーになります。回避する方法ありますでしょうか?

D&Dでうpすると正常に出来るんですが・・・・
440431:2009/10/23(金) 11:17:12
>>438
わーい!教えていただいたものを道標に調べつつやってみたらできました!
一応完成版を張っておきます

Sub macro()
   Dim code As String
   Dim rng As Range
   Dim name As String

   For i = 2 To 1284
     code = Cells(i, 4).Value
     Set rng = Columns(3).Find(code)
     If Not rng Is Nothing Then
       name = rng.Offset(0, -1).Value
       Cells(i, 9).Value = name
     End If
   Next
End Sub

ありがとうございました!
441デフォルトの名無しさん:2009/10/23(金) 12:20:06
>>439
エンコードでぐぐりな。
442デフォルトの名無しさん:2009/10/23(金) 12:29:34
>>440
そんなんで完成?
Findメソッドの引数が1個だけって大丈夫カヨ
WhatとLookInとLookAtの最低三つは必要じゃないの?
443デフォルトの名無しさん:2009/10/23(金) 13:52:52
>>442
一応ちゃんと動作しましたよ!
今回一回だけ動けばいいマクロなので、結果に間違いがなければOKです!
444デフォルトの名無しさん:2009/10/23(金) 14:17:40
>>443
そりゃたまたまでんがな。
何もいじくってない状態じゃ部分一致だが、それでいいの?
445デフォルトの名無しさん:2009/10/23(金) 14:28:40
本人がOKってんだからいいんじゃね?
446デフォルトの名無しさん:2009/10/23(金) 14:38:09
>>444
う、もしかして上手くいったと勘違いしてるだけなんですかね…
codeはxx01みたいな形で、nameは文字列(重複部分多々あり)なんですが

ちゃんと調べてみます!
447お願いします><:2009/10/24(土) 01:26:35
VBA初心者です。
学校の宿題で
「y=sinXとY=Xの2本の直線で囲まれた面積をVBA関数を用いて求めなさい。」
という問題がでました><
ですが、今日初めてVBAという言葉を聞いたぐらいですので、まったく分かりません( ;∀;)

どなたか記入するコードを教えて頂けないでしょうか?
448デフォルトの名無しさん:2009/10/24(土) 01:45:00
学校の宿題は自分でやらなきゃダメ><
何の前提もなしにそんな宿題が出るはずないから、わからないのは貴方がサボっていたってことでしょ
449デフォルトの名無しさん:2009/10/24(土) 02:20:06
宿題スレ池
450デフォルトの名無しさん:2009/10/24(土) 02:45:13
>>447
これは酷いwww
これが社会に出て行くと思うと末恐ろしいな
451デフォルトの名無しさん:2009/10/24(土) 10:22:29
sinXって直線なのかね
452デフォルトの名無しさん:2009/10/24(土) 10:57:44
>>424
遅レスですが、こんなアイディアも。

Select Case Cells(4,1) & Cells(4,2)
case "11"
case "12"

453452:2009/10/24(土) 10:59:38
>>425 見てなかった… すまん
454デフォルトの名無しさん:2009/10/24(土) 11:43:07
セル参照の計算式

=G5*K3+M1

セル参照+数字の計算式

=F6*G6*3.14

数字のみの計算式

=15*21*45

この数式を区別して色分けする事は可能ですか?
せめて上2つと下1つだけでも区別できればいいんですが
455デフォルトの名無しさん:2009/10/24(土) 11:47:42
>>451
正弦波だから、Y=1 から Y--1 までを往復する曲線かな。
Y=Xの直線とは1点交差するけど、2点とは交差しなんじゃないか?
よくわかんないけどw
456デフォルトの名無しさん:2009/10/24(土) 12:13:36
だいたい2本の直線で囲まれる面積ってなによ
問題の意味すらわかんないならVBA以前の問題
457デフォルトの名無しさん:2009/10/24(土) 12:25:46
非ユークリッド幾何だと日常的
458デフォルトの名無しさん:2009/10/24(土) 12:31:59
大圏航路かよ 何年生の課題だ
459デフォルトの名無しさん:2009/10/24(土) 13:43:37
>>454
手元にPCがないから確認できないけど、今ぱっと思いついた案が1つある。
セルに入力されている数式を取得し、文字列操作関数を使用し演算子の部分で区切る。
区切られた文字列を確認して全てにアルファベットが含まれていれば、セル参照あり、全く含まれていなければセル参照なし。
その他は混合。
どうでしょう?
文系のおいらの考えなので、バカかと思う方はたくさんいると思うけど。
460デフォルトの名無しさん:2009/10/24(土) 13:46:03
>>459だけど一部訂正。
「セル参照あり」→「セル参照のみ」だったよ。
461デフォルトの名無しさん:2009/10/24(土) 15:08:03
問題文を写し間違えただけだろ
Y=sinXとY=Xは3点で交わって、囲まれた領域は2つだ
片方だけ積分して倍すればいい
462デフォルトの名無しさん:2009/10/24(土) 19:24:38
>>459
0.100000000E+00
463デフォルトの名無しさん:2009/10/24(土) 19:26:00
>Y=sinXとY=Xは3点で交わって、囲まれた領域は2つだ

kwsk
464デフォルトの名無しさん:2009/10/24(土) 20:36:00
>>454
セル参照があるかないかだけですが
一つの案として下記なんかはどうでしょうか?

一部の関数を使用していると判定ミスしちゃいますが(DAYS360 とか)

With ActiveSheet.Cells(i, j)
  If (.Formula Like "=*[A-Z][1-9]*") Or (.Formula Like "=*[A-Z]$[1-9]*") Then
       'セル参照を含む数式
       .Interior.ColorIndex = 34
     Else
        'セル参照を含まない数式 又は 定数
        .Interior.ColorIndex = 40
  End If
End With
465デフォルトの名無しさん:2009/10/24(土) 21:22:20
>>462
最初に「=」が付いてるか確認すれば問題ないと思う。
466デフォルトの名無しさん:2009/10/24(土) 22:22:36
0.100000000E+00 +0.100000000E+00
467デフォルトの名無しさん:2009/10/24(土) 22:27:46
絶対に関数は使われていないのだろうか?
468デフォルトの名無しさん:2009/10/24(土) 22:36:56
"=*[A-Z][1-9]*"や "=*[A-Z]$[1-9]*"って何を表してるんですか?
469デフォルトの名無しさん:2009/10/24(土) 22:42:26
性器
470デフォルトの名無しさん:2009/10/24(土) 22:44:17
>>467
そういう話になってくると正規表現?
471デフォルトの名無しさん:2009/10/24(土) 23:17:41
正規表現だと、
*[A-Z]$[1-9]*
の、文末一致or後方参照の $ が説明付かない。
472デフォルトの名無しさん:2009/10/25(日) 00:45:26
userformのtext1に入力された値を使うとき、
userform.text1と書くと思いますが、
text1、text2と順番に参照していきたい時、イメージとしては"text"&i のように変数で指定したいんですがエラーになってしまいます。
何かいい方法はないでしょうか?
473デフォルトの名無しさん:2009/10/25(日) 01:25:10
excel2003でOSはXPです。
ダブルクオーテーションマークが検索したい文章内にある場合どうすればいいのでしょうか。

具体的には
<IMG class="reslevel rf1 level2" alt="きこり レベル 2" src="img/x.gif">
というouterHTMLの文字列に一致したらdo while構文を抜け出すという形にしたいのです。

Do until objIE.document.all.outerHTML = "<IMG class="reslevel rf1 level2" alt="きこり レベル 2" src="img/x.gif">"
という形でダブルクオテーションで括ったのですが「コンパイルエラー」となってしまいます。
どうすれば回避できるか教えていただけないでしょうか。
474デフォルトの名無しさん:2009/10/25(日) 01:25:54
>>472
配列変数を使う(text1とtext2を配列変数に突っ込んで使う)
475464:2009/10/25(日) 01:41:33
>>471

>>464を書いたのは自分だけど
正規表現だと、 $は特殊な意味をもつの?
Like 演算子では特殊な意味をもつようにはHELPに
書かれていなかったんで

.Formula Like "=*[A-Z]$[1-9]* は
=$A$1 とか =A$1 という形式でのセル参照も判定させたいので
付けたんです

もしかして
.Formula Like "=*[A-Z][$][1-9]*"
って書いた方が正解なのかな?
476デフォルトの名無しさん:2009/10/25(日) 02:00:43
>>474
ありがとう
477デフォルトの名無しさん:2009/10/25(日) 02:59:44
478デフォルトの名無しさん:2009/10/25(日) 08:59:51
>>475
だから、正規表現じゃないって言ってるのだよ。

=$A$1 を判定させるマッチパターンは、
pattern = "=\$[A-Z]\$[0-9]"
479デフォルトの名無しさん:2009/10/25(日) 15:58:07
色々教えてもらいここに辿り着きました

1つのフォルダーにあるいくつかのcsvファイルの全てのA列からC列のデータを削除したいのです

そういうvba作ってもらえませんか?
どうかお願いします
480デフォルトの名無しさん:2009/10/25(日) 16:05:55
>>479
>>2の★5を100万回読むんだ
481デフォルトの名無しさん:2009/10/25(日) 16:06:04
了解
待ってな
482デフォルトの名無しさん:2009/10/25(日) 17:02:08
>>479

いくらくれる?
483デフォルトの名無しさん:2009/10/25(日) 22:05:39
>>482
お金は…ないんです(T_T)
484デフォルトの名無しさん:2009/10/25(日) 23:30:41
ユーザーフォームでつくったコンボボックス等をダブルクリックして編集画面を開きます。
ここに標準モジュールで作ったプロシージャをコールしても反映してくれません。
なぜでしょう?
485デフォルトの名無しさん:2009/10/25(日) 23:38:10
・何がしたいのか
・現状どうなっているのか
・それに対する自分の意見
・自分の環境は何なのか(CPU,OS,Office)
・サンプルをアップローダーに。

このくらいは質問するなら情報として欲しいわ。
486484:2009/10/25(日) 23:48:06
なんか勘違いしてたっぽい。
コンボボックスにあらかじめ入れておく項目は標準モジュールからは呼び出せないか。
487デフォルトの名無しさん:2009/10/25(日) 23:54:43
最後疑問系なの
質問?
コンボボックス
リストボックスのリストは標準モジュールで指定出来るでしょ
値を入れておきたいならValueに入れればいいでしょ
488デフォルトの名無しさん:2009/10/26(月) 09:00:41
マクロ記録
エクセルでCSV開く
該当行削除
保存
記録停止


↑で出てた正規表現ってよくわかんないんだが何が出来るの
489デフォルトの名無しさん:2009/10/26(月) 09:57:05
日本語でOK
490デフォルトの名無しさん:2009/10/26(月) 17:17:01
Excel2007 statusbarに関する質問です

Dim oldStatusBar

With Application
.ScreenUpdating = False
oldStatusBar = .DisplayStatusBar
End With

〜処理〜

With Application
.ScreenUpdating = True
.DisplayStatusBar = oldStatusBar
End With

として処理中、statsubarに "現在 " & code & " を処理中"としてcodeを
表示させているのですが、終了後に
"現在 0 を処理中" となります。
これを処理終了後には何も表示させなくしたいのですが、どうすれば
良いのでしょうか。
.DisplayStatusBar = ""とすると、
実行時エラー 13
型が一致しません
となります。

491デフォルトの名無しさん:2009/10/26(月) 20:36:59
>>1の★4に該当しますが、他にいいスレがあったら誘導してください。

Long型の数値からリトルエンディアンByte(4)型に分割したいのですが、どのようにしたらよいでしょうか。
VBだとLong型が8バイトと聞いたので、こちらに質問しました。

よろしくお願いします。
492デフォルトの名無しさん:2009/10/26(月) 22:09:15
1回だけランチしましたが、それっきりで不発です。
どこが変なんでしょ?

CODE

var path='C:/Program Files/Microsoft Office/Office/excel.exe';
var args='';

this.setAttribute('oncommand','this.startProcess("'+path+'","'+args+'")');

this.startProcess=function(path,args){
var file = Components.classes['@mozilla.org/file/local;1']
.createInstance(Components.interfaces.nsILocalFile);
var process = Components.classes['@mozilla.org/process/util;1']
.getService(Components.interfaces.nsIProcess);
file.initWithPath(path.replace(/\//g,'\\\\'));
process.init(file);
process.run(false,[args],1);
}
493デフォルトの名無しさん:2009/10/26(月) 23:13:30
>490

2007は知らんけど2003ならば
Application.StatusBar = False
494デフォルトの名無しさん:2009/10/27(火) 00:26:15
>>491
VBAのLongは4バイトです
8ビットずつマスクとシフトしながら分割してください
495デフォルトの名無しさん:2009/10/27(火) 00:27:36
>>492
VBSはスレチ
496491:2009/10/27(火) 01:21:41
>>494
ありがとうございます。
ただ、そのままするとマイナスの値のときにおかしくなってしまいます。
もうすこし詳しく教えていただけないでしょうか。
497デフォルトの名無しさん:2009/10/27(火) 01:34:34
>>496
MSBだけ別の変数にとっとけばいい
498デフォルトの名無しさん:2009/10/27(火) 01:41:11
492はどうみてもJavaSな件
499491:2009/10/27(火) 16:25:08
>>496
ありがとうござました。
マイナス関係なくできました。
難しく考えすぎてたみたいです。
500デフォルトの名無しさん:2009/10/27(火) 19:39:03
Sub Main()
Dim strPath As String
Dim wkb As Excel.Workbook
Dim wks As Excel.Worksheet
Dim rng As Excel.Range
Dim col As New Collection
strPath = Excel.Application.GetOpenfilename
If strPath = "False" then
Exit Sub
End If
Set wkb =Excel.Workbooks.Open(strPath)
Set wks = wkb.Sheets("Sheet1")
Set rng = wks.Range("A1")
call col.Add(rng)
If Not(wkb Is Nothing) Then
Call wkb.close: Set wkb = Nothing
End If
If col Is Nothing Then
Set rng = col.Item(col.count)
Debug.Print rng.Value
End If
End Sub
'colって、Nothingじゃないの?
'Is Nothingの対象はRange型のcolでは無くて、col自体を対象としてんのかな。
501デフォルトの名無しさん:2009/10/27(火) 20:01:28
Dim col As New Collection
502デフォルトの名無しさん:2009/10/27(火) 22:27:30
XP で2003使ってます。

2003及び2000で動いてくれれば・・

アクセス側から、あるワークシートにおいて、
Set myWKS = myWKB.Worksheets("test")
With myWKS
t = DCount("*", "T1")
.Range("A10").CopyFromRecordset myRS
.Range("A10:D" & t + 9).Select
.Application.ActiveCell.Sort Key1:=Columns("C"), Order1:=xlAscending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlSortColumns, SortMethod:=xlStroke
    .SaveAs "C:\Documents and Settings\Owner\デスクトップ\sample\テスト作成.xls"
    .End With

という処理を行っています。
アクセスを起動後1回目は、ソートが正常に動きますが、2度目以降はうまくソートしてくれません。

次にこのメソッドを使用するときに、引数を指定しなかった場合は、保存されていた値が使用されます。
と、ヘルプにもあるように、ここにひっかかっているのだと考えていますが、
どうにも原因を突き止められません。
どうぞよろしくおねがいします。
503デフォルトの名無しさん:2009/10/27(火) 23:15:04
解決しました。
理由は先ほどエラーが出ていたときは1度目の実行はうまくいくのにエクセルファイルを閉じても
エクセルのプロセスが残ったままになっており2度目はその影響(?)で失敗していました。

コード自体に問題はなく、参照設定のexcelオブジェクトの優先順位を一つ上にあげてやれば、
正常に2度目以降も動くようになりました。

ただ、凄く不安定な正常性ということなので、根本を解決できる何かがあれば
是非アドバイスおねがいいたします。
504デフォルトの名無しさん:2009/10/27(火) 23:45:25
残ってるのはDBSオブジェクトじゃね
エラー出たときとか終わるときにちゃんと閉じてる?
505デフォルトの名無しさん:2009/10/28(水) 00:36:54
そこでした。
オブジェクト指定をしっかり作ったエクセルアプリケーションにしていなかったり、
いきなり.Rangeにしてたりで、タスマネに5個ぐらいEXCELってありましたw

コード多すぎて無理臭いので、クエリのほうから指定することにしました。
以降はいい加減に組まないように注意せねばでした。

ありがとうございました
506デフォルトの名無しさん:2009/10/28(水) 10:55:56
エクセルのマクロの問題に対する質問はここでいいですか??
507デフォルトの名無しさん:2009/10/28(水) 11:13:24
OK
バージョン書いてね
508デフォルトの名無しさん:2009/10/28(水) 13:01:21
ここは宿題かたずけますスレって考えてもいいんですか
509デフォルトの名無しさん:2009/10/28(水) 13:19:44
>>508
質問の内容とタイミングによる
時間帯と曜日によって、宿題は自分でやれってレスが付くだけのこともあるし
VBA厨が喜んでプログラムを作ってくれることもある
510デフォルトの名無しさん:2009/10/28(水) 13:55:04
とりあえず書いてみます
Excel2003

めっちゃ初歩的です…
Do〜LoopかForーNextを使わなければならないみたいです。
1〜10までの整数で
偶数の和をD1
奇数の和をE1
に表示せよ です。
511デフォルトの名無しさん:2009/10/28(水) 14:02:20
ExcelはスプレッドシートソフトでVBAの練習台じゃ
ありません。
VBAの練習をしたいのなら、Accessでやれっつーの
(AccessではExcelでやれっていわれるかも)
てなわけで、Active BASICがVBAと文法互換だったら
いいのになとおねだりしよう

【サーバー各所】ActiveBasicその11【冬眠中】
http://pc12.2ch.net/test/read.cgi/tech/1241316033/
512デフォルトの名無しさん:2009/10/28(水) 15:07:11
>>511
あほか。Access持ってる奴なんてごく少数だろうが。
513デフォルトの名無しさん:2009/10/28(水) 15:22:58
ACCは初めにオブジェクトアクセスを経由する必要があるから、VBAの初学には向かないよ、と思ってる
エクセルなら(初めの内は)オブジェクト志向を意識しないでコードが組める上、マクロの記録がある
マクロの変換じゃなくて、操作をVBAに変換するから、体感出来る点が非常に優位

逆に初めからRecordset操作を理解したほうが後が楽かもしらんけども
514デフォルトの名無しさん:2009/10/28(水) 16:37:27
>>513
VBA扱う場合はやっぱフォームから入るべきだろ。
テキストボックスで入出力でいいじゃん
Excelの場合CellをVBAで扱うのは、VBAだけじゃ不十分で
VBAの基本とExcelの基本が十分出来上がって独立
共存できるようになってからじゃないと両方駄目になる悪寒
Accessの場合はVBAが出来てからテーブルやらクエリ
やら覚えていく方法がとれる。
515デフォルトの名無しさん:2009/10/28(水) 17:06:49
別のスレでやれ
516デフォルトの名無しさん:2009/10/28(水) 18:30:39
VBAを使用してアルバイトの出勤簿を作成しています。
例えば、セルJ6に名前をInputBoxを使って入力した時に、セルJ5にフリガナをカタカナで
自動で表示する場合はどのようにすればよいでしょうか?
517デフォルトの名無しさん:2009/10/28(水) 20:57:08
フリガナにはそれ用のワークシート関数を使う
518デフォルトの名無しさん:2009/10/28(水) 21:23:03
PHONETIC関数でしょうか?
フリガナを表示しないで、氏名(漢字)が表示されてしまいます。
519デフォルトの名無しさん:2009/10/28(水) 21:39:35
大した人数でないなら
名前と読み方リスト作ろうぜ
520デフォルトの名無しさん:2009/10/28(水) 21:44:07
読み方リストを作り、セル参照を使うということですか?
521デフォルトの名無しさん:2009/10/28(水) 21:51:46
でもなんでも
どう料理するかは考えてないけど
テキストボックスに名前入れると読み仮名ラベルに表示するとかかな
522デフォルトの名無しさん:2009/10/28(水) 21:58:13
>>510
宿題なのかな?答え書いたら勉強にならないから、ヒント書いておくね。

for i = 1 to 10 next

if i and 1 = true then 奇数
if i and 1 = false then 偶数

cells(4,1).value = cells(4,1).value + i

がんばって。
523デフォルトの名無しさん:2009/10/28(水) 22:07:25
ワークシート関数を使うことに決めました。
524デフォルトの名無しさん:2009/10/28(水) 22:08:51
Mod 演算子を使わないのは速度厨なせいでつか?
525517:2009/10/28(水) 22:16:47
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1414375849

なるほど、セルに直接入力しない場合で、phoneticを使用する場合は工夫が必要だね
526デフォルトの名無しさん:2009/10/28(水) 22:40:03
ワークシート関数はVBAからでも呼び出せるっちゃ呼び出せる
527デフォルトの名無しさん:2009/10/28(水) 22:49:49
変更して保存
  ↓
Excelを終了
とするにはどういうふうに構文をかけばよいでしょうか?
528デフォルトの名無しさん:2009/10/28(水) 22:59:33
>>527
Application.Quit
529デフォルトの名無しさん:2009/10/28(水) 23:49:49
そういえばかなり前に1からnまでの和をループを回して求めよってのに
For i = 1 To n
Next
和 = (1 + n) * n / 2
みたいなのがあったな。
530デフォルトの名無しさん:2009/10/28(水) 23:53:53
>>522
ビット演算なんて分るやつあまりいないんだから、そういう知ったかぶりの回答はやめましょうね。
531デフォルトの名無しさん:2009/10/29(木) 00:19:50
奇数 = 0
偶数 = 0
For i = 1 To 10 Step 2
  奇数 = 奇数 + i
  偶数 = 偶数 + (i + 1)
Next
Debug.Print 奇数, 偶数
532デフォルトの名無しさん:2009/10/29(木) 00:26:27
>>530
>ビット演算なんて分るやつあまりいないんだから

え!そうなの?
533デフォルトの名無しさん:2009/10/29(木) 00:48:08
>>510
教えてくれとは書いていなかったけど、よかったら参考にしてください。

Sub PlzDoHomeworkByYourself()

Range("D1").Value = 0
Range("E1").Value = 0

' The following was written by someone on the net.

For i = 1 To 10
If (i Mod 2) = 1 Then '2で割り切れない場合(奇数)
Range("E1").Value = Range("E1").Value + i
Else '2で割り切れる場合(偶数)
Range("D1").Value = Range("D1").Value + i
End If
Next

' If you're a teacher, you ought to punish your student who didn't do homework himself.

End Sub
534デフォルトの名無しさん:2009/10/29(木) 01:18:45
>>533

ありがとうございます!!また頼むかもしれませんがよろしくお願いします。
535デフォルトの名無しさん:2009/10/29(木) 01:45:25
Sub Main()
Dim rng As Excel.Range
Dim i As Integer
Set rng = Excel.ThisWorkbook.Sheets("Sheet1").Range("D1")
With rng
'初期化
.Offset(0, 0) = 0 '$D$1
.Offset(0, 1) = 0 '$E$1
For i = 1 To 10
Select Case True
Case (i Mod 2) <> 1 '偶数
.Offset(0, 0) = .Offset(0, 0).Value + i
Case (i Mod 2) = 1'奇数
.Offset(0, 1) = .Offset(0, 1).Value + i
End Select
Next i
'初期化
.Offset(0, 0) = 0 '$D$1
.Offset(0, 1) = 0 '$E$1
i = 1
Do While i < 11
Select Case True
Case (i Mod 2) <> 1 '偶数
.Offset(0, 0) = .Offset(0, 0).Value + i
Case (i Mod 2) = 1'奇数
.Offset(0, 1) = .Offset(0, 1).Value + i
End Select
i = i + 1
Loop
End With
End Sub
536デフォルトの名無しさん:2009/10/29(木) 02:03:47
>>510

For i = 1 To 10
  Cells(1, 4 + (i And 1)) = Cells(1, 4 + (i And 1)) + i
Next
537デフォルトの名無しさん:2009/10/29(木) 09:15:12
>>532
officeのVBAだと使わないしねぇ
vbaだと知ってても使う場面がほとんど無い品
538デフォルトの名無しさん:2009/10/29(木) 09:24:31
>>529
なにそれ面白い


ビット演算とか知識はかろうじてあるけどナニソレ
539デフォルトの名無しさん:2009/10/29(木) 12:14:21
俺ならこうやって高速化するぜ

For i = 1 To n Step n
Next
和 = (1 + n) * n / 2
540デフォルトの名無しさん:2009/10/29(木) 12:21:10
すまんが教えてください

vbaでie制御して、ieのframes(a)内を全選択してコピーしたい。
frames(a)を全選択することが重要で、frames(b)の情報は必要ないし、innerText等での情報取得は避けたい。

ExecWBとSendKeysでやってみたが上手く行かなかった。
やり方に問題があるのか、違う方法があるのか?

教えてください。
541デフォルトの名無しさん:2009/10/29(木) 12:21:25
おれならこうだな

for i = n to n
next
542デフォルトの名無しさん:2009/10/29(木) 12:46:51
速さならこっちかな?

For i = 1 To n
Exit for
Next
和 = (1 + n) * n / 2
543デフォルトの名無しさん:2009/10/29(木) 13:08:40
さすがにこれは反則だろうな

Goto aaa
For i = 1 To n
Next
:aaa
和 = (1 + n) * n / 2
544デフォルトの名無しさん:2009/10/29(木) 13:21:48
和 = (1+n)*n/2
Debug.Print 和

ループ

こうか!
545デフォルトの名無しさん:2009/10/31(土) 10:22:29
質問させてください。(Excel2003 XP)

ExcelでRS-232-C通信を行おうとしております。
大昔に一度、何かを見ながら自作したマクロを参考にやっています。
当時はMSCommを使用しておりましたので、同様にツールボックスから
MSCommをフォームに貼り付けると、
「サブジェクトは指定された操作に対して信頼されていません。」
と表示され、貼り付けることができません。

Webで調べると、どうやら
ActiveX Killbits に対するセキュリティ更新プログラム (KB969898)
を実行したことで使用出来なくなってしまったようです。
対策はこれを削除とのことですが他へ配布したりPC乗り換えごとに
削除して回るのも非現実的です。

MSCommが分かりやすくて簡単ですのでこれを使用したいのですが
更新プログラムの削除や新たに何かをインストールしなくても使用できる
方法はないでしょうか?
また他にWinAPIで行う方法もありましたがこちらで行う方法が主流?
なのでしょうか?

よろしくお願いします。
546デフォルトの名無しさん:2009/10/31(土) 13:10:43

>ActiveX Killbits に対するセキュリティ更新プログラム (KB969898)
>を実行したことで使用出来なくなってしまったようです。
>対策はこれを削除とのことですが他へ配布したりPC乗り換えごとに
>削除して回るのも非現実的です。

>MSCommが分かりやすくて簡単ですのでこれを使用したいのですが
>更新プログラムの削除や新たに何かをインストールしなくても使用できる
>方法はないでしょうか?



自分で何言ってるか分かってる?
547545:2009/10/31(土) 15:21:48
>546

失礼しました。

>MSCommが分かりやすくて簡単ですのでこれを使用したいのですが
>更新プログラムの削除や新たに何かをインストールしなくても使用できる
>方法はないでしょうか?

MSCommのようなコントロールが分かりやすくて簡単ですのでこの様なコン
トロールを使用したいのですが更新プログラムの削除やフリーのアドインなど
をインストールしなくても使用できる方法はないでしょうか?
(MS系の更新インストールや代替コントロールのインストールは可)

WinAPIはサンプルを見てもまださっぱり理解できないので出来れば避け
たいのですが、今から作るのであればコントロールではなくWinAPIで行う
べきでしょうか?

よろしくお願いします。
548デフォルトの名無しさん:2009/10/31(土) 19:18:22
MSCommを使いたいなら対策は「ActiveX Killbits に対するセキュリティ更新プログラム (KB969898)」を削除
549デフォルトの名無しさん:2009/10/31(土) 19:33:45
セキュリティパックとは、古く多少リスキーでありながらも
公開されていたDLLとかの機能を殺してしまってモノシリッ
ク化しつつある疑似カーネル群のコードを間接的に使うように
することだったんでつね
550デフォルトの名無しさん:2009/11/02(月) 11:29:29
551545:2009/11/02(月) 22:21:47
>550

ありがとうございます。
投稿前にこれも試したのですがVB6が入ってないから
ダメと言われました。

WinAPIに挑戦してみます。
ありがとうございました。
552デフォルトの名無しさん:2009/11/03(火) 05:55:57
>>551
EasyCommというモジュールを使うと、素人の自分でも簡単に機能実現出来ました。
553デフォルトの名無しさん:2009/11/03(火) 13:19:49
>>551
VB6のSP6のruntimeのみってvectorとかに無い?
#自分はsp5の使ってるけど
554デフォルトの名無しさん:2009/11/03(火) 13:36:56
Vector のダウンロード数が一番になってるランタイムって、
コメント読んだらシステム破壊の事が書かれてて怖いわw

俺は昨日ソフト更新系のサイトでコレを発見したので入れてみた。

ttp://www.hmpage.jp/vb6rtest.htm

セットアップがVB6のプロジェクトのタイプなので、インストール後に
アンインストールして、ライブラリ類は全残しでいけた。
555デフォルトの名無しさん:2009/11/03(火) 14:58:37
Frameworkさえいれておけば.NETの機能って使えるんだな
最近知ったけどStringBuilderとか使えて便利だ
556デフォルトの名無しさん:2009/11/03(火) 15:35:51
>>555
知らんかった・・・・・
#まともなhash使えるとかなりうれしいなぁ
557デフォルトの名無しさん:2009/11/04(水) 21:19:25
AOD.NET って使える?
558557:2009/11/04(水) 21:20:45
訂正
ADO.NET
559デフォルトの名無しさん:2009/11/04(水) 22:32:00
VBAで使えるのはADOであってADO.NETは使えないんじゃなかった?
俺は2007だけどADOでアクセス(という言い方でいいか)してる。
560デフォルトの名無しさん:2009/11/04(水) 23:40:03
CreateObjectでインスタンスを無理やり生成してやれば使えるんじゃね
まぁ、そこまでしてやるもんでもないと思うしVSTOでも検討した方がいい
561デフォルトの名無しさん:2009/11/07(土) 09:08:12
以前お世話になりました270です。
ネット検索で検索ヒット件数を取得し
A1A2・・・にある単語の件数をB1B2・・・に記録したいのですが、
グーグルでは取得拒否にあってしまい、ヤフーで挑みたいのですが、
送信するのに文字を %5%7 とかにしないといけない(どういうキーワードに
つなげるかもわからない)みたいなのですが、
この送信ワード http://yahoo.co.jp/search??????? %5%6
とかの、?????と 文字の変換方法を教えていただける方いらっしゃいませんでしょう
か?
562デフォルトの名無しさん:2009/11/07(土) 09:13:04
アタックはやめろ
563デフォルトの名無しさん:2009/11/07(土) 09:39:23
yahooのデベロッパーのサイトでは一日5万まで使って開発してくれ
というのです。別段500でもいいから自動化させたいのですが・・・
そこには例文がなくて・・・どこかにフォーラムでもないでしょうか?

http://developer.yahoo.co.jp/webapi/search/websearch/v1/websearch.html
564デフォルトの名無しさん:2009/11/07(土) 11:05:12
Yahoo! JAPAN Web APIはあきらかにスレ違い
565デフォルトの名無しさん:2009/11/07(土) 17:28:03
excel vbaで他のブックのセルデータを参照するにはどうすればよいの?
566デフォルトの名無しさん:2009/11/07(土) 17:30:07
上、ちなみにexcel2003です。
Workbooks(“ブック名.xls”).Worksheets(“シート名”).Activate
これをやっても、インデックスが有効範囲にありませんが出ます。
どなたかお願いします。
     
567デフォルトの名無しさん:2009/11/07(土) 18:13:11
フォームのTextboxにドラック&ドロップで任意の列データを持ってくることはできますか?
やりたいことは、2つの異なるブックのフォームの列データーを他のブックの列データーと比較をしたいのです。

568デフォルトの名無しさん:2009/11/07(土) 20:06:01
>565-567

つマクロの記録
569デフォルトの名無しさん:2009/11/08(日) 00:28:16
B列に1万近くの数値があり、そこから特定の範囲(例えば100〜101など)に適した数値を
指定したセルに抽出し、複数ある場合はそのしたに並べて抽出するようなプログラムを作りたいのですが、
どのようにしたらよいでしょうか?

Excel2003です
570デフォルトの名無しさん:2009/11/08(日) 00:32:48
VBAでRSSの読み込みって出来ますか?
571デフォルトの名無しさん:2009/11/08(日) 09:22:15
>>570
こんなとこで聞くよりgoogleで「VBA RSS」で検索すれば
よっぽど早く結果に到達できますよ。その上でわからないことを
質問したほうが効率的では?
572デフォルトの名無しさん:2009/11/08(日) 09:57:39
>>569
import sys, os
import win32com.client

def main(from_s, from_e, to, rng):
if from_s[1] != from_e[1]:
print 'error'
return
if rng[0] > rng[1]:
print 'error'
return
pwd = os.path.abspath(os.curdir)
xls = win32com.client.Dispatch('Excel.Application')
try:
wb = xls.Workbooks.Open(os.path.join(pwd, 'test1.xls'))
sheet = wb.Sheets(1)
c = 0
for row in range(65535):
if row >= from_s[0] and row <= from_e[0]:
v = float(str(sheet.cells(row, from_s[1])))
if v >= rng[0] and v <= rng[1]:
sheet.cells(to[0] + c, to[1]).value = v
c += 1
wb.SaveAs(os.path.join(pwd, 'testout.xls'))
wb.Close()
except:
print sys.exc_info()
finally:
xls.Quit()

if __name__ == '__main__':
main((10, 2), (20, 2), (3, 5), (99.0, 1000.0)) # B10-B20 -> E3-
573デフォルトの名無しさん:2009/11/08(日) 10:00:45
インデント消えてた orz
import sys, os
import win32com.client

def main(from_s, from_e, to, rng):
  if from_s[1] != from_e[1]:
    print 'error'
    return
  if rng[0] > rng[1]:
    print 'error'
    return
  pwd = os.path.abspath(os.curdir)
  xls = win32com.client.Dispatch('Excel.Application')
  try:
    wb = xls.Workbooks.Open(os.path.join(pwd, 'test1.xls'))
    sheet = wb.Sheets(1)
    c = 0
    for row in range(65535):
      if row >= from_s[0] and row <= from_e[0]:
        v = float(str(sheet.cells(row, from_s[1])))
        if v >= rng[0] and v <= rng[1]:
          sheet.cells(to[0] + c, to[1]).value = v
          c += 1
    wb.SaveAs(os.path.join(pwd, 'testout.xls'))
    wb.Close()
  except:
    print sys.exc_info()
  finally:
    xls.Quit()

if __name__ == '__main__':
  main((10, 2), (20, 2), (3, 5), (99.0, 1000.0)) # B10-B20 -> E3-
574デフォルトの名無しさん:2009/11/08(日) 10:44:08
2003 初心者です。
ワークシートイベントで処理を抜け出すのはどうすれば・・
一度だけ計算させたいんですが。どこかで見た気がするのに探せない。


Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Target.Column = 1 Then
Target.Value = Target.Value + 1
'この後どうすれば・・・・
End If
End Sub
575デフォルトの名無しさん:2009/11/08(日) 11:14:38
>574

どっかのセルに実行済みをセットすれば?
576デフォルトの名無しさん:2009/11/08(日) 12:57:57
>>574
Application.EnableEventsを使うが、実用になるChangeイベントを書くのはかなり難しいよ。
あきらめた方がいいと思うな。
真っ先に考えられる不具合は消した場合でも1になったりすることだな。
問題はこれだけじゃないからかなり難解。
577デフォルトの名無しさん:2009/11/08(日) 13:35:30
>>575-576
どもです。そもそも無茶なことか・・・
初心者ゆえに「出来る・出来ない」が良くわからない

ありがとでした
578デフォルトの名無しさん:2009/11/08(日) 14:05:32
staticでも使え
579デフォルトの名無しさん:2009/11/08(日) 17:28:43
シート起動時に、フォームを出してそれを10秒後で消す。
その10秒の間に、フォーム内のTextboxの値を
ユーザーの任意で変更できるようにと考えましたが、
タイマーしてる間、フォームが白く固まって値変更ができません。
何か改善策はありますでしょうか。2003です。

Private Sub UserForm_Activate()
Dim MyWaitTime As Date
'10秒後に閉じる場合
MyWaitTime = TimeSerial(Hour(Now()), Minute(Now()), _
Second(Now()) + 10)
Application.Wait MyWaitTime 'マクロを指定の時間まで停止
Unload.対象日数の入力フォーム 'UserFormを閉じる
End Sub
580デフォルトの名無しさん:2009/11/08(日) 17:44:47
イベントループ拾わんといかんだろ
581デフォルトの名無しさん:2009/11/08(日) 17:45:47
C言語側で扱うためのバイナリファイルをVBAで出力していて
整数値は除算や剰余算を用いてバイト型配列に代入して出力しているのですが、
浮動小数値(単精度)をバイト型配列に含める場合にどう処理すればいいのか分からず困っています。
良い解決策をご教授頂ければ助かります。
582デフォルトの名無しさん:2009/11/08(日) 18:10:19
583デフォルトの名無しさん:2009/11/08(日) 22:34:13
>>581
配列に入れる理由がファィル出力のためだけなら、いちいち配列など使わずに
ファイルをBynaryモードで開いて整数も実数もそのまま出力してしまえばいい。
ただし、実数の内部表現が異なる場合は使えない。

どうしてもVBAの中で1バイトずつ取り出す必要があるなら、
Win32APIのMoveMemoryを使うぐらいしか方法がない。
584デフォルトの名無しさん:2009/11/09(月) 20:42:51
#ファイル番号 でファイルにバイナリアクセスしている時に、
ストリーム位置を取得する方法を教えてください。
(Cのftell()相当の操作)
585584:2009/11/09(月) 21:06:44
自己解決しました。
Seek( ファイル番号 ) で取得できました。
586デフォルトの名無しさん:2009/11/10(火) 15:17:54
Private Sub UserForm_Initialize()

Dim lastRow As Long
Dim ReturnBook As Workbook, TargetBook As Workbook
Set ReturnBook = ActiveWorkbook
Application.ScreenUpdating = False
Set TargetBook = Workbooks.Open("D:\test\sample.xls")

With TargetBook.Sheets("Sheet1")
' ListBox1.ColumnHeads = True
Me.ListBox1.List = .Range(.Range("B2"), .Cells(.Rows.Count, 2).End(xlUp)).Resize(, 2).Value

ReturnBook.Activate
Application.ScreenUpdating = True
TargetBook.Close
End With
End Sub

削除区分  コード 商品名
0    1001 りんご
1  1002 みかん
0    1003 バナナ

こういう風な外部ブックに対して削除区分が1のデータをリストボックスに
表示しないようにするにはどうすればいいですか?教えてください
587デフォルトの名無しさん:2009/11/10(火) 23:44:43
http://b.hatena.ne.jp/articles/200911/553
会社の仕事でマクロを組むのはズル? 事務作業の効率化に意見さまざま
588デフォルトの名無しさん:2009/11/10(火) 23:48:02
マクロを組むのはズルじゃないが
他人が作ったマクロを勝手に使って
仕事を早く終わらせるのはズルだと思う
少しはリスペクトなりインセンティブなり気を使えと
589デフォルトの名無しさん:2009/11/11(水) 15:13:14
その理屈でいくとPCも電卓もせめて一度は作ってから使えということになるが
590デフォルトの名無しさん:2009/11/11(水) 15:25:27
その理屈でいくと家も会社もせめて一度は作ってから住め(従事)ということになるが
591デフォルトの名無しさん:2009/11/11(水) 22:10:44
シート2の表を、シフト+編集で図のコピーを行い、シート1に貼るマクロを組みましたが、
そのシート1の貼りつけた図のコピーを切り取るマクロを組むと、ピクチャー番号が異なるために、できません。どうすれば、解決できますか?
592デフォルトの名無しさん:2009/11/11(水) 22:21:57
以下のような動作をするマクロって、VBAで作成できますか?
(実現可能性だけ教えて頂ければ、自力でどうにかしたいと思います)

・処理内容
 Outlook2007で、
 特定の件名がついたメールは、メール内容表示の際にボタンを出現させて、
 ボタンを押すことでExcel2007にメールの内容を転記させる。
 例えば、以下のような感じです。

 ■Outlook
  件名:○○見積書
  メール内容:
  ○○費 \50000
  △△費 \100000
   ―――-
  |ボタン|←ポチっとな
   ―――-
 
 ■Excel
  A1セル:○○費
  A2セル:\50000
  B1セル:△△費
  B2セル:\100000
  が転記される
 
 
593デフォルトの名無しさん:2009/11/12(木) 00:23:58
できるっちゃできる
594デフォルトの名無しさん:2009/11/12(木) 00:28:37
シート上に下記のパラメータで長方形のオートシェイプを作りたくて書いたVBAです

Sub 四角形2()

Dim MyShape As Shape
Set MyShape = ActiveSheet.Shapes.AddShape(msoShapeRectangle, 40, 425, 355, 90)

With ActiveSheet.Shapes.Range(MyShape.Name)
.Fill.Visible = msoTrue
.Fill.Solid
.Fill.ForeColor.SchemeColor = 10
.Fill.Transparency = 0.5
End With

End Sub


しかし実際にはWith内で指定したパラメータは常に共通で
位置と大きさのみ違う複数のケースでの長方形を作りたいのです。

With〜End WihtをPrivateFunctionに書いて、MyShapeの値を変えて参照させれば良いですか?

あと自分で書いておいてなんですが(MyShape.Name)は何を表すんでしょう?
595デフォルトの名無しさん:2009/11/12(木) 19:57:22
質問です。
あるフォルダに入っているテキスト形式のデータ10個を
エクセルで開いていくVBAのプログロムを書いている
のですが、エラー文で「データ_i.txtがありません」と表示されます。
私の書いたプログラムは下記です。

Sub テスト()
テスト Macro
Dim i As Integer

For i = 0 To 5
ChDir "C:\Documents and Settings\データ"


Workbooks.OpenText Filename:= _
"C:\Documents and Settings\データ\_i.txt" _
, Origin:=932, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
TrailingMinusNumbers:=True
Next i
End Sub

このプログラムの目的は、テキストデータの入っているフォルダを
他の名前に変更したときも、その中に入っているテキストデータ10個を
エクセルで展開するためです。おそらく
"C:\Documents and Settings\データ\_i.txt"のiの部分が間違えていると
思うのですが、どうすればいいでしょうか?よろしくお願いします。
596デフォルトの名無しさん:2009/11/12(木) 20:10:08
知らんがな(´・ω・`)
597デフォルトの名無しさん:2009/11/12(木) 20:32:33
"C:\Documents and Settings\データ\_" & i & ".txt"
としてやらんといかんのとちゃうかな
598デフォルトの名無しさん:2009/11/12(木) 20:34:03
>595

データさんか?
普通はそこにアカウント名が入るんだが。

まさかとは思うがi.txtのiって・・・w
599デフォルトの名無しさん:2009/11/12(木) 21:00:42
>>このプログラムの目的は、テキストデータの入っているフォルダを
>>他の名前に変更したときも、その中に入っているテキストデータ10個を
>>エクセルで展開するためです。

(・ω・`)???
600595:2009/11/12(木) 21:12:37
みなさんアドバイス感謝です!

説明不足ですみません。

質問ではテキストデータと書きましたが、.datで保存されています。

フォルダの中に「_0.dat」「_1.dat」「_2.dat」…というデータが10個あります。

ほんとは10個開きたいのですが、とりあえず5個開けたら5を10に直せばいいかなと

思ってます。

>>597さん

\データ\_"&i&".dat"としましたが、コンパイルエラーになります。

dat形式のデータは無理なのでしょうか?
601デフォルトの名無しさん:2009/11/12(木) 21:18:41
"C:\Documents and Settings\データ\_" & i & ".txt" _

死ね >>600
602デフォルトの名無しさん:2009/11/12(木) 23:40:30
597見てダメなら何聞いてもダメだろ
スペルミスとかスペース抜けとかで質問されても困る
603デフォルトの名無しさん:2009/11/12(木) 23:56:23
Range("G1").Select の
1をfor文使って
1〜100までするにはどうすればいいでしょうか?

For n = 1 To 100
Range("D&n&").Select
だとエラーになります
604デフォルトの名無しさん:2009/11/12(木) 23:59:00

Range("G1").Select ×
Range("D1").Select ○
605デフォルトの名無しさん:2009/11/13(金) 00:00:00
Range("D" & n).Select

あるいは

Cells(n, 4).Select
606デフォルトの名無しさん:2009/11/13(金) 00:06:08
>>595>>603は同じヤツか?

根本的に・・・
607デフォルトの名無しさん:2009/11/13(金) 00:09:35
ActiveCell.FormulaR1C1 = "=-(R[+&n]C[-2]-R[-4]C[-2])"

R[+&n]を引数にする場合はどうでしょうか?
608デフォルトの名無しさん:2009/11/13(金) 00:49:12
もはやネタだろ
609デフォルトの名無しさん:2009/11/13(金) 00:53:26
ネタじゃないです><
ActiveCell.FormulaR1C1 = "=-R["&n&"]C[-2]-R[-4]C[-2]"
とかやってみたんですがダメでした
610デフォルトの名無しさん:2009/11/13(金) 01:02:20
寝たとしてもまったく面白くない
もっと回答したくなるように質問しろ
611デフォルトの名無しさん:2009/11/13(金) 01:03:42
>>594

AddShapeの引数を変数にして全体をループさせるだけでいいのでは?
共通パラメータをわざわざ関数にする必要はないと思う。

>あと自分で書いておいてなんですが(MyShape.Name)は何を表すんでしょう?
ShapesのRangeプロパティは、指定したShapeのオブジェクトを返す。
この"指定した"というのが今回の場合はMyShape.Nameとなる。

正直わかりにくいし、Rangeなんて使った事無い。
With ActiveSheet.Shapes(MyShape.Name)
もしくは
With MyShape
このどちらかが一般的だと思ってるがどうだろうか。

>>607
>>595>>603に続いて同じ失敗をしている。
>>597を参考にして考えればわかる。
612デフォルトの名無しさん:2009/11/13(金) 10:51:53
変数使ってセル座標の指定するなら、cells使った方が楽だと思ってる。
613デフォルトの名無しさん:2009/11/13(金) 10:57:30
その方が速い
614デフォルトの名無しさん:2009/11/13(金) 14:43:25
すまんが教えてください

vbaでie制御して、ieのframes(a)内を全選択してコピーしたい。
frames(a)を全選択することが重要で、frames(b)の情報は必要ないし、innerText等での情報取得は避けたい。

ExecWBでやってみたけど上手く行かなかった。
SendKeysもいまいちだったし、出来るならやりたくない(違う作業が出来なくなるため)
やり方に問題があるのか、違う方法があるのか?

教えてください。
615デフォルトの名無しさん:2009/11/13(金) 18:44:29
・自分に何かしら不幸な出来事が起きたとき、落ち込んでしまうのは仕方のない話。ショックが大きいほど、
 人前に姿をさらすのも苦痛になるものだが、そういうときの行動こそ、人間の大きさが見えるものかもしれない。

 米シカゴに住む34歳のティアン・ハリスさんは、 10月31日に幸せな花嫁となる予定が、6日前になって相手の
 男性から突然結婚の中止を告げられてしまった。式直前でのまさかの事態だが、さらなる追い打ちを
 かけられてしまう。慌てて母親と一緒にパーティー会場にキャンセルを申し出ると、もう返金は不可能と
 言われたそう。駐車場に座り込み落ち込むハリスさんと、なす術もなく見守る母親。そのとき、向かいに
 あった老人ホームを目にして良いことを思いついた。

 どうせ無駄にするならと、2人は向かいの老人ホームの人たちとパーティーを開こうと決断する。
 「寄付をしたい」とハリスさんが飛び込んだ老人ホームの施設長は、「彼女はここにいる誰も知らないだろうし、
 そんなオファーも受けたことない」(米紙ニューヨーク・デイリーニュースより)と驚いた。かくして、ハリスさんの結婚パーティーは、
 老人ホームのハロウィンパーティーへと変更。お年寄りたちも、思いもよらぬイベントを大いに喜んだという。

 300人近いお年寄りは思い思いに仮装して、ダンスに興じた。あるお年寄りは「とても楽しい時間だった」
 (米放送局CBSより)と語り、老人ホームに素敵なひとときをもたらしたハリスさんに感謝している。施設長も
 「彼女はどこからともなくやってきて、私たちに美しいパーティーを与えてくれた天使」とハリスさんを讃えた。

 会場の傍らでお年寄りの笑顔を見て満足したというハリスさんだが、本当なら自分が主役になるはず
 だったパーティーにやはり心境は複雑だったよう。母親も「会場で、皆さんの前にいるのが娘だったら
 よかった」と無念さを語り、施設長も「彼女は落ち込んでいたと思う」とハリスさんの心中を慮った。
 しかし、そうした中でもお年寄りたちに幸せな時間を与えたハリスさんの人柄に、施設長は「神は彼女を祝福し、
 きっとほかに良い人を見つけられる」と太鼓判を押す。

 ハリスさんは11月2日に、新婚旅行となるはずだったハワイへ1人で旅立ったそう。花嫁になり損ねてしまった
 ハリスさんだが、彼女が取った決断が多くの人に幸せを与えただけでなく、少なからず自分への励みに
 なったことを願いたい。(抜粋)
 http://www.narinari.com/Nd/20091112560.html
616デフォルトの名無しさん:2009/11/13(金) 18:49:15
なげーよ 2行でギブw
617デフォルトの名無しさん:2009/11/13(金) 19:33:04
質問です。
10ページある文書のうち、例えば2、5、7ページだけを印刷したい場合、


Sub 印刷()
Worksheets("文書").PrintOut from:=2, to:=2
Worksheets("文書").PrintOut from:=5, to:=5
Worksheets("文書").PrintOut from:=7, to:=7
End Sub


と、やるのでしょうか?
なにかもっと良い方法がありそうな・・・
OSはVISTA、バージョンは2007です。
618デフォルトの名無しさん:2009/11/13(金) 21:27:48
Sub 印刷()
Worksheets("文書").PrintOut pages:=2,5,7
End Sub
619:2009/11/13(金) 22:01:06
質問させて頂きます。
A1からA100に1から10の数字を入力するマクロを作成
していますが、無限ループになってしまいます。。

どのようにすればよろしいでしょうか?

Sub Ary()
Dim Arow As Long
Dim i As Long

For i = 1 To 600
Cells(i, 1).Value = i
If i = 10 Then
i = 1
End If
Next i

End Sub
620デフォルトの名無しさん:2009/11/13(金) 22:26:21
>>619
個人的には
>For i = 1 To 600
に突っ込みたいが、まじめに答えるとi=10の時にi=1にしろって指示してるので
i=1 → 10 → 1 → 10 → の無限ループになってる
1,2,・・・10,1,2,・・・ と繰り返したいなら cells(i,1)=i%10 みたいに余りを計算すれば良い
(余りの計算は %じゃなくてmodとかかも知れない。忘れた)
621デフォルトの名無しさん:2009/11/13(金) 22:27:52
ごめん
10で割って余りだと0,1,2,・・・,9,0,1,・・・ってなるから1足せ
622デフォルトの名無しさん:2009/11/13(金) 22:57:12
>>619
カウンタ変数(i)をForループの中で書き換えるのは可能な限り避けた方がイイ
何回回ったかわかんなくなっちゃうよ
623デフォルトの名無しさん:2009/11/14(土) 00:02:36
【科学】道路に軍手が落ちているワケ、名城大研究チームが突き止める[09/11/05]

http://namidame.2ch.net/test/read.cgi/hidari/1257990721/


624デフォルトの名無しさん:2009/11/14(土) 00:51:45
>>620
Dim Arow As Longに突っ込めよ
625デフォルトの名無しさん:2009/11/14(土) 04:51:06
e = "& mi &" + 5 * "& c &" - 5

mi、c は変数です。
何がいけないのでしょうか?
626デフォルトの名無しさん:2009/11/14(土) 05:13:52
お前は2chに書き込んではいけない
627デフォルトの名無しさん:2009/11/14(土) 07:43:48
e = mi + 5 * c - 5
じゃダメなの?

変数が文字列の中に含まれちゃってるよ。
ただのmiって文字列としか認識されない。
628デフォルトの名無しさん:2009/11/14(土) 08:59:38
>>619
Sub Ary()
Dim Arow As Long
Dim i As Long
Dim j As Integer

j = 1
For i = 1 To 600
Cells(i, 1).Value = j
j = j + 1
If j > 10 Then
j = 1
End If
Next i

End Sub
こんなものでどないでしょう。
629デフォルトの名無しさん:2009/11/14(土) 09:49:32
Arow ってなんだ
630デフォルトの名無しさん:2009/11/14(土) 10:04:03
正解(>>620-621)が出た後にボケ回答(>>622 >>628)が出てくる、の法則
631デフォルトの名無しさん:2009/11/14(土) 10:12:07
自分よりいい答えが出たのがそんなに悔しかったのか
632デフォルトの名無しさん:2009/11/14(土) 10:15:19
(;゚д゚)ァ
633デフォルトの名無しさん:2009/11/14(土) 10:49:33
>>619
Sub Ary()
Dim Arow As Long
Dim r As Range

For Each r In Range("A1:A100")
r.Value = r.Row Mod 10
Next r

End Sub
こんなものでどないでしょう。
634デフォルトの名無しさん:2009/11/14(土) 10:50:58
ごめん
10で割って余りだと0,1,2,・・・,9,0,1,・・・ってなるから1足せ
635デフォルトの名無しさん:2009/11/14(土) 11:01:07
.Formular1c1="=Average(R["& c &"]C["& d &"]:R["& c+2 &"]C["& d+2 &"])"

のようにRCの中に変数を入れたい場合はどうすればいいのでしょうか?

アドバイスお願いします
636デフォルトの名無しさん:2009/11/14(土) 11:07:03
馬鹿発見
637デフォルトの名無しさん:2009/11/15(日) 01:17:24
四択問題を作っています。

Public Seikai As Integer, i As Integer, Ruiseki As Integer
Sub Quiz()
Dim Det As String
i = 1
Ruiseki = 0

Do

Det = Sheets("Sheet3").Cells(i, 1)
If Det = "" Then Exit Do
UserForm1.Show
i = i + 1

Loop While Det <> ""

UserForm2.Show
'MsgBox "正解は" & Ruiseki & "問です。"

End Sub

sheet3のA列に問題番号、B列に問題、C列に正解番号を入れています。
問題は50問作ったのですが、この中から20問をランダムに表示する
ようにしたいのですが、どのようにしたらいいかわかりません。
今は、50問全て順番に表示されてしまう状態です。
教えてください。
よろしくお願いします。
638デフォルトの名無しさん:2009/11/15(日) 01:45:55
RAND()で適当な番号をふって並び替えて上から20問をつかう
639デフォルトの名無しさん:2009/11/15(日) 13:25:55
>>618
ありがとうございます!
助かりました。
640637です:2009/11/16(月) 00:26:37
>>638
マクロを具体的にどう変更したらいいかおしえてください…
641デフォルトの名無しさん:2009/11/16(月) 08:16:40
>>640
例えば、D列に乱数で適当な数字を振る
D列を見て数の大きい順に20問を出題する

そこまで自分で作ったのなら、これくらいできるだろ?
宿題なら自分でどうぞ
642デフォルトの名無しさん:2009/11/16(月) 11:18:19
マクロが
A
B
C
D
こうあったとして、全てのマクロを実行するマクロを作るにはどうやったらいいですか?
643デフォルトの名無しさん:2009/11/16(月) 11:26:37
全てのマクロを呼び出すマクロを作ればいいだけだろ
644デフォルトの名無しさん:2009/11/16(月) 16:52:03
Sub all_execute()
A
B
C
D
End SUb



wwww
645デフォルトの名無しさん:2009/11/16(月) 20:20:05
私は基本C/C++のPGです。業務でVBAの面倒を見ることになりそうなんですが、
言語仕様がコンパクトにまとまってるような本はないでしょうか?

VBAの仕様なんてたかが知れてるかもしれませんが、分厚い本やWEBサイトをいったりきたりするのは面倒だし
言語に自分の知らない部分があるというのが気持ち悪い性分なので、まとまってる本を探しています(WEBでもいいのですが)

・プログラミングの知識前提で、
・ペラッペラの単色刷りで
・言語使用だけは満足してる
オライリーのクイックリファレンスのVBA版みたいなのが理想です(探したけどなかった)。

VBAの解説本だとプログラミング未経験者向けの、カラフルで妙に分厚い本が多いような気がするのですが
私としてはクイックリファレンス的な本が理想なので…
お勧めの本などあれば教えてください。
646デフォルトの名無しさん:2009/11/16(月) 22:17:54
VBA辞典
647デフォルトの名無しさん:2009/11/16(月) 22:23:14
>>645
マジレスだけどリファレンスとしてはオンラインヘルプ一択
結局ヘルプ以上にならないから初心者向けの分厚いカラー刷りになる
紙がよければ死ぬ気で全部印刷
648637です:2009/11/17(火) 00:26:19
>>641
RAND()で、
B列とC列のくみあわせは変わってしまうことは無いのですか?
649デフォルトの名無しさん:2009/11/17(火) 00:28:24
>>648

ここはマ板ですよ?
650637です:2009/11/17(火) 00:38:30
>>649
死ねクズ
651デフォルトの名無しさん:2009/11/17(火) 00:39:17
>>648
おまえの前にある箱の向こうにも人がいるんだぜ
>>638>>641 も的確な回答してるじゃん
それに対して、あーじゃない、こーじゃない、って・・・
更に質問するんだったら

ありがとう御座います。ヒントを基に組んでみたら、こんな動作をしました。
ここが怪しいと思うので、調べたり試行錯誤したのですが、こんなエラーが出てしまいます。
何かアドバイス頂けないでしょうか?

くらい書いたほうがいんでね?

なんとなくムカつく文章だったので勢いで書いた
652デフォルトの名無しさん:2009/11/17(火) 00:56:42
的確?
653デフォルトの名無しさん:2009/11/17(火) 01:01:43
>>652
的確だと思うぞ。
654デフォルトの名無しさん:2009/11/17(火) 08:15:19
>>653

俺も的確だと思うけどな。
質問する側のレベルが低いんだろw
655デフォルトの名無しさん:2009/11/17(火) 08:40:16
おまいらココ逝って正しいRANDの使い方教えてきやがれ
http://www.nicovideo.jp/watch/sm8517855
656デフォルトの名無しさん:2009/11/17(火) 09:03:50
【社会】スーパーコンピュータ向け「Excel」開発中 - Microsoft
http://tsushima.2ch.net/test/read.cgi/newsplus/1258414484/
657デフォルトの名無しさん:2009/11/17(火) 11:57:24
A2〜A20000ぐらいまで誕生日(シリアル値)が入っています
B列に年齢を出したいときは、どういう計算をすれば軽くなるでしょうか?
古いPC(win95)なのでものすごく時間がかかっています
他のマクロでも応用したいので、教えてください
お願いします!
658デフォルトの名無しさん:2009/11/17(火) 17:49:46
関数にdatedifってのが有るから

=DATEDIF(A2,TODAY(),"y")

で済むと思うけど、どうしてもVBA上から使いたいならworksheetfunctionを付ければ?

659デフォルトの名無しさん:2009/11/17(火) 19:25:58
ワークシートに関数を沢山入れると重くなる、という意味に解釈して
VBAにて
Range("B2").Value = DateDiff("yyyy", Range("A2").Value, Now)
を必要行だけ繰り返す
660デフォルトの名無しさん:2009/11/17(火) 19:54:25
>>643-644
単純に考えればいいってことがわかった気がする
どうも
661デフォルトの名無しさん:2009/11/17(火) 22:22:18
>>660
他のファイルとかに書いてあるのを呼ぶときはスコープが問題になることがあるから気をつけてね
Public宣言付けたり、参照設定したりとか
662デフォルトの名無しさん:2009/11/18(水) 09:58:30
ハイパーリンクに関する質問です。
例えばセルA1に何か文字列が入っている状態で
セルA2に以下のシート関数が入っているとします。
=IF(A1="","",HYPERLINK("http://www.yahoo.co.jp/","Yahoo"))
そうすると、セルA2には"Yahoo"の文字列が表示され
"http://www.yahoo.co.jp/"へのリンクが張られている状態です。

ここで、VBAにより、リンク先である"http://www.yahoo.co.jp/"の文字列を
取得する方法はあるのでしょうか?
セルA2に設定されている関数の文字列を解析するという手もあるとは思いますが、
それ以外で方法はあるのでしょうか?
663デフォルトの名無しさん:2009/11/18(水) 14:09:25
あるんじゃない
664デフォルトの名無しさん:2009/11/18(水) 14:14:34
>>658-659
とてつもなく軽くなりました、ありがとうございました!
665デフォルトの名無しさん:2009/11/18(水) 16:45:42
>>664
>>658の数式でも軽くなったの?
もし重かったら揮発性関数のTODAY()のせいだな。
どこかのセル、たとえばF1にCtrl + ;で今日の日付を求めて
=DATEDIF(A2,$F$1,"Y")とすれば数式でも軽くなるかもよ。
666デフォルトの名無しさん:2009/11/18(水) 22:41:02
1日か31日までの1ヶ月分のシートがあるとします
それぞれのA1セルに日付をいれてます
この1ヶ月分のシートの月曜日と火曜日だけを対象してなんらかの処理を行いたいときはどのような方法を取ればいいでしょう?
よろしくお願いします
667デフォルトの名無しさん:2009/11/18(水) 23:30:02
1日か31日までってことは
1日の場合は前月の2日から一か月分って言う意味?
668デフォルトの名無しさん:2009/11/18(水) 23:32:15
>>666
for each collectionでシートに対してループ回して
その中でA1セルを調べて、曜日をチェック
で、なんらかの処理を行えばOK
669666:2009/11/18(水) 23:36:40
失礼しました
1日から31日までの31シートです

>>66
ぐぐってみます8
670デフォルトの名無しさん:2009/11/19(木) 09:19:43
ワード・アクセスのVBAスレってありませんか?
671デフォルトの名無しさん:2009/11/19(木) 09:24:37
672デフォルトの名無しさん:2009/11/19(木) 11:42:02
ありがとうございます
検索しにくいっす・・
673デフォルトの名無しさん:2009/11/19(木) 19:46:28
WordのVBAはどういうときに使うんだ?
674デフォルトの名無しさん:2009/11/19(木) 20:13:37
時節柄考えられるのは
年賀状宛名流し込み印刷かな
675デフォルトの名無しさん:2009/11/19(木) 20:27:20
それVBAいらないやん
676デフォルトの名無しさん:2009/11/19(木) 21:46:41
差し込み印刷なんかExcel VBAでも同等のことするの簡単だよな。
677デフォルトの名無しさん:2009/11/19(木) 21:49:26
A1セルに1月1日(月)のように入力しています
ここから特定の曜日(火曜日と日曜日など)を区別して処理をおこないたいのですが
どのような方法を取ればよいのかご教授ねがいます
678デフォルトの名無しさん:2009/11/19(木) 22:10:09
>>677
おまえ666だろ
曜日を調べる関数を使う
関数名は自分で調べろ
以上
679デフォルトの名無しさん:2009/11/19(木) 22:43:03
そもそも1月1日(月)って入力するのが間違いだ罠。
1/1と入力して表示形式をm月d日(aaa)にするだけだ。
680デフォルトの名無しさん:2009/11/20(金) 05:56:15
質問
教えてえろい人
エクセルのVBAを使って、Outlookメールを複数の人に自動送信操作をさせたいです。
Aさん(○○○@○○.co.jp)にエクセルSheet1に記載された内容を送信し、
Bさん([email protected])にエクセルSheet2に記載された内容を送信します。
後、CさんにエクセルSheet3を・・・という具合に・・・
以上の事が、エクセルVBAを使って1回だけマクロを走らせるだけで、できるでしょうか?

681デフォルトの名無しさん:2009/11/20(金) 07:34:40
ユーザーフォームのlistviewについて質問です
listviewで縦横のスクロールバーのやり方が分からないのですが
どうすればうまくいくでしょうか?
682デフォルトの名無しさん:2009/11/20(金) 11:22:46
>>680
できるでしょうね
683デフォルトの名無しさん:2009/11/20(金) 11:48:16
てst
684デフォルトの名無しさん:2009/11/20(金) 21:52:10
>>680
ExcelのよりOutlookのVBA使ったらどうよ?
685デフォルトの名無しさん:2009/11/20(金) 22:27:51
同一セル内の数字を下のように並べかえたいのですがどうすればいいですか?
「333      「111
 111   ⇒   333
 555」      555」

3桁ずつ切り分けて別セルに出力、ソートをかけて並べかえるというものは
出来たのですが、出来ればマクロの中だけで処理をしたいんです。
686デフォルトの名無しさん:2009/11/20(金) 23:13:54
>>685
安直だけど、例えばセルA1を対象とするならこんな感じ

Sub Macro1()
a = Split(Range("A1").Value, Chr(10))
For i = 0 To UBound(a) - 1
For j = i + 1 To UBound(a)
If a(i) > a(j) Then
tmp = a(i)
a(i) = a(j)
a(j) = tmp
End If
Next j
Next i
Range("A1").Value = Join(a, Chr(10))
End Sub
687デフォルトの名無しさん:2009/11/20(金) 23:17:11
こんにちわ。
質問をさせてください。

正規表現でのマッチパターンを用いて、
文字列をSplitして配列に入れたいと考えています。
以前javaで行った時は問題無く出来たのですが、
VBAの場合には上手くパターンを認識してもらえません。
下のコードで行ったのですが、”スペース”or","の1回以上の繰り返しでSplitを目的としています。

Sub testVBA()
Dim Reg As Object
Dim regPattern As String
Dim reMatch As Object
Dim i As Integer
Dim STR As Variant

Set Reg = CreateObject("VBScript.RegExp")
Reg.Pattern = "[ ,]+"
STR = Split("moug MOUG,モーグ,,もーぐ", regPattern)
For i = 0 To UBound(STR)
Debug.Print (STR(i))
Next
End Sub

続きます。
688デフォルトの名無しさん:2009/11/20(金) 23:17:20
javaのコードは下で行いました。

import java.util.regex.*;
public class testJava {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("[ ,]+");
String[] strs = pattern.split("moug MOUG,モーグ,,もーぐ");
for (int i=0;i<strs.length;i++) {
System.out.println(strs[i]);
}
}
}

VBAで出来るのであればやり方を教えてくださいませ。
VBAでは対応していないと言う事でも構いません。
何卒よろしくお願いします。
689デフォルトの名無しさん:2009/11/20(金) 23:18:42
すいません・・・。
モーグで質問しようとして準備していた文書を張ってしまいました。
ちなみにマルチポストではありませんので、よろしくお願いします。
690デフォルトの名無しさん:2009/11/21(土) 00:40:26
>>687
VBAのSplitが正規表現を受付けないんじゃないの

s = "123 456 789"
ArySize = 0
Dim Ary()
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "[ ,]+"
Do
ArySize = ArySize + 1
ReDim Preserve Ary(ArySize)
Set Matches = re.Execute(s)
If Matches.Count <> 0 Then
v = Left(s, Matches(0).FirstIndex)
s = Right(s, Len(s) - (Matches(0).FirstIndex + Matches(0).Length))
Else
v = s
End If
Ary(ArySize - 1) = v
MsgBox v
Loop While Matches.Count <> 0
MsgBox Join(Ary, "$")
691687:2009/11/21(土) 08:37:43
>>690
レスありがとうございました。
やはりVBSのオブジェクトですし、VBAのsplitが対応してないのは頷けます。
ソース例の提示、ありがとうございました。
自作関数で対応しようと思います。

重ね重ねありがとうございました。
692デフォルトの名無しさん:2009/11/21(土) 10:02:39
excel2007

ブックに変更が有った時に保存するようにしたいのですが、変更が有ったか無かったかのチェックって
どうするのでしょうか?

保存するのはThiworkbookの閉じる時で

Private Sub Workbook_BeforeClose(Cancel As Boolean)


End Sub

の中に入れれば良いのでしょうけれど。
693デフォルトの名無しさん:2009/11/21(土) 11:15:06
>>692
If WorkBook.Saved = False Then
  '保存処理
End If
694デフォルトの名無しさん:2009/11/21(土) 11:21:38
>>693
thxです!
695デフォルトの名無しさん:2009/11/21(土) 12:50:52
WinVista-Excel2007

VBAでなくActiveXの問題かもしれませんが
VBAの編集中に起きた問題なのでコチラで。

先にActiveXのボタンを配置しVBAで記述したSub{}を実行するという簡単なものを複数作成していたのですが
5・6個作り終えいざ実行してみようとボタンを配置してあるワークシートを開こうとしたところ
ボタンは表示されずエラー(特定のエラー名表示されず)が起きExcelが強制終了してしまいます。

また新規作成でActiveXのボタンを新たに配置しようとしても同じ現象が起こりました。
アドインも複数導入している状態のためもしかするとVBAの可能性も捨てきれないのではと質問させて頂きました。

対処法・解決策はございますでしょうか?
宜しくお願いいたします。
696デフォルトの名無しさん:2009/11/21(土) 13:18:23
>>695
俺は何に原因がわかるかは知らないし、
ActiveXに関係ない話だが俺の話を聞いてくれ

Excel VBAでプログラム作ったんだよ。
クラスとかwitheventsとか使ってね。

そしたらなぜかExcelが強制終了するんだよw
いや、しないときもある。するときもある。
自分のマシンでは強制終了するのに、他のマシンでは動くとか
新しくExcel作ってソース全部移植したら直るんだよ。
でもしばらくするとまた強制終了するようになるんさよ。

原因さっぱりわかんねw
俺は思ったね。Excelで無理しちゃいけねぇ。
単純なマクロ程度で終わらせておくべきだって。
697デフォルトの名無しさん:2009/11/21(土) 13:42:52
>>695
起動時に強制終了するアドインでも作ったんじゃね?
698デフォルトの名無しさん:2009/11/21(土) 14:51:42
>696
わかる
699685:2009/11/21(土) 15:14:26
>>686
出来ました。
ありがとうございました。
700デフォルトの名無しさん:2009/11/21(土) 16:15:33
パチンコ店 ATM8000台 IIJ社 今後4、5年で全国に
http://www.jcp.or.jp/akahata/aik09/2009-11-14/2009111401_04_1.html
2chとパチンコ屋が無くなれば日本の景気は上向くかもな
701デフォルトの名無しさん:2009/11/21(土) 18:55:37
>>695 >>696
俺も似たような現象で悩んでいる。
アドイン複数入れて、VBAでプログラム作って2〜3回動かすのには問題ないんだが
しばらく使ってExcelを終了させると、
「問題が発生したため、Microsoft Office Excelを終了します。ご不便をおかけして申し訳ありません。」
とかいうふざけたエラーが出てくる。

俺の記憶が確かなら、
グローバル変数とか配列を大量に使いだした辺りでぶっ壊れた気がする。
メモリを開放しなきゃいけないとか、そういうことなのか???
702デフォルトの名無しさん:2009/11/21(土) 19:05:46
エクセルのブック自体が変なメモリリークをしてぶっ壊れるってのをよく聞くぜ。
703デフォルトの名無しさん:2009/11/22(日) 00:08:50
>>680
MSのサイトにoutlook使ったメール送信のサンプル見つかると思うから
それを参考にしたら?
Accessに取り込んだ内容を登録したメアドにoutlook使って送信するPG
を昔作ったことがあるから、出来るはずだよ
ウイルス対策用(だろうなぁ・・)で1通単位でダイアログ押という仕様の
回避用のexeも見つかると思うから探してくれい
704デフォルトの名無しさん:2009/11/22(日) 14:29:02
excel 2007
xp sp3

Sheet1のA1にSheet2を参照とした「=SUM(Sheet2!$A$2:Sheet2!$A$3)」を入れる為のマクロ、

Sub test()
Sheet1.Cells(1, 1).Formula = "=SUM(" & Sheet2.Cells(2, 1).Address & " : " & Sheet2.Cells(3, 1).Address & ")"
End Sub

ですと、Sheet1のA1には同一シートを参照とした「=SUM($A$2:$A$3)」となってしまいます。

"=SUM(" & Sheet2.Cells(2, 1).Address & " : " & Sheet2.Cells(3, 1).Address & ")"の部分を
"=SUM(Sheet2!$A$2:Sheet2!$A$3)"にすれば解決するのはわかっておりますが、
どうしてもcellsを使いたく質問させていただきました。
解決策がありましたら、宜しくお願いします。
705デフォルトの名無しさん:2009/11/22(日) 14:39:40
>704

突っ込み所がいろいろと・・・
本題は数式のINDIRECTで解決しそうな気がするが?
706デフォルトの名無しさん:2009/11/22(日) 14:51:06
>>704
Sheet2.Cells(2, 1).Address
が何を返すかを考えればいいんじゃね?

Sheet2.Cells(2, 1).Addressって書き方をするのも珍しい.....
707デフォルトの名無しさん:2009/11/22(日) 19:21:46
プログラミング経験なしで興味を持ち趣味で覚えたいと思い色々考えた結果、
javascriptとvbscriptを学ぼうと思いました。入門するために言語について探しているうちに、
下記のようなことがしてみたいと思ったのですが、出来るのかということと、
もっと適した言語があるのかをご存知であれば助言くださるとうれしいです。

過去の株価を利用したシミュレーションプログラム。
具体的には、データとして興味のある某銘柄の日柄(日別に始値、高値、安値、終値、出来高)
を10年分オープンオフィスの表計算calcにyahooファイナンスから入手しました。
例えば、このデータを使って特定の日にその株を1000株買い、以降10円上がれば売り、売り値から
10円下がればまた買い、その買値より10円下がれば買い増し(仮の現金残高がなくなるまで)し、
それぞれは買値より10円上がると売る。
持ち株がなくなると、高値から1割下がったところからまた始める。
というようなことを繰り返すと、いくらの利益でいくらの買値ので
どれぐらい持ち株になった状態かを結果としてだすものです。

javascriptやvbscriptでも出来るのでしょうか、それとももっと別のスクリプト
言語の方が適しているのでしょうか?
よろしくお願いします。。
708デフォルトの名無しさん:2009/11/22(日) 20:19:54
何か変なヤツが迷い込んでるな〜
709デフォルトの名無しさん:2009/11/22(日) 20:45:53
>>707
ようは売買システムのバックテストしたいんだろ
できるよ

というか言語で出来ることが制約されるケースは少ない
もちろん得意、不得意はあるけど
ってことで好きな言語使いな
そして、このスレ以外に逝け
710デフォルトの名無しさん:2009/11/22(日) 20:56:01
>>707
ExcelVBAがいいんじゃないか?
711701:2009/11/22(日) 20:57:29
>>702
MSのバグかよ。

データはエクセルから取得して、処理は他(とりあえずDelphiを考えている)でやって、
結果をまたエクセルに返すかな・・めんどくさ・・
712デフォルトの名無しさん:2009/11/22(日) 21:10:43
うっはっっw

MSのバグ扱いかよw
713701:2009/11/22(日) 21:26:24
>>712
じゃあ原因は何なんだよ
714デフォルトの名無しさん:2009/11/22(日) 22:12:12
確かに、ウィンドウズもエクセルもMSだな。
そう考えたら、世の中で起きるバグの50%はMSのバグと云っても過言ではない。
715デフォルトの名無しさん:2009/11/22(日) 22:31:13
>>714
だがオレのPCのバグは99%オレのバグと言っても過言ではない

何度PCや開発ソフトのせいにして、その後取り下げたことか・・・
716デフォルトの名無しさん:2009/11/22(日) 22:41:02
>>715
wwwww
717デフォルトの名無しさん:2009/11/22(日) 23:50:32
>>715
まぁ、シンタックスエラーなら仕方ないな。
718デフォルトの名無しさん:2009/11/23(月) 10:52:45
>>510-544
お前らwwwww
今更だけどツボったwwwww
そういうセンスがいるんだなコーディングって俺まだまだだわ。
719デフォルトの名無しさん:2009/11/23(月) 11:34:44
>>707
15マソぐらいとちょっと高いけど、検証くんなどソフトもあるぞ
720デフォルトの名無しさん:2009/11/23(月) 15:05:25
excel2003

こんにちは

For Nextを使い、
セルE5、E6、E7へそれぞれ「H線」「L線」「中心線」という文字を入れたいのですがどうすればよろしいでしょうか?

For i = 1 to 3
Cells(5,i + 4) = ?
next i
721デフォルトの名無しさん:2009/11/23(月) 15:30:19
x = Array("H線", "L線", "中心線")
For i = 1 To 3
Cells(5, i + 4) = x(i - 1)
Next i

初心者の発想はこんな感じ。
722720:2009/11/23(月) 15:45:34
>>721

早速のご回答、誠に有り難うございます。
>>721様のおかげで解決できましたので、心より御礼申し上げます。
723デフォルトの名無しさん:2009/11/23(月) 16:22:36
初心者に配列はいきなりきついんじゃないか?
724デフォルトの名無しさん:2009/11/23(月) 16:31:36
>>720
For-Next使う必要ないじゃん

For i = 1 To 3
Next i
Range("E5").Value = "H線"
Range("E6").Value = "L線"
Range("E7").Value = "中心線"
725デフォルトの名無しさん:2009/11/23(月) 17:07:02
>>723
配列無しで出来る?
俺には思いつかなかった
726デフォルトの名無しさん:2009/11/23(月) 17:21:26
>>724よく見たら笑えるww三回回ってワン

あれは配列のお勉強だったんじゃね?
727デフォルトの名無しさん:2009/11/23(月) 17:32:17
For i = 1 to 3
Cells(5,i + 4) = Iif(i=1,"H線",Iif(i=2,"L線","中心線"))
next i

配列思いつかなくてもできるじゃん不気味で自分はこんなの書きたくないけど。
728デフォルトの名無しさん:2009/11/23(月) 18:01:59
なんでループにすんの?
729デフォルトの名無しさん:2009/11/23(月) 19:07:59
これはどうですか
For i = 1 To 3
Cells(5, i + 4) = Choose(i, "H線", "L線", "中心線")
Next i
730デフォルトの名無しさん:2009/11/23(月) 19:14:19
x = Array("H", "L", "中心")
For i = 1 To 3
Cells(5, i + 4) = x(i - 1) &"線"
Next i
731デフォルトの名無しさん:2009/11/23(月) 19:17:41
vbaにもchoose関数あるの初めて知ったわw
732デフォルトの名無しさん:2009/11/23(月) 19:29:47
同じく、知らんかった。へ〜。。。
733デフォルトの名無しさん:2009/11/23(月) 20:05:46
x = Array("H", "L", "中心")
ReDim y(1 to 1 , 1 to 3 )

For i = 1 To 3
y(1 , i)=x(i - 1) &"線"
Next i

Range("E5:E7")=y


もしもしからなので動くかどうかはしらね
734デフォルトの名無しさん:2009/11/23(月) 21:37:37
>>724
お前>>718だろ?w
735デフォルトの名無しさん:2009/11/23(月) 21:44:02
>>720
>>529流に書くとこうだな。
For i = 1 To 3
Next
Range("E6:E8").Value=WorksheetFunction.Transpose(Split("H線 L線 中心線"))

下が普通だが。
For i = 1 To 3
Next
Range("E6:E8").Value=WorksheetFunction.Transpose(Array("H線","L線","中心線"))
736デフォルトの名無しさん:2009/11/23(月) 21:53:08
おまいらForがかわいそうとかNextが不憫とか思わんの?
737デフォルトの名無しさん:2009/11/23(月) 21:58:09
>>721の一部修正
x = Array("H線", "L線", "中心線")
For i = 1 To 3
Range("E5").Cells(1, i).Value = x(i - 1)
Next i
738デフォルトの名無しさん:2009/11/23(月) 22:02:05
なんだChooseがVBAで使えるのかよ。
俺も知らんかったわ。
739デフォルトの名無しさん:2009/11/23(月) 22:11:42
何もないのに回っているFor-Nextを思うと萌える
740デフォルトの名無しさん:2009/11/23(月) 22:25:43
For i = 1 To 3
Next i
Range("E6:E8").Value = [{"H線";"L線";"中心線"}]
741デフォルトの名無しさん:2009/11/23(月) 22:28:06
Evaluateか、なるほどそれもあるな。
742デフォルトの名無しさん:2009/11/23(月) 22:28:09
Sub 萌()
Do
Loop
Exit Sub
743デフォルトの名無しさん:2009/11/23(月) 22:33:23
>>739
何もなくても行数を稼ぐのが昔はプロの技と言われたもんだぜ
744デフォルトの名無しさん:2009/11/23(月) 22:35:06
ボッタクリの末路は...
745デフォルトの名無しさん:2009/11/23(月) 22:43:56
>>742
無限ループって怖くね?
http://pc11.2ch.net/test/read.cgi/prog/1140435913/
746デフォルトの名無しさん:2009/11/24(火) 00:22:51
  i = 1
Loop1:
  If i > 3 Then GoTo Loop1_End
  Select Case i
    Case 1: Cells(5, 5).Value = "H線"
    Case 2: Cells(5, 6).Value = "L線"
    Case 3: Cells(5, 7).Value = "中心線"
  End Select
  i = i + 1
  GoTo Loop1
Loop1_End:
747デフォルトの名無しさん:2009/11/26(木) 14:22:47
748デフォルトの名無しさん:2009/11/26(木) 15:55:58
>>745
ずーっと萌え続けるからいいんじゃね
749デフォルトの名無しさん:2009/11/26(木) 17:09:50
750デフォルトの名無しさん:2009/11/26(木) 17:39:38
まったくズブの素人です。
これからブイバ初めても間に合いますか?
プログライミングをでけるようになりたいから
手始めにVBAから勉強するのか迷い中です。
何か時代は.NETでブイビーも.NET
それじゃ〜ブイバももう手遅れなんでしょうか?
751デフォルトの名無しさん:2009/11/26(木) 17:47:16
373 デフォルトの名無しさん [] 2009/11/26(木) 17:41:52 ID: Be:
パイソンって強そうな名前ですが、本当につおいのですか?
でもちょっとHでもありますが。。
752デフォルトの名無しさん:2009/11/26(木) 18:39:28

暇人
753デフォルトの名無しさん:2009/11/26(木) 19:17:14
>>750

プログラミング云々以前に日本語を正しく書けるようにしろよ
「プログライミング」とか「ブイバ」とかさ、、、w

それに間に合うとか間に合わないかとかの問題じゃないと思うよ。
Excelでやらせたい事があるんだったらVBAだろうし。
754デフォルトの名無しさん:2009/11/26(木) 20:41:09
>>753
あっプログラミングの間違い、頭ではプログラミングつって
書いた覚えなんだけんど。
そんでブイバって読むんとちゃうんかいな。長いでど
ブイビーエーとでも言うんですか?
田舎もので素人だもんで、そげんこつも誰も教えてくれんから、
愛嬌ということで。。
755デフォルトの名無しさん:2009/11/26(木) 20:49:00
972 デフォルトの名無しさん [sage] Date:2009/11/23(月) 17:09:32  ID: Be:
    ID強制になるだけで静かになるよ

973 デフォルトの名無しさん [] Date:2009/11/23(月) 18:02:02  ID: Be:
    その変更はキミに任せるから提案してくれ。

974 デフォルトの名無しさん [] Date:2009/11/23(月) 18:18:58  ID: Be:
    反対するのは荒らしたい奴だけだから強行しちゃって良いよ
756デフォルトの名無しさん:2009/11/26(木) 21:23:18
↓うーんセフセフのAA
757デフォルトの名無しさん:2009/11/27(金) 21:27:13
↑そのAA持ってないんですいませんがw

Excel2007
テキストボックスについてですが。
MultiLineをtrueに、ScrollBarsをfmScrollBarsBoth
にセットして、データの表示(更新)用に使っています。

表示する時にマウスのホイールボタンでスクロール出来るようには
出来ないのでしょうか?

758デフォルトの名無しさん:2009/11/28(土) 01:08:03
yes we can
759720:2009/11/28(土) 11:55:34
EXCEL 2007

こんにちは

マクロを使い、オートフィルで連続データを作成しているのですが、
書式もオートフィルされてしまい困っています。

値だけをオートフィル(連続データ)するやり方があればご教授ください。
宜しくお願いします。


760デフォルトの名無しさん:2009/11/28(土) 12:12:04
.value
761デフォルトの名無しさん:2009/11/28(土) 12:18:21
マクロの記録でやってんのかな
試したけど無理っぽいから、あきらめてきちんとコードを組む
762デフォルトの名無しさん:2009/11/28(土) 12:40:59
構文 Object.AutoFill(Destination, Type)

設定項目 内容
Object Rangeオブジェクトを指定
Destination オートフィルの書き込み先のRangeオブジェクトを指定
Type 入力されるデータの種類を指定。XlAutoFillクラスの定数を指定

XlAutoFillクラスの定数
・xlFillDefault:標準のオートフィル
・xlFillSeries:連続データ
・xlFillCopy:コピー
・xlFillFormats:書式のみコピー
・xlFillVaules:書式なしコピー
・xlFillYears:年単位
・xlFillMonths:月単位
・xlFillDays:日単位
・xlFillWeekdays:週日単位
・xlLinearTrend:加算
・xlGrowthTrend:乗算
763デフォルトの名無しさん:2009/11/28(土) 13:02:02
でも書式コピー梨、連続(加算)は出来ないっぽいよ
764デフォルトの名無しさん:2009/11/28(土) 16:03:46
たぶんそうだよねー
オートフィルもExcelマクロっぽくて悪くないと思うから
とりあえずオートフィルして書式は別に直すとか
765デフォルトの名無しさん:2009/11/28(土) 18:56:46
質問です。
Excel VBAからワードや他のエクセルファイルの操作ってできますか?
やりたいこととしては、VBAを仕込んだxlsファイルに、
置換したい文章を記述し(置換前と置換後をシート内に記述)、
指定したフォルダ内(サブ含む)にあるエクセルファイルやワードファイルに
書かれている文章を変換したいのです。

その際、「この文章を変換しました」みたいなログも出せたら最高なのですが、
いい方法ってありますか?
766デフォルトの名無しさん:2009/11/28(土) 18:58:00
yes we can
767デフォルトの名無しさん:2009/11/28(土) 19:10:59
>>765
VBAから他のファイルを操作できる

ログは画面にだすならmsgboxでいいでしょ
フィルに書き出したいならテキストファイルでもオープンして書き出せばよい
768759:2009/11/28(土) 20:18:10
>>761>>763>>764
ご回答、ありがとうございます。

やはりむりですか・・・
オートフィル以外でいくつかつくったのですが、スピードを重視したくオートフィルにこだわっていました。
やりたいことは、A1の値を基にB1:B100までA2で指定された増分値に沿った降順連続データをつくりたかったのです。
考えついたものを下記に貼りますので、改善点やより良いコードがありましたらご教授ください。
宜しくお願いします。

Sub test1()
基準値 = Cells(1, 1).Value
増分値 = Cells(2, 1).Value
For i = 0 To 99
Cells(1 + i, 2).Value = 基準値
基準値 = 基準値 - 増分値
Next i
End Sub

Sub test2()
基準値 = Cells(1, 1).Value
増分値 = Cells(2, 1).Value
For i = 0 To 99
Cells(1 + i, 2).Value = 基準値 - i * 増分値
Next i
End Sub

Sub test3()
増分値 = Cells(2, 1).Value
For i = 1 To 100
Cells(i, 2).Value = WorksheetFunction.Sum(Cells(1, 1).Value, Cells(2, 1).Value - i * 増分値)
Next i
End Sub
769デフォルトの名無しさん:2009/11/28(土) 20:28:08
>>767
具体的にはどのようにするんでしょう・・・<ファイル操作
また、AAAという単語はヒットしたので置換したけど、
BBBという単語がない場合、AAAだけ置換したよ、というログとかも取れますか?
770デフォルトの名無しさん:2009/11/28(土) 21:01:43
Excel VBA WEB連携術って本みつけたんだけど誰かレビューしてくれませんか?

ちなみにieを使ったシステムへの自動化を考えてます。
それの助けになるか聞きたいです。
771デフォルトの名無しさん:2009/11/28(土) 21:08:53
>>770
おし引き受けた!


レビュー:
読んだことないけど多分読まないよりましじゃね?
772デフォルトの名無しさん:2009/11/28(土) 23:39:43
>>770
何をやりたいのかもうちょっと詳しく

自動化って言えば聞こえはいいけど、よくよく話を聞いてみると
たいていは株とかFXとかで楽して儲けたいだけみたいなのが多い
773デフォルトの名無しさん:2009/11/28(土) 23:44:31
>>769
例えば、マクロ記録で目的のファイルを開いて、できたブックからシートを自分のシートに移動する
で、移動してきたシートをコピーしといて、どちらか一方を置換する
あとは置換後に双方を比較して、違う部分を表示するとか

他にも方法は山ほどある
まずは自分でアウトラインを固めて、ポイントを絞って質問してくれないと回答しようが無い
774デフォルトの名無しさん:2009/11/28(土) 23:45:54
>>772
まぁ株なりFXの自動売買だろ
そして、この程度も自分で調べてできない人間はロクなシステム組めないに1000ガバス
775デフォルトの名無しさん:2009/11/28(土) 23:57:41
>>773
すいません、大雑把にしか書いてなかったので答えることもできなかったですねorz
仕様としてはこんな感じです。

VBAを記述したExcelに、置換前・置換後を記述したの置換リストをシートとして作成しておきます。
[VBA記述xlsファイル上の置換リスト]
置換前 | 置換後
------------------
ABC   | XYZ
log-in  | log in
login   | log in

そのシート上にフォルダを指定するセルを用意し、ボタンを押す(マクロ実行)ことで、
指定されたフォルダ(サブフォルダ含む)にあるxlsファイル、docファイルを参照。

ヒットしたファイルの中に、置換リストの置換前と同じ文章があった場合、
ログとして「(ファイル名)▲▲を●●に置換」のような情報を出力し、置換を行います。

うまく纏まっていないかもしれないですが、このような仕様でつくりたいと思っています。
ググってみた感じ、ワードファイルの文章置換を行うロジックはあったのですが、
「本当に置換を行ったか」が取得できなさそうな感じがして・・・。
(▲▲があれば●●に置換する、という処理なので、▲▲がなくても変換せずに処理が終わるはず。変換したか?という状態が取れない感じが)
776デフォルトの名無しさん:2009/11/29(日) 00:06:24
このスレはプログラマにとっては有益なスレで
クレクレ君には無益なスレです
テンプレ参照
777デフォルトの名無しさん:2009/11/29(日) 01:18:29
プログラマにとっては有益 ← ここ、笑うところ?
778デフォルトの名無しさん:2009/11/29(日) 01:22:35
ゆとりには笑うとこまで指示してやらんと
779デフォルトの名無しさん:2009/11/29(日) 02:30:54
OSはXP
バージョンは2002です。


単刀直入に聞きます
「ユーザーフォーム上に設置したスプレッドシート」

これをエクセルのシートのように読み込む(ActiveSheet.Range(Cells(1, 1)〜のような書式)ことは可能でしょうか?
780デフォルトの名無しさん:2009/11/29(日) 10:31:56
>>779
可能
781デフォルトの名無しさん:2009/11/29(日) 14:03:26
vistaを使ってると、IE7がプリインストールしてあるためにウェブクエリ取得やIEの操作などが正常に作動しないことがあります。
そこで、windows7にはXPモードがあると聞きました。そのXPモードで使われるIEがバージョン6なのかが気になっています。
IE6を使えるなら早めにwindows7搭載のPCに買い替えるつもりです。どうかお教えください。
782デフォルトの名無しさん:2009/11/29(日) 14:41:08
IE6を使える
783デフォルトの名無しさん:2009/11/29(日) 14:46:46
まずIEはバージョン6

注意事項としてXP Modeは Windows 7 Professional 以降で搭載される。
一般のメーカー製 Windows 7 プレインストールPCはほとんどが Home Premium でXP Modeは搭載されてないので注意

あと、XP Modeといっても特に他アプリと連携するような場合には
正常に動作するか分からないのでできれば事前にどこかで確認してみることをすすめる
おそらく統合機能ってのを使わなければ、ほぼ問題ないとは思うけど、統合機能使わないと XP Mode の利点はあまりないと思うし
784デフォルトの名無しさん:2009/11/29(日) 15:05:34
バーチャルPC使えよ
785781:2009/11/29(日) 17:48:41
やはりMSなりに問い合わせたほうが無難なのですね。
バーチャルPCについて調べてみましたが、これならvistaでもxpを動かせるのですね。インストールして試してみます。
ありがとうございました。
786デフォルトの名無しさん:2009/11/30(月) 15:26:51
Excelの関数の質問なのですが
入力した数字が6〜10のとき○、11〜15のとき◎

   A  B
1  6  ○
2  11 ◎

という風に○や◎を表示させたいのですが、関数がどうしてもわかりません。
どなたかよろしくお願いいたします。
787デフォルトの名無しさん:2009/11/30(月) 15:33:26
VBAと関係ないね
788デフォルトの名無しさん:2009/11/30(月) 15:52:52
すみません、間違えました。
789デフォルトの名無しさん:2009/11/30(月) 19:19:49
Function Maru(n)
  Maru = ""
  If (6 <= n) And (n <= 10) Then Maru = "○"
  If (11 <= n) And (n <= 15) Then Maru = "◎"
End Function
790デフォルトの名無しさん:2009/11/30(月) 22:39:34
リストボックスで数値の項目を右詰めにしたいんですが、どうすればよいでしょうか?
2007です。
791デフォルトの名無しさん:2009/12/01(火) 13:34:59
>>790
作業列使って自分でスペースを追加して、右詰めに見えるようにするしかないみたい
792デフォルトの名無しさん:2009/12/01(火) 22:39:45
ユーザーフォームのリストボックスで、multiselectにしているんですが、
デフォルトでチェックを入れることってできますか?
793デフォルトの名無しさん:2009/12/02(水) 18:53:27
initialize
794デフォルトの名無しさん:2009/12/03(木) 00:32:24
TextToColumnsについて質問です。

スペース区切りをセル区切りにした時に、数値として
認識されてしまい、頭の0が消えてしまいます。

数値を文字列として認識させる方法はありますでしょうか。

例)
Sub hoge()
Cells(1, 1).Select
Selection.TextToColumns DataType:=xlDelimited, _
Space:=True
End Sub

実行前
A1 B1
hoge 012|

実行後(B1に"012"と表示させたい)
A1 B1
hoge | 12

以上、宜しくお願いします。
795デフォルトの名無しさん:2009/12/03(木) 01:27:05
>>794
書式で"000"にするとか、書式で文字列にするとか
796デフォルトの名無しさん:2009/12/03(木) 04:45:21
>>794
アポストロフィ012
797デフォルトの名無しさん:2009/12/03(木) 08:27:20
>>794
Selection.TextToColumns Space:=True, FieldInfo:=Array(Array(2, 2))
798デフォルトの名無しさん:2009/12/03(木) 10:06:19
ExcelVBAからファイルの作成日や作成者情報を変更・削除って可能?
799デフォルトの名無しさん:2009/12/03(木) 18:30:35
>>798
ファイルってExcelのファイル限定?
それともあらゆるファィル?
800794:2009/12/03(木) 21:52:17
>>797
出来ました!
有難うございました。
801デフォルトの名無しさん:2009/12/04(金) 10:09:56
>>799
想定ではあらゆるもの
テキストとかじゃなく、他のアプリで作られるファイルとかが対象かな
GIFとかZIPとか
802デフォルトの名無しさん:2009/12/04(金) 10:47:50
>>801
それ不可能
803デフォルトの名無しさん:2009/12/04(金) 11:12:35
>>802
やっぱ不可能か・・・。助言どもです。
804デフォルトの名無しさん:2009/12/04(金) 21:17:59
>>798
変更はともかく削除はできるよ
多少問題は出るけど
まぁ大した欠点ではないよ
元ファイルのデータが一部失われるってことくらい
805デフォルトの名無しさん:2009/12/04(金) 23:41:53
>>804
「変更・削除」だっつってんだろ!
使えねぇヤツだな〜
806デフォルトの名無しさん:2009/12/05(土) 00:05:36
ドスン
807デフォルトの名無しさん:2009/12/05(土) 13:11:13
vbaエディターに関する質問なんですが
hogehoge(
とかまで書いて
引数コピペのために上の行にいこうと矢印キーで移動しようとすると

コンパイルエラー:
修正候補:式

とか出てきてうざいんだが
これを出さないようにする方法とかないですかね・・・
808デフォルトの名無しさん:2009/12/05(土) 13:47:44
>>807
ツール → オプション → 自動構文チェック
色が変わるだけでダイアログが出なくなる
色も変わらないようにする方法は知らん
809デフォルトの名無しさん:2009/12/05(土) 14:01:42
>>808

ありがと!
かなり楽になった
810デフォルトの名無しさん:2009/12/05(土) 22:57:10
【1 OSの種類         .】 Windows XP SP3
【2 Excelのバージョン   】 Excel2007
【3 VBAが使えるか    .】 勉強中

GetSaveAsFilenameメソッドで名前を付けてブックを保存し、
そのファイル名を変数に代入して別のサブルーチンから
そのブックのあるシートをアクティブにしようとしたら
「インデックス範囲が有効範囲にない」っていうエラーが出ます。
プロシージャは

sub 1()
myFile = Application.GetSaveAsFilename
Workbooks.Add
ActiveWorkbook.SaveAs myFile
End sub

sub 2()
Workbooks(myFile).WorkSheets(1).Activate
End sub

みたいな感じです。myFileはモジュールレベルで宣言してて、
Sub 2でMsgBox関数でmyFileの値を調べたら
フルパス+ファイル名.xlsになっててちゃんと開けそうな
気がするんだけどエラーが出る…orz

しょぼい質問ですが是非アドバイスをお願いします。
811デフォルトの名無しさん:2009/12/06(日) 00:16:40
一旦閉じてないなら
フルパスじゃなくファイル名だけでないかな
812デフォルトの名無しさん:2009/12/06(日) 00:29:29
>>810
ブックに対してならアクティブにできるの?
813デフォルトの名無しさん:2009/12/08(火) 18:14:39
>>780
ありがとうございます!
詳しく書くと
ユーザーフォーム上スプレッドシートのセルA1に"○"を表示

それをキーボードの矢印キーで制御
移動先のセルが""でなければ移動できない



というようなプログラムを考えてました!
814デフォルトの名無しさん:2009/12/08(火) 23:05:46
なんだそのロープレ
815デフォルトの名無しさん:2009/12/09(水) 01:49:49


Sub A123〜A244をB1〜B123に移し替え・・・()


Sheet1("Sheet1").Active

Dim i As Integer

i = 2

Do

Sheet1("Sheet1").Range(Cells(123, 1), Cells(244, 1)) _
.Cut Destination:=Sheet1("Sheet1").Cells(1, i)

Sheet1("Sheet1").Range(Cells(123, 1), Cells(244, 1)) _
.Deleat Shift:=xlShiftUp

i = i + 1

Loop While Cells(123, 1).Value <> " "

End Sub

i = 2の場所で実行時エラー'438' オブジェクトは、このプロパティまたはメソッドをサポートしていません。
となってしまい、実行できません。解決方法を教えていただけませんか?

816デフォルトの名無しさん:2009/12/09(水) 02:24:17
.Cut Destination:=の前がセル範囲で後がセル単体だな
でもエラーは i = 2 で出るのか
as integer を外してみれ
817815:2009/12/09(水) 02:40:43
>>816

レスありがとうございます。

Dim i

Cut Destination:=Sheet1("Sheet1").Renge(Cells(1,i), Cells(123,i)

にしても、やはり同様のエラーが出てしまいました。
818デフォルトの名無しさん:2009/12/09(水) 02:50:36
Sheet1("Sheet1")→Sheets("Sheet1")でどうだろう
819815:2009/12/09(水) 03:14:20
始めたばかりなので、思い違いをしている可能性があるので、確かめさせてください。
Microsoft Excel Objectsの下にあるSheet1(aiueo)というファイルにプログラムを適用したい場合、
Module1のGeneralに下記のコードを書けばいいんですよね?


Sub コピー()

Sheet1("aiueo").Active

Dim i

i = 2

Do

Sheet1("aiueo").Range(Cells(123, 1), Cells(244, 1)) _
.Cut Destination:=Sheet1("aiueo").Range(Cells(1, i), Cells(122, i))

Sheet1("aiueo").Range(Cells(123, 1), Cells(244, 1)) _
.Deleat Shift:=xlShiftUp

i = i + 1

Loop While Cells(123, 1).Value <> " "

End Sub
820デフォルトの名無しさん:2009/12/09(水) 03:21:34
手元にエクセルないからわからんが俺は Sheet1(" ")  じゃなくて
Worksheets(" ") ってやってる
821デフォルトの名無しさん:2009/12/09(水) 07:27:00
プロジェクトエクスプローラにsheet1 (aiueo)とか表示されているけど
シート名はaiueoだよ
workhseets("aiueo").range("A1")やsheet1.range("A1")とかんじで使いますよね
822デフォルトの名無しさん:2009/12/09(水) 09:05:43
Sub 印刷()
Dim r, i
i = 0
'10行目を開始で、60行ごとに20ページ検索する
For r = 10 To 60 * 20 Step 60
i = i + 1
'B列の対象セルにデータがある場合
If ActiveSheet.Cells(r, 2) <> "" Then
'対象のページを印刷する
ActiveWindow.SelectedSheets.PrintOut _
From:=i, To:=i, Copies:=1, ActivePrinter:="", Collate:=True
End If
Next r
End Sub


すみません、質問です。
このVBAで、指定したセルに数字が入ってるページだけ印刷するように
したいのですが、その指定したセルに関数が入っているとデータと認識して
数字が入っていなくても印刷してしまいます。
関数が入っていても、数字が入っていないページを印刷しないようにするには
どうすればいいでしょうか?

OSは、ビスタ。
バージョンはエクセル2007です。

よろしくお願いします。
823デフォルトの名無しさん:2009/12/09(水) 09:27:57
数式が入っているかどうかは

If Worksheets("sheet1").Cells(1, 1).HasFormula Then
MsgBox "数式が入っている"
End If

みたいに HasFomula で判断できるから後は数字が入っていないというのをどういう風に判断するか
結果としての値が0になってるのか、それ以外の値が入っているのかどうかで作り方が判ると思うけど、どう?
824デフォルトの名無しさん:2009/12/09(水) 11:24:18
質問させてください。

標準モジュール1
private sub main()
dim a as column
call test(a)
end sub

標準モジュール2
public sub test(byref a as column)

end sub

というコード(処理は省略しました、columnはユーザー定義型です)を実行すると
「byref型が一致しません」というエラーが出ます。

試しに新規ブックを作り、セルを全選択してコピー、標準モジュールもコピーしてみると
新規ブックの方ではエラーが出ずに実行されました。
この理由は一体何なんでしょうか。

OSはXP SP3、エクセル2002です。
825デフォルトの名無しさん:2009/12/09(水) 17:34:48
質問させてください。


ぬるぽ
826デフォルトの名無しさん:2009/12/09(水) 18:03:52
>>824
標準モジュール以外にcolumnの定義がある?
827デフォルトの名無しさん:2009/12/09(水) 20:18:59
>>826
特に定義してません。

今気づいたんですけど、ColumnプロパティとかColumn関数というのがあるんですね。
もしやと思って>>824のColumnをColumに変更したらあっさり実行できました。

ただColumnのまま新規ブックにコピーした方は、何故実行出来たのか今だ不明です。
828デフォルトの名無しさん:2009/12/09(水) 20:35:44
>>826
すいません
自分では定義してないだけで、コピー元の方はオートコンプリートの欄にColumnが2つありました。。。
コピー先の方はColumnが、一つになってました。コピーすると重複してたら、自動でユーザー定義の方を優先するんですかね。
解決しましたありがとうございました。
829デフォルトの名無しさん:2009/12/09(水) 20:53:45
vbsの相談してもいいすか?
830デフォルトの名無しさん:2009/12/09(水) 20:57:31
>>829
VBScriptについて必死に話し合うスレ
http://pc12.2ch.net/test/read.cgi/tech/1242136180/l50
831デフォルトの名無しさん:2009/12/09(水) 23:36:25
>>814
そうですね…
実際エクセルでRPGを作ろうとしてます

ただいかんせん初心者なもので探りさぐりな状態が続いてます

もちろん自力でやるつもりですが、>>813のようなものを作ることが可能かどうか教えていただけたら幸いです
832デフォルトの名無しさん:2009/12/10(木) 00:02:52
>>831
Excelはセルが編集状態になってしまうとイベントを拾うのが困難になるので
難しいというか、VBAはゲームに向いてないと思うよ。

まあ絶対不可能ではないし、難しいことに挑戦するのは悪い事じゃないんで
とりあえず参考サイト
ttp://www1.plala.or.jp/chikada/vba/cellvader/cellvader.htm
833デフォルトの名無しさん:2009/12/10(木) 08:02:28
Excelでテトリスつくったひといなかったっけ
834デフォルトの名無しさん:2009/12/10(木) 11:29:07
テトリスは入門にはいいかもね。1時間でテトリスを作るムービーが話題になったぐらいだし。
でも、>>832にしてもそうだけど、結局タイマーとキー入力はAPIを直接呼んでるんだよね。
835デフォルトの名無しさん:2009/12/10(木) 17:28:10
あるフォルダ内の同じ形式のエクセルファイルから特定のセルの値を取得して,
一行が一つのファイルに対応するような表を作成したい。
できればその表をリアルタイムに更新できるようにしたい。
どういうVBAを用いればよいですか?

例えば,ファイルA,ファイルB,ファイルC,‥があったとして

A1 ファイルAのセルH5
A2 ファイルBのセルH5
A3 ファイルCのセルH5
 ・
 ・

という形の表を作るには?どういうVBAの流れにすればいいのか
簡単でもよいので教えてくださいませんか?
836ag:2009/12/10(木) 17:37:04
age
837デフォルトの名無しさん:2009/12/10(木) 17:40:41
ファイル名を指定してシートにアクセスする所から
838ag:2009/12/10(木) 18:28:09
ファイル名を指定せずに,フォルダ内全てのファイルから取得したいのです
その方法が分かりません
839デフォルトの名無しさん:2009/12/10(木) 18:33:43
ファイル名を拾得するところから(win32apiかな)
840デフォルトの名無しさん:2009/12/10(木) 18:35:11
841デフォルトの名無しさん:2009/12/10(木) 18:48:49
842デフォルトの名無しさん:2009/12/10(木) 19:00:38
やった。
VBAのSplitを正規表現で表せるようになった!
複数デリミタも指定出来るで!

チラ裏でした。
843デフォルトの名無しさん:2009/12/10(木) 22:20:03
教えてください。
特定のフォルダ内にあるjpg画像をエクセルに取り込み、
定期的に入れ替わる10のjpg画像を、例えばセルA1〜A10に、
貼り付けて表示できるようなマクロを探しています。
jpgのサイズはスキャナで取り込むものなので常に同じです。

宜しくお願い致します。
844デフォルトの名無しさん:2009/12/10(木) 22:24:16
>>838

'単一フォルダから

Set fso = CreateObject("Scripting.FileSystemObject")

Set objFolder = fso.GetFolder("c:\windows")

Set txs = fso.CreateTextFile("c:\filelist.txt")

For Each file In objfolder.Files
  txs.WriteLine file.Name
Next

txs.Close
845デフォルトの名無しさん:2009/12/10(木) 23:22:46
>>843
ここはプログラマのスレ
完成品はココにはないぜ
846デフォルトの名無しさん:2009/12/10(木) 23:30:42
847822:2009/12/11(金) 10:07:15
>>823
ご返答、ありがとうございます。

>結果としての値が0になってるのか、それ以外の値が入っているのかどうかで作り方が判ると思うけど、どう?

なるほど。
参照するセルは、関数の結果によって0もしくは1以上の整数となるので、以下の形でいいですよね?
全然素人なものですみません。


Sub 印刷()
Dim r, i
i = 0
'10行目を開始で、60行ごとに20ページ検索する
For r = 10 To 60 * 20 Step 60
i = i + 1
'B列の対象セルが1以上の場合
If ActiveSheet.Cells(r, 2) >=1 Then
'対象のページを印刷する
以下略
848843:2009/12/11(金) 13:59:47
843です。
>>845
誤解してます。
既に色々な本を調べ。検索しても分からないので
質問させていただいています。
また、概要さえ教えていただければ、
後は自分でつくります。
丸投げではありません。

皆様、どうか宜しくお願いします。
849デフォルトの名無しさん:2009/12/11(金) 14:09:13
webクエリは難しい。はじめてメモリが足りませんって出た。なんでだろう?
850デフォルトの名無しさん:2009/12/11(金) 14:36:11
>>843
どこまで分かっているの?
(1)特定のフォルダ内にある定期的に入れ替わる10のjpg画像を
(2)エクセルに取り込み
(3)例えばセルA1〜A10に貼り付けて表示
ってことなの?
851デフォルトの名無しさん:2009/12/11(金) 21:58:58
>>848
マクロを探してるって時点で完成品探しなのかなと

>>850さんの言うとおり、何ができて何が出来ないかはっきりしないと答えようが無い
後だしを防ぐために全体を晒すのと同時に、ポイントを絞ったほうが良いかと
852デフォルトの名無しさん:2009/12/11(金) 23:58:41
丸投げと同意だろ?
ほっとけよw
853デフォルトの名無しさん:2009/12/12(土) 00:01:49
× 同意 どうい
○ 同義 どうぎ
854デフォルトの名無しさん:2009/12/12(土) 00:05:37

× 尿意
855デフォルトの名無しさん:2009/12/12(土) 00:38:15
教えてください。Excel VBAです。4つあります。
1.
VBAのテキストエディタでVBを 初めて書いているんですが、
TABを入力した部分が半角スペースになってしまい、とても使いにくいです。
TABはTABのままにしてもらうには、どこで設定すれば良いでしょうか。

2.
継続行が、うまく記述できません。エラーが出ます。
if(   (A=B)
  And (B=C)
  And (D=F) ) then  などのようにやりたいのです。

3.
  JI   = LEFT$ (TIME$,  2)
  FUN  = MID$  (TIME$,2,2)
  BYOU = RIGHT$(TIME$,  2)
というように、=や()の位置をそろえたいのですが、スペースを入れても
勝手に1桁のスペースにされてしまいます。
そうならないようにするためには、どこで設定するのでしょうか。

4.
コメントは'ですが、複数行にわたってコメントアウトしたいとき
(C言語の
/*
*/   のように)は、どのようにすれば良いでしょうか。

以上です。宜しくお願いします。


使いにくくてしょうがないです。
宜しくお願いします。
856デフォルトの名無しさん:2009/12/12(土) 00:48:04
1と3は
諦めて
2はアンダーバーで改行できて
4は複数行のコメントは行の頭全部に'ってやるしかないと面倒だけど。
857デフォルトの名無しさん:2009/12/12(土) 00:52:03
>>856
さっそくありがとうございます。

え〜〜 ショックです。そうなんですか?

外部エディタを使えばできそうな気がしますが、
そんなのは許さないでしょうか、ゲイツ君が。

ショックです。使いにくいエディターですねぇ。

ありがとうございます。
858デフォルトの名無しさん:2009/12/12(土) 10:10:58
4は 表示->ツールバー->コメントブロック しか無いんじゃね?
emacs bindはあるみたいだけど(vba以外)、指がなじまん(vi派)
859デフォルトの名無しさん:2009/12/12(土) 10:36:00
そこでGoto Labelですよ。
860843:2009/12/12(土) 13:50:44
>>850
レスありがとうございます。

>(1)特定のフォルダ内にある定期的に入れ替わる10のjpg画像を
>(2)エクセルに取り込み
>(3)例えばセルA1〜A10に貼り付けて表示

そのとおりです。

宜しくお願いいたします。
861デフォルトの名無しさん:2009/12/12(土) 14:05:00
ダメすぎるwww
862デフォルトの名無しさん:2009/12/12(土) 14:12:54
Excel2007です

テキストボックスにユーザーが入力した範囲で
Rangeを作成するのですが
ユーザー入力の文字列を正当な範囲指定文字列(D4とかA1:C3など)と判定する手段
というのはあるのでしょうか?
現在は
On Error GoTo Exception
set rangetest = range("ユーザー入力文字列")
On Error GoTo 0

Exception:
msgbox "不正な文字列"

みたいにしてるのですが
専用の関数が存在したりするのでしょうか?
863デフォルトの名無しさん:2009/12/12(土) 14:40:12
>>862
回答になってるかどうかわからんけど
俺ならテキストボックスに入力させる段階でInputBoxメソッド使うな。
(関数じゃなくてメソッドのほうね。使い方はヘルプ参照)
Excelに判定させられるからラクじゃね?
864デフォルトの名無しさん:2009/12/12(土) 16:06:37
教えてください。
Excel2000です。

セルに、文字または数字を書き込みたいとき、
Cells().value と Rangr().valu とがあるようなのですが、
その違いがわかりません。教えてください。

  1. セルに文字または数字を書くときはどちらが良いのでしょうか?
    「コレを使うのが本当だ」というお話があれば、ぜひ教えてください。

  2. 書き込むものが、文字と数字で両者を使い分ける、とかでしょうか?

  3. 1の関連ですが、では、他方は何のために同じようなことができるのでしょうか?
    どちらか1つあればよいのではないか?と考えてしまいます。

  4. forで数字を変化させて、このセルから下に順番に数字を書きたい、という場合
    Cells().valueだと、引数に数字がはいりますので、セル位置を変化させたい場合には
    ふさわしいと思います。
    が、Range()の場合でも、("A" & format(count))のようにすれば、
    forなどでも使えるのでしょうか?

宜しくお願いします。
865デフォルトの名無しさん:2009/12/12(土) 16:41:35
866デフォルトの名無しさん:2009/12/12(土) 16:46:53
>>864
Rangeは「セル範囲」
Cellsは「セル」

同じじゃなくて違うんだよ。
単一セル指定にどっちがいいかといえば実用上からいえばどっちでもいいと思う。
867デフォルトの名無しさん:2009/12/12(土) 17:25:36
確かに単一セルが対象ならどっちでもいいんだが迷うところだわな。

自分でルール決めればいいんじゃね?
俺もmyルールがあるが多分支持されないんで公開はしないw
868デフォルトの名無しさん:2009/12/12(土) 17:46:42
>>862
toolboxにRefEditというのがあってあれで範囲がはいるようになってるけど、それでは駄目?
869デフォルトの名無しさん:2009/12/12(土) 18:41:21
>>860
>定期的に入れ替わる10のjpg画像を「定期的に」取り込む
「定期的に」以外のことはどのVBAの本を見てもだいたい出てるはずだが
マクロの自動記録をonにして 挿入-> 図 -> ファイルから
で生成されるコードを 見るべし・見るべし・見るべし
870デフォルトの名無しさん:2009/12/12(土) 20:03:24
入力規則から作成したドロップダウンリストへ
VBAからリストの追加や削除を行いたいのですが
どうすればよいのでしょうか?

ドロップダウンリストの名称も不明のため困っています。
871デフォルトの名無しさん:2009/12/12(土) 20:42:17
自己解決しました。
>869さんの方法でわかりました。
872デフォルトの名無しさん:2009/12/12(土) 20:58:46
そうなんだよ>>869>>2にも書いてあるけど)でかなり解決するんだよな。
2007以降でシート上のオブジェクトがらみの自動記録死亡してるから
先行き自信ないよ俺。
873デフォルトの名無しさん:2009/12/13(日) 04:21:05
VBAで、継続行の記号「_」の後に、'でコメント書くとエラーが出ます。
何故でしょうか。

  if( (A=B) _   ' ここにコメントを置くとエラーと言われます。
    (C=D) ){   'ここに書くのは大丈夫みたいです。
  end if

874デフォルトの名無しさん:2009/12/13(日) 04:54:47
>>873
なぜかってむつかしいことはわからんけど
継続してる途中にコメント突っ込まれてもExcelが困るだろうとは思う。

確かコメント行は独立させるのが正しい作法だったような俺はあまりこだわらないけど。
875デフォルトの名無しさん:2009/12/13(日) 08:54:19
OS:Windows7 Ultimate
Office:Office2003 personal SP3 
です。

昨日Officeをインストールしたのですが、インストール直後から

コマンドボタン、ラベルなどのコントロールをワークシートに貼り付けても、
 1.配置時点でWidth、Heightが小さい。(0.6になっている)
 2.貼り付けたボタンが見えない。(透明?になっていてボタン背景、キャプションも見えない)
 3.Width、Heightを大きくすることはできるが、ボタンの背景が透明?なまま大きくなり、
 クリックしても_clickイベントが発生せず、キャプションも見えない。

というような状態になり、困っております。
一度Officeの再インストールはしたのですが、状況は変わりません。
なにか対処法があれば教えていただけないでしょうか?

(↓スクリーンショットです。セルA3のあたりにコマンドボタンを貼り付けたのですがこのようになります。)
http://fx.104ban.com/up/src/up10525.jpg
876デフォルトの名無しさん:2009/12/13(日) 09:02:49
>872
えっ そうなんだ・・・
それはかなり痛いSpecダウンだ・・・

>873
想像だけど VBAは文中コメントがかけない
# Cみたいな /* */ が無い
だから
if( (A=B) ' ここにコメント 略 (C=D) ){
end if
こんな感じで展開されるんじゃ無いかなと
877843:2009/12/13(日) 12:43:19
843です。

出来ました!!!

>>865さんと>>869
さんのかげで助けられました

有難うございました。
878デフォルトの名無しさん:2009/12/13(日) 15:38:28
>>872
2010では復活するってどこかで見たよ
879デフォルトの名無しさん:2009/12/13(日) 15:52:27
excel2007です。

質問なのですが、
excelに複数のブックが開いている状況で、その中の一つのブックを
Application.EnableEvents = False にすると、他のブックのイベント処理も停止してしまいます。

それを回避することは出来るでしょうか?



880デフォルトの名無しさん:2009/12/13(日) 16:16:36
1つのBookをFalseにしているわけじゃないしな。
881デフォルトの名無しさん:2009/12/13(日) 16:57:04
>>879
ブックを指定すると○
882デフォルトの名無しさん:2009/12/13(日) 17:19:21
>>878
だいぶ前から2010のβ版が無料で落とせるようになってるから試してみればいい。
883デフォルトの名無しさん:2009/12/13(日) 17:23:26
>>882
うちの低スペックPCだと怖くてw
884デフォルトの名無しさん:2009/12/13(日) 19:04:49
>>878
それは初耳。
ほっとしたわ。とくにグラフ関係とか自動記録に聞きまくってるから
あれなしではやっていけん。
885デフォルトの名無しさん:2009/12/13(日) 20:52:33
http://officetanaka.net/excel/excel2010/013.htm
他の操作はどうなったのかは知りません〜
886879:2009/12/14(月) 16:45:17
>>881
レスありがとうございます。

ブックを指定するということは、

Application.Workbooks("ブック名").EnableEvents = False

で、よろしいでしょうか?
887デフォルトの名無しさん:2009/12/15(火) 03:40:17
質問なのですが

競馬の騎手の複勝率と複勝回収率データがあって
10/10迄、11/01迄、12/20迄というように、
ある日付までに複勝率が30%以上だった騎手を購入した場合の
複勝回収率を出すにはどうすればいいのでしょうか?

どの騎手でも構わないのですが、レースが行われる前日まで複勝率30%だった騎手の馬を
購入していた場合の回収率を知るにはどうすればいいのでしょうか?
888デフォルトの名無しさん:2009/12/15(火) 05:50:52
日付は>とか<が効いたとおも
あとは気合でその日付までの複勝数/レース数を計算させればいんじゃね
すまん競馬はよく知らん
889デフォルトの名無しさん:2009/12/15(火) 07:55:38
コード書くよりはワークシートで片付けた方がよさそうに見えるなあ。
ワークシート関数使えない人がここに紛れ込んできたのか、
あえてVBAでやらないといけない事情があるのかどっちなんだろ。
890デフォルトの名無しさん:2009/12/15(火) 11:01:14
すみません。EXCEL2003のMSクエリの質問です。

現在EXCEL2003上のデータをSQLServer2008から提供しようとしています。
EXCEL2003--MSクエリ--SQLServer2008

SQLServer2008側でテーブル名が漢字になっている為にMSクエリが使えない状態です。
原因はMSクエリ側から発行SQL文にあります。

漢字をテーブルに使う場合、識別子'['を使ってテーブル名を囲う必要があります。
例:テーブル名:H20年度売上(01月)の場合

select * from [H20年度売上(01月)]を発行しないといけないのに、MSクエリを使った時のSQL文は
select * from H20年度売上(01月)でした・・・

これを回避する手段はありますか?
教えてください。
よろしくお願いします。
891デフォルトの名無しさん:2009/12/15(火) 11:20:59
EXCEL2007、Windows7です。

Vistaで動いていた下記のソースで、
jpgファイルのファイル名が取得できません。
どうすれば良いのでしょうか?

myPath = ActiveWorkbook.Path
ChDir myPath
myFName = Dir("*.jpg")
892デフォルトの名無しさん:2009/12/15(火) 11:25:20
下記の処理で
「2行目以降のデータにブランクがあれば1行目で指定している桁数分だけスペースで埋める」
という処理をしているのですが

Sub スペース桁合わせ()

Dim R As Long
Dim C As Long

For R = 2 To 100
For C = 1 To 100
B = Cells(1, C)
If Cells(R, C) = "" Then
Cells(R, C) = Application.WorksheetFunction.Rept(" ", B)
End If
Next C
Next R
End Sub

あまりにも処理が遅くて大量のデータを扱えません。
至極単純な処理なので、遅い原因はやはりRept関数ではないかと思うのですが、もっと速い方法はないでしょうか?
893デフォルトの名無しさん:2009/12/15(火) 11:50:53
自己解決しました。
Replace使ったら爆速になりました。
894デフォルトの名無しさん:2009/12/15(火) 20:02:00
>>887
一定期間内の3着以内回数/騎乗回数を求めるのだけど
手っ取り早いのはオートフィルタを使うこと
本当に薦めたいのはADO経由でSQLを使うこと

>>890
MSクエリをやめてADOを使う
895デフォルトの名無しさん:2009/12/15(火) 23:57:15
>>894 に同意だな
データベース向きの仕事と表計算に向いてる仕事
適材適所だと余分な苦労をしなくてすむ
お作法を覚えるまでのチョットの苦しみを越えられるかどうか
896デフォルトの名無しさん:2009/12/16(水) 03:23:47
すいません。解決出来ず困ってます。宜しくお願い致します。
次のコードを作りました。

Sub CSVへ企画カテゴリー転送()

Dim ABC As Long
For ABC = 13 To 70 Step 2
Dim DEF As Long
For DEF = 2 To 21

If Cells(ABC, 12).Value = "あ" Then
Worksheets("CSV").Cells(DEF, 2) = Worksheets("倉庫").Range("T19")
End If
If Cells(ABC, 12).Value = "い" Then
Worksheets("CSV").Cells(DEF, 2) = Worksheets("倉庫").Range("T20")
End If
If Cells(ABC, 12).Value = "う" Then
Worksheets("CSV").Cells(DEF, 2) = Worksheets("倉庫").Range("T21")
End If

・・・(以下同じように続きます)
Next DEF
Next ABC
End Sub

要するに、アクティブシートのL13、L16・・・の値が
「あ」なら、シート'倉庫の'該当うるセルの値を、
該当するシートCSVと同じにしていく、
というマクロなのですが、
なぜか上手くいきません。

ご指摘の程宜しくお願い致します。
897デフォルトの名無しさん:2009/12/16(水) 03:31:27
何がどううまくいかないのか書きましょう。
898デフォルトの名無しさん:2009/12/16(水) 03:57:17
>>887 sumproduct 関数ではダメ?
899デフォルトの名無しさん:2009/12/16(水) 04:11:17
>>896
L13、L16… ならStepは2じゃなくて3
900デフォルトの名無しさん:2009/12/16(水) 05:04:11
Select Caseは人気ないんかねえ
Value="あ"がTrueだった時のその後のIfに同情を禁じ得ないんだが
901デフォルトの名無しさん:2009/12/16(水) 08:53:20
>>896です。

>>897
有難うございます。
まったく変化が起こらないのです。
>>899
有難うございます。
お陰で一歩前進できました。
しかい、やはり何も変化が起きません。
まだ他に原因があるのだとおもいます。
>>900
有難うございます。
もうすこし具体的に教えていただけないでしょうか。
宜しくおねがいします。
902デフォルトの名無しさん:2009/12/16(水) 09:19:05
>896
横レス失礼
> If Cells(ABC, 12).Value = "あ" Then ←どのシートのセルですか?
複数シートを扱うスクリプトの場合は
> Worksheets("CSV").Cells(DEF, 2) = Worksheets("倉庫").Range("T19")
のように、シート名を指定しないと不確実だと思う。
903デフォルトの名無しさん:2009/12/16(水) 10:38:15
よろしくお願いします。

【バージョン】
OS:XPsp2
EXCEL:2002

【質問】
VBAにおけるクラスのプロパティってどういう場合に使用したら良いのでしょうか?
プロパティを使用しなくとも、Functionだけで同じ役割をより柔軟に作れそうに思えますが・・・。

Javaにおけるメンバとメソッドとはどのように違うのでしょうか?
904デフォルトの名無しさん:2009/12/16(水) 11:04:49
range.value = 1って書けるとうれしいじゃない。
905デフォルトの名無しさん:2009/12/16(水) 14:17:38
Vista、EXCEL2007です。

画像を挿入する位置(画像の左上が挿入すれるセルの位置)を
指定して、画像を挿入するには、どうすれば良いのでしょうか?

906デフォルトの名無しさん:2009/12/16(水) 14:46:01
>>905
例題 俺のをサンプルにすればOK
使うのは
ピクチャーインサートプロパティね。

On Error Resume Next

Range("H11").Select
ActiveSheet.Pictures.Insert( _
"C:\Documents and Settings\a\My Documents\My Pictures\ScanSnap\resized\" & Range("I12") & Range("H89").Value).Select
Selection.ShapeRange.ScaleWidth 0.25, msoFalse, msoScaleFromTopLeft
Selection.ShapeRange.ScaleHeight 0.25, msoFalse, msoScaleFromTopLeft
907デフォルトの名無しさん:2009/12/16(水) 20:33:19
>>900
オレ、select case好きよ
でも2ケース位ならelsei
VBAで書くときは速度云々よか見やすいコードを書きたい
でも自分的に芸術的な構造化をしても見るのは自分だけw
趣味レベルだし
908デフォルトの名無しさん:2009/12/16(水) 22:02:36
フォルダ参照ダイアログ
Application.FileDialog(msoFileDialogFolderPicker)
これで呼び出した場合、フォルダ名入力欄を隠したいのですが無理でしょうか
もしくは、フォルダ選択中にフォルダ名入力欄に対象のフォルダ名を表示してくれれば
そのままでもいいのですが、可能でしょうか
909デフォルトの名無しさん:2009/12/16(水) 23:10:06
OS: windows7
時折、個別自作アイコンのxlsファイルを作ってる人がいるんだけど(そのxlsファイルをコピーした直後コピー先にThumbs.db ファイルが作成される)
やり方知ってる人います?
910デフォルトの名無しさん:2009/12/16(水) 23:28:38
>>896
アクティブシートは確実に
 If Cells(ABC, 12).Value = "あ" Then
   ↑の対象シートですよね

すこし エスパー してみると
アクティブシートのセルL13,L16,L19がそれぞれ「あ」「い」「う」の時

1)シート"倉庫"のセルT19の値 を シート"CSV"のセルB2へ入れる
2)シート"倉庫"のセルT20の値 を シート"CSV"のセルB3へ入れる
3)シート"倉庫"のセルT21の値 を シート"CSV"のセルB4へ入れる
って やりたかったりするのかな
そうなら
For DEF = 2 To 21
ここが間違い(Forループさせちゃダメ)

現在のコードだと
1)シート"倉庫"のセルT19の値 を シート"CSV"のセルB2〜B21へ入れる
2)シート"倉庫"のセルT20の値 を シート"CSV"のセルB2〜B21へ入れる
3)シート"倉庫"のセルT21の値 を シート"CSV"のセルB2〜B21へ入れる
となるよ
911デフォルトの名無しさん:2009/12/17(木) 01:14:09
>>908
ムリだったとおも

自作フォーム作って、フォルダ内のファイル参照して、配置しれ
912デフォルトの名無しさん:2009/12/17(木) 01:25:17
>>908
.InitialFileName使えば開いた時のファイル名を指定できる
詳しくはこれみて
ttp://msdn.microsoft.com/ja-jp/library/cc326127.aspx
913デフォルトの名無しさん:2009/12/17(木) 11:25:55
>>908

選択するだけど

Sub TestFolder()
Dim ff As Object

Set ff = CreateObject("Shell.Application"). _
BrowseForFolder(0, "フォルダを選択してください", 0, "c:\")

If Not ff Is Nothing Then
MsgBox ff.Items.Item.Path
'選択したフォルダ名を表示
End If

End Sub

914デフォルトの名無しさん:2009/12/17(木) 13:44:47
>>910
感謝します。896です。
自宅はアクキンで書き込めなかったので、
遅レスすいません。

>って やりたかったりするのかな
全くそのとおりです。

>そうなら
>For DEF = 2 To 21
>ここが間違い(Forループさせちゃダメ)

そこでどうすれば良いのでしょうか。
模索したのですが分からない状態です。

ご教授宜しくお願いします。
915910ではありません:2009/12/17(木) 14:47:33
>896,914
ループ変数をひとつにするといいです
iという変数を0〜19の間で変化させ、ABCとDEFはiから計算させます。
文字列変数(出力先セル位置を格納)とSelect文も使うとすっきりします。

Dim i as integer、 ABC as Long, DEF as Long, セル as string
For i = 0 To 19
 ABC = i * 3 + 13
 DEF = i + 2
 Select Case Cells(ABC,12).Value
 Case "あ"
  セル = "T19"
 Case "い"
  セル = "T20"
 Case "う"
  セル = "T21"
 Case Else
  例外処理を入れる
  Exit Sub
 End Select
 Worksheets("CSV").Cells(DEF, 2) = Worksheets("倉庫").Range(セル)
Next i
916デフォルトの名無しさん:2009/12/17(木) 15:19:28
>>2の★5を読めば……いいんじゃないかな
917910:2009/12/17(木) 22:55:05
>>914
なんか難しく考えすぎてない?

変数 DEF に初期値をセットしておいて
"倉庫"の該当セルから "CSV"への 1回の転送ごとに
変数 DEFの値を +1していけばいいだけでないかな

下記の例題コードで
変数DEF値がどのように変化するか考えてみて
DEF = 2
For ABC = 13 To 70 Step 3
DEF = DEF + 1
NEXT ABC
918デフォルトの名無しさん:2009/12/18(金) 19:26:27
896=914です。

>>910さん並びに>>915さん。
本当に有難うございます。
レス遅れてすいません。
自宅の回線がアクキンに巻き込まれたので、
会社から書き込み、返信が遅れてしまいました。

本当にお二人には感謝です。
しかし>>915さんのいうことは、
私には難しすぎ、
また>>910さんのいうことも、
難しく理解できませんでした。

しかし、もう少し思考をトライしてから、
いわれたことを理解できるよう、
再チャレンジしてみたいと思います。

有難うございました。
919デフォルトの名無しさん:2009/12/19(土) 15:26:02
OS:XP SP3
Excelバージョン:2003 (11.8316.8221) SP3

Enumで定義した型をFunctionの戻り値にしようとすると
「ユーザ定義型は定義されていません」と言われて実行できません。
以下概略

Sub main()
  (処理)
  Select Case hoge2(str)
  (処理)
  End Select
  (処理)
End Sub

Public Enum hoge
  a = 0
  b = 1
  c = 2
End Enum

Public Function hoge2(hoge3 As String) As hoge 'エラー箇所
  (処理)
End Function

こういう使い方はできないんですか?もしくは、おかしい箇所を教えてください。
920デフォルトの名無しさん:2009/12/19(土) 15:51:43
921デフォルトの名無しさん:2009/12/19(土) 20:01:53
>>920
私の使っているVBAのバージョンは6.5(Office2003)で、↓によると対応しているはずです。
ttp://www.geocities.co.jp/SiliconValley-Cupertino/4513/excel_tips.html
ヘルプにもEnumステートメントの使い方が書いてあるので、対応していないわけではないと思います。
922デフォルトの名無しさん:2009/12/19(土) 20:43:07
>>921
Enumの部分をモジュールの一番上(宣言部分)にする

mainで使うのに、mainの下にhogeがあるから
定義エラーになる
923デフォルトの名無しさん:2009/12/20(日) 00:39:19
>>922
できました!関数と一緒でどこで宣言してもいいと思ってました
ありがとうございます
924デフォルトの名無しさん:2009/12/20(日) 16:54:15
教えてください。

Excelのセルに、16進数5桁の数字(文字)が入っています。
これを10進数に変換して隣のセルに置きたいです。
hex2dec()で10進数に変換できることはわかりましたが、
16進数5桁が、符号付きの16進数なので、hex2dec()ができないで困っています。

fffff→+524286
80002→+2
80001→+1
80000→0
7ffff→-1
7fffe→-2
00000→-524287 という感じです。

何か良い方法はありますでしょうか?
925デフォルトの名無しさん:2009/12/20(日) 17:05:04
>>924
その計算間違ってないか?80000→0ならfffff→+524287だろ。

=HEX2DEC(A1)-524288
926デフォルトの名無しさん:2009/12/20(日) 17:18:47
何を言ってるのかわからない
927デフォルトの名無しさん:2009/12/20(日) 18:51:25
>>924
C言語の本かHPを見て、signedとunsignedの所を嫁

ちなみに925が正解
928デフォルトの名無しさん:2009/12/20(日) 20:24:20
教えてください

=SUMPRODUCT(($BN$14:$BN$709<=25)*($BX$14:$BX$709>0))

ここの

$BN$709、$BX$709

の部分を外部のセル参照にできないものでしょうか?

気持ち的には

=SUMPRODUCT(($BN$14:A1<=25)*($BX$14:$BXB1>0))
                 ^^            ^^

A1 = BN300
B1 = BX300

とかです
929↑ウザッ!:2009/12/20(日) 21:17:32
マルチ&解決済み
930デフォルトの名無しさん:2009/12/20(日) 21:24:17
>>928
解決しました♪

いろんなエクセルスレ見てるくせに役に立たない>>929  ウザッ
931デフォルトの名無しさん:2009/12/20(日) 21:37:42
キラッ★
932デフォルトの名無しさん:2009/12/20(日) 22:19:19
イラッ☆
933デフォルトの名無しさん:2009/12/21(月) 09:39:06
>>813です
以前、ヤフー知恵袋で似たような質問を見つけたので、それを参考にいじってみました

スプレッドシートの読み込みがやはり上手く行かないです

Private r As Range
Private r2 As Range

Sub 四角形1_Click()
ゲーム.Show
ゲーム.ActiveControl
ゲーム.Spreadsheet1.Range("C30") = "○"
Set r = ゲーム.Spreadsheet1.Range("C30")
End Sub

Private r As Range
Private r2 As Range

Sub 四角形1_Click()
ゲーム.Show
ゲーム.ActiveControl
ゲーム.Spreadsheet1.Range("C30") = "○"
Set r = ゲーム.Spreadsheet1.Range("C30")
End Sub 'エクセルシート上のボタンをクリックした後、ユーザーフォームを表示させる処理

Sub SetKey()
Application.OnKey "{UP}", "KeyUP"
Application.OnKey "{DOWN}", "KeyDOWN"
Application.OnKey "{LEFT}", "KeyLEFT"
Application.OnKey "{RIGHT}", "KeyRIGHT"
Set r2 = r
End Sub 'キー移動処理'
934デフォルトの名無しさん:2009/12/21(月) 19:26:40
'エラーがでる。
Sub Main()
Dim rng As Range
Set rng = Range("Sheet1!A1")
With rng.Validation
Call .Add(Type:=xlValidateList, Formula1:="Sheet2!A1")
End With
With rng.Offset(1,0).Validation
Call .Add(Type:=xlValidateList, Formula1:="Sheet2!A1:A2")
End With
End Sub
935デフォルトの名無しさん:2009/12/22(火) 00:09:34
>>933
間違ってるかもしれんけど ちょっと気になった点を

  ゲーム.Show
"ゲーム" ってUserForm名ですよね

たしかこのShowメソッドでは
>ユーザー フォームを非表示にするか、またはアンロードするまで、次のコードは実行されません。
なんだけど Help等確認した?

通常 Show(表示)した後は
UserForm内で処理するのが一般的だとおもうよ
936デフォルトの名無しさん:2009/12/22(火) 00:37:58
教えてくださいますか。

Excelの表示行移動は通常、ウインドウの右のスクロールバーをドラッグしたり
して上下に移動しますよね。
それを行数を指定することで移動することは出来ますでしょうか。
例えば、検索はCTRL+Fで検索窓が出てきます。それと同じように
CTRL+○○とすると窓が出てきて、行数を入力してentすると、その行が
画面の真ん中に来る、というイメージです。
VBAで組むというわけできなく、単にExcelの使い方で知りたいのです。

宜しくおねがいします。
937デフォルトの名無しさん:2009/12/22(火) 00:39:17
残念ながらできないです
938デフォルトの名無しさん:2009/12/22(火) 01:51:04
>>936
まあ代用でCtrl+Gで直接移動かな。画面真ん中には来ないけど。
939デフォルトの名無しさん:2009/12/22(火) 07:12:03
>>936
マクロ組めば良いのに
940デフォルトの名無しさん:2009/12/22(火) 08:00:01
VBAなら出来たはず
やり方は忘れた
941デフォルトの名無しさん:2009/12/22(火) 08:38:00
>>935
そうですユーザーフォーム名


確かに実行→停止→実行ってやらないと"○"は表示されませんでした
942デフォルトの名無しさん:2009/12/24(木) 11:37:17
セルB1には12:00という時刻が
入力されています。これを
T=shtHoge.range("B1" ).value
という具合にデータにVBAでアクセスすると
シリアル値がでてきます。(Double型として認識される)
12:00という文字列で表示することはできないのでしょうか?
いろいろやってみたのですができません
だれかわかる人いますか

943デフォルトの名無しさん:2009/12/24(木) 13:37:56
>>942
T = shtHoge.range("B1" ).Text
944デフォルトの名無しさん:2009/12/24(木) 20:42:59
ありがとう。
しかし、VB.NETからEXCELシートのアクセスすると
.Textがないのです。どういたものか・・・・
945デフォルトの名無しさん:2009/12/24(木) 21:13:06
>>944
format関数とかはどう?
946デフォルトの名無しさん:2009/12/24(木) 23:03:03
教えて下さい。
Excel2003で Sendkeys "AAA+1500"と入力したいのですが
結果は"AAA!500"になります。
"Shift+1"→"!" の回避方法はご存知でしょうか?
わかる人がいればお願いします。
947デフォルトの名無しさん:2009/12/24(木) 23:10:05
Sendkeys "AAA{+}1500"
948946:2009/12/24(木) 23:24:56
>>947さん
ありがとうございます。解決できました。
949デフォルトの名無しさん:2009/12/25(金) 04:41:09
>>944
Value2を取得すればいけるんじゃね?
今ふとんの中からもしもしだから自信ないけど。
950デフォルトの名無しさん:2009/12/26(土) 09:58:18
945.949様
VB.NETのオートコンプリートがないだけでした。textでやればいけました。
お騒がせしました。
951デフォルトの名無しさん:2009/12/26(土) 21:19:01
すでに連続してない複数セルが選択されている時に
追加してセルを選択するにはどうすればよろしいっすか?
952951:2009/12/26(土) 21:42:37
自己解決しましたスンマセン
953デフォルトの名無しさん:2009/12/26(土) 21:44:27
>>951
コントロールキーを押しながらクリック又はドラッグ
954デフォルトの名無しさん:2009/12/26(土) 22:20:02
>>953
いやそれをVBAでやる方法だろ
955sage:2009/12/27(日) 12:24:20
通常、グラフ作成するとセルを参照しますけど、配列変数を参照したグラフ
作成はマクロで出来ますでしょうか?
956955:2009/12/27(日) 13:19:21
追記します。
Range(cells(1,1),cells(10000,500))の範囲を3D等高線グラフにしたいん
ですが、(option base 1⇒) A(10000,500)の配列変数を利用して3D等高線
グラフを作成したいと思っています。
方法があれば教えて下さい。あと、こんな事しても表示までの時間は速く
ならない?ですか?
957デフォルトの名無しさん:2009/12/27(日) 15:33:23
>>955
できない
958955:2009/12/27(日) 17:50:48
そうですか。。残念ですが仕方ないですね。
セル参照で進めます。
959デフォルトの名無しさん:2009/12/27(日) 19:18:15
コメントで悩んでいます。

たとえば、指定のセルにコメント表示で
山田 100個とコメントに表示はできますが
ここにコメントを追加して、高木 250個というコメントを追記して
山田 100個
高木 250個
とコメントを表示したい場合はどうすればいいのでしょうか?
960デフォルトの名無しさん:2009/12/27(日) 19:21:26
>>958
できるよ

aが配列だとして
ActiveChart.SeriesCollection(1).Values = a
とかやると、配列が元データになる
画面表示は大変なことになるけど・・・
961デフォルトの名無しさん:2009/12/27(日) 20:05:19
>>959
素人ですが

Range("A1").Comment.Text Text:=Range("A1").Comment.Text & "高木 250個"

でどうでしょう
962デフォルトの名無しさん:2009/12/27(日) 20:14:39
>>959

' Macro1 Macro
'
Range("E7").Select
Range("E7").Comment.Text Text:="******:" & Chr(10) & "山田 100個" & Chr(10) & "高木 250個" & Chr(10) & ""
Range("E8").Select
End Sub

マクロの記録でこんなのが出来たから、必要な部分を追加すれば良いだけでは?

963デフォルトの名無しさん:2009/12/27(日) 21:06:19
vbCrLf
964デフォルトの名無しさん:2009/12/27(日) 23:53:41
>>959
追記だけなら
正しい使い方かどうかは知らんけど こういう方法もあったりする
Range("A1").Comment.Text Start:=9999, Overwrite:=0, Text:=Chr(10) & "高木 250個"
965デフォルトの名無しさん:2009/12/30(水) 00:31:04
セルに入力された日付から
曜日を抜き出して処理をしたいのですが
うまく取得できません。
ぐぐってもdateを使ってそこから曜日を取得するようなものばかりです。

あらかじめセルに1月1日(月) みたいに入力されているところから
曜日を取得したいと思っています。

Dim a As data
a = ("A1")
Range("A2") = Weekday(a)
Range("A3") = WeekdayName(Weekday(a))

よろしくお願いします。
966デフォルトの名無しさん:2009/12/30(水) 07:44:37
>>965
MsgBox Format(Range("A1").Value, "aaaa") & " or " & Format(Range("A1").Value, "aaa")
967デフォルトの名無しさん:2009/12/30(水) 13:01:19
>>965
文字列として 1月1日(月) が 入力されているなら
ActiveSheet.Range("A3").Value = Left(Right(ActiveSheet.Range("A1").Value, 2), 1)
と するとか
968デフォルトの名無しさん:2009/12/31(木) 02:19:36
959ですが、質問に答えてくれた方ありがとうございました。
その後、何とかできたのでよかったなぁと思っています。
969デフォルトの名無しさん:2009/12/31(木) 23:18:45
ONKEY命令を「CTRL」+「C」という本来はコピーのショートカットのキー割り当てをワケあって
マクロに割り当てているのですが、
この命令を同じエクセル内で本来の使い方(CTRL+Cのコピー)ができるように戻す方法はないのでしょうか?

970デフォルトの名無しさん:2010/01/01(金) 07:21:49
>>969
どんな訳か知らないけど、マクロ割り当てるのは Ctrl+Shift+キー にしようぜ。
971デフォルトの名無しさん:2010/01/01(金) 07:38:44
質問です。
001〜200の値をFor Nextで繰り返したいのですが、
001〜099までが繰り返せません。
今は以下の様に00+(1〜9)、0+(10〜99)、100〜200に分けているのですが、
For i1 = 1 To 9
A = "00" & i1
Next i1
For i2 = 10 To 99
B = "0" & i2
Next i2
For i3 = 100 To 999
C = i3
Next i3

これを一括で処理することは可能でしょうか?

972デフォルトの名無しさん:2010/01/01(金) 07:57:00
>>971
Sub test()
Dim i As Integer
For i = 1 To 200
Debug.Print Right("00" & CStr(i), 3)
Next i
End Sub
973デフォルトの名無しさん:2010/01/01(金) 09:18:10
>>972
ありがとうございます。出来ました。
974デフォルトの名無しさん:2010/01/01(金) 23:28:41
入力限定で、数字のみは分かったのですが
数字とマイナスのみの場合はどうやればいいでしょうか?
975デフォルトの名無しさん:2010/01/02(土) 14:25:53
Excel VBAを使えばプロキシ経由で掲示板に1行目から順に掲示板へ連続投稿できますか?
976デフォルトの名無しさん:2010/01/02(土) 14:49:11
出来るだろうけど重い串使うと同期かけるのがマンドクセだと思う
977デフォルトの名無しさん:2010/01/02(土) 14:55:48
>>976
やるとすればどのように実現するのでしょうか?
978デフォルトの名無しさん:2010/01/02(土) 15:11:09
本文作成 → URL合成 → 書き込み実行

問題は書き込み実行だね
データを直で送るにしろテキスト入力にしろ串使う際のラグをどうやって処理するかだかねえ
思いつきだけどページからソースデータ抜き出して、最後部にある定型文言と合致判定を使うとか出来そうだな

XML制御したほうがいいとは思うけど
979デフォルトの名無しさん:2010/01/02(土) 15:30:26
>>975
ほかの言語でやったほうが楽じゃね?
本文と数行のスクリプト用意すればできるから。
980デフォルトの名無しさん:2010/01/02(土) 15:30:46
そんな荒しに構うなって
981デフォルトの名無しさん:2010/01/03(日) 23:45:15
宜しくお願い致します。
特定の文字の前後どちらでも良いので、
指定した文字の前後どちらかにカーソルを挿入
するマクロを作りたいと思います。
そこであれこれ調べましたが結局分からず困っています。
宜しくお願い致します。

982デフォルトの名無しさん:2010/01/04(月) 00:10:34
sendkeyでも無理なのかな
983デフォルトの名無しさん:2010/01/04(月) 00:20:15
セルの中にabcdeと書いてて
そのcとdの間みたいにカーソルとかは無理と思うけど
984デフォルトの名無しさん:2010/01/04(月) 00:24:58
Excel VBAでHTTPサーバを作れますか?
985デフォルトの名無しさん:2010/01/04(月) 00:34:59
テキストボックスとかなら出来たようなきもしなくも
どうだっけな
986デフォルトの名無しさん:2010/01/04(月) 08:04:37
>>981
sendkeysで出来ました
cells(1,1)に0123456789と合って
4と5の間にカーソルを置きたい場合は
Sub test()
Cells(1, 1).Select
SendKeys "{F2}"
For i = 1 To 5
SendKeys "{LEFT}"
Next i
End Sub
もっと良い方法がありそうな
987デフォルトの名無しさん:2010/01/04(月) 10:56:34
>984
できるんじゃね?
#意味ねーと思うけどw
988デフォルトの名無しさん:2010/01/04(月) 23:34:06
981です。本当に皆さん有難うございます。
感謝です!!!
>>982
sendkeyなるものを始めて知りました。
これで何とかなりそうです。
有難うございます。
>>986
これで問題は解決しました。
今まで数百会った煩わしい作業が一気に楽になります。
本当にわざわざコードまで考えて頂き感謝です。
僕の頭では一生考えても無理でした。
本当に有難うございます!

989デフォルトの名無しさん:2010/01/05(火) 01:52:39
小数点第二位までの入力以外はエラー出るようにしたいんだけどどうしたらいいのか・・・

具体的には、テキストボックスに0.01〜5.00以内の入力をさせて、それ以外の入力(3.564みたいに小数点3位以下)はNGみたいにさせたいんだが。
990デフォルトの名無しさん:2010/01/05(火) 02:54:13
色々ググったら
len関数 isnumeric関数 instr関数の複合でチェック出来そうだけど他の方法あれば後学のためにも教えてください。
991デフォルトの名無しさん:2010/01/05(火) 03:55:18
>>989
100倍して切捨てして比較するとか。
int(n * 100) = (n * 100)
992デフォルトの名無しさん:2010/01/05(火) 07:04:19
if ROUNDDOWN(数値,桁数)=入力値 then とかできるんじゃないの
993デフォルトの名無しさん:2010/01/05(火) 13:44:12
数値として処理すると誤差でうまく動かないことがあるから文字列でやった方が安全
994デフォルトの名無しさん:2010/01/06(水) 06:07:09
>>990
お前の事だ
脳味噌のレベルが低いって事
995デフォルトの名無しさん:2010/01/06(水) 09:04:01
初心者です、教えて下さい。
VBAからWindows(DOS)にシステムコール(DIR)して、カレントフォルダーに存在する
全てのファイル名を得て、結果をセルに表示させたいのですが、
システムコールって可能なんですか?
996デフォルトの名無しさん:2010/01/06(水) 09:21:42
APIの事を言ってんのだったら可能だけど、別にそれを呼ばなくても一覧の取得は出来るっしょ
997デフォルトの名無しさん:2010/01/06(水) 09:38:10
>>996
そうなんですか?
自分はDOSしか知らず、仕事で長年WINDOWSは使ってましたが
メールくらいしかやりません、本日はじめて自動マクロを経験しました、
ヘルプで調べてもよく分かりません・・・
今まで必要に応じて専用ツールを作ってくれていた事務の女の子がいましたが、
暮れに辞めてしまって、新年から仕事が回らずてんてこ舞い状態です。
998996:2010/01/06(水) 09:56:20
ぐぐればいっくらでも見本は出てくるけど…


Sub Sample1()
Dim i As Long, buf As String
Const Path As String = "C:\Work\"
buf = Dir(Path & "*.*")
Do While buf <> ""
i = i + 1
Cells(i, 1) = buf
buf = Dir()
Loop
End Sub



Sub Sample2()
Dim i As Long, FSO As Object, f As Object
Const Path As String = "C:\Work\"
Set FSO = CreateObject("Scripting.FileSystemObject")
MsgBox "全部で" & FSO.GetFolder(Path).Files.Count & _
"個のファイルがあります"

For Each f In FSO.GetFolder(Path).Files
i = i + 1
Cells(i, 1) = f.Name
Next f
Set FSO = Nothing
End Sub
999デフォルトの名無しさん:2010/01/06(水) 10:30:25
>>998
どうもすみません。
早速、自分のエクセルプロジェクトにコピーして検証&調整してみます、

WINDOWS系は難しいですね、DOSは楽でした(遠い目)
昔は、DIRをリダイレクトするバッチを実行すれば良かったんですが
WINDOWSになってから全然ついていけなくなってしまって・・・
実は、今週末に部長に提出する資料の為に必要な機能なんですよ、
助かりました、本当に有難うございました。
1000デフォルトの名無しさん:2010/01/06(水) 10:32:00
999=997=995です、念の為。
それと998さん、本当に本当に有難う御座いました。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。