ExcelのVBAに関する質問スレです
★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 :
前スレ980:2011/11/27(日) 22:40:56.31
初めてスレたてた。
URLとかテンプレとか間違ってたらごめん。
あと、話を遮って質問したけども、関係ない話はやめたほうがいい。
だって、俺がスレたてなきゃいけなくなtt(ry
>>1乙
前スレの最後はうんこくんが荒らして大変だったねw
ILの直腸注入だったっけ
まだ、粘着してるよ。
スルー推奨 >> 各位
愛の直腸注入に付いては俺も聞きたいが
また荒れるからやめとけ
名前って値が増えても自動で拡張できないけどこれVBA使えばできるよね
やり方教えてくれ
A
1 100
2 200
3 300
ここで、A1〜A3に「表1」という名前をつける
つぎにA4に、400という数値を入力すると
A1〜A3の範囲だった「名前:表1」が自動的に「A4」まで拡張される
みたいなことやりたいんだけどどうやればいい?
セルの入力イベントで
名前の範囲をカレントリージョンのものに付け直せば?
>>8 Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range
Set r = ActiveWorkbook.Names("表1").RefersToRange
If r.Column = Target.Column And r.Row + r.Rows.Count = Target.Row Then
ActiveWorkbook.Names("表1").RefersTo = "=" & Target.Worksheet.Name & "!" & r.Resize(r.Rows.Count + 1).Address
End If
End Sub
とりあえず適当に書いてみた
下に一つ増えるだけ。複数貼り付けとかどうなるかしらん
Worksheet_Changeイベントで、てきとうに範囲決めて、Names().RefersToで設定するだけ
すきな用に直してくれ
11 :
デフォルトの名無しさん:2011/11/28(月) 04:51:18.01
前スレで以下の質問をしたものなのですが
> 変数 X に例えばA1〜A20の数値の和、合計を入れたいのですが。
という質問をして
> X = WorksheetFunction.Sum(Worksheets("Sheet1").Range("A1:A20"))
というアドバイスをいただいたのですが、この一文を経過したあとで、
ファンクションプロシージャで定義された語句を使うとエラーか、上手く作動しなく
なってしまうのですが、なにかそのようなルールがあるのでしょうか?
質問です。
Offset(,1)とOffset(0,1)ではどちらが一般的でしょうか?
13 :
デフォルトの名無しさん:2011/11/28(月) 07:30:48.54
>>11 うーん。
状況が見えないから何とも言えないけど、
@何か別に理由がある。
A合計対象セル範囲に足せない文字列とかが含まれている。
B合計対象セル範囲がシート枠を超えている。
CILとの直交性
あたりが原因なんじゃないかな。
>>12 そこを省略しちゃうと、Offset知らない人に
NullやVbNullString辺りが入ることが許されるのか、
勝手に0が入るのかコードから見て取れないから、
前者は余り一般的とは呼べないと思う。
一般的、可読性が高いのは後者じゃない?
>>12 俺は0は書かないな。
こんな簡単なものに可読性もへったくれもないと思うし。
ところで省略を嫌う人ってResizeで
With Range("A1").Currentregion
.Resize( ,2)
End With
これを下のように略さずに書くのかな?
With Range("A1").Currentregion
.Resize(.Rows.Count ,2)
End With
>>8 Excelのバージョンは?
2007以降ならテーブル(構造化参照)使えばいいんじゃないの?
17 :
デフォルトの名無しさん:2011/11/28(月) 12:16:00.19
「仕事に役立つ ExcelVBA実用サンプルコレクション」の本は大人気。
amazonの中古で売れに売れて、もう高額の出品者からしか買えなくなりました。
すでにレアものです。
>>12,14,15
一般的って意味が、どう書く人が多いかって話なら
Offset(,1)やResize( ,2) って書く人が多いと思う
可読性に関して言えば、省略しない方が高いのはたしかではあるが
どっちにしろOffsetやResizeが何をするか、引数は何かが解らないと使えないので
大差がないと言えばまあその通り
だがたとえばこの例だと、Offsetは省略した値は0だけど、Resizeは省略した値はゼロではない
俺ならOffsetは0であることを明示的に示しときたいので省略しない
Resizeは変更しないことを明示的に示しときたいので、あえて書かない
20 :
17:2011/11/28(月) 19:39:03.82
Dim s(0) as String
s(0) = "aaa"
Debug.Print s(0)
これがなぜ通るのか理解できません。
23 :
デフォルトの名無しさん:2011/11/28(月) 22:15:17.18
>>23 C言語に置き換えたらなんとなくわかるんじゃないか?
C言語の配列は個数を指定する
VBAの配列はインデックスの最大値を書く
Dim s(1)だとs(0)とs(1)の2個になる
>>17 つい、今確認したけど、普通に、Amazonで定価で買えるよ。
Amazonでは、常に人気書籍を定価以上の価格で出品している業者が張り付いている。
普段は売れないけど、たまたまAmazonの在庫が切れたときにアクセスして、、
「まずい、もうレアものになってしまったんだ」って勘違いして買う人が居るからだって。
27 :
デフォルトの名無しさん:2011/11/29(火) 00:42:34.48
>>26 そうでしたか。
それはすばらしいです。
ところでVBAじゃなくExcelの関数のほうも
こういうサンプルがた〜くさん載ってる実用的な本は
ないものでしょうか?
>>25 ありがと、やっぱそうなのか。ググっても"要素数を指定"って書いてるのが多くて悩んだ。
久しぶりにVBA触ると色々謎仕様に直面して驚く。
29 :
デフォルトの名無しさん:2011/11/29(火) 17:54:00.68
一つのボタンで、画像と曲を変えていくものを作りたいです。
画像の部分はできたけれども、曲がだめぽ。
Dim cnt As Integer
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
Private Const FILE_NAME As String = "C:\menu.mp3"
Private Sub UserForm_Initialize()
cnt = 1
ImageChange
musicChange
End Sub
Private Sub CommandButton1_Click()
ImageChange
musicChange
End Sub
Private Sub ImageChange()
On Error Resume Next
With Worksheets(1)
If cnt > .OLEObjects.Count Then cnt = 1
Image1.Picture = .OLEObjects("Image" & cnt).Object.Picture
cnt = cnt + 1
End With
End Sub
Private Sub musicChange()
If cnt = 1 Then
Call mciSendString("play """ & FILE_NAME & """", "", 0, 0)
Else
Call mciSendString("close """ & FILE_NAME & """", "", 0, 0)
End If
End Sub
曲はここから入れ子にしたいのだけど、最初の曲が流れない・・・
cntが初期値1でImageChangeで+1されてからmusicChangeを呼び出してる
つまりcnt=1でmusicChangeを呼び出すことはないわけだが
31 :
デフォルトの名無しさん:2011/11/29(火) 21:31:14.11
Private Sub musicChange()
If cnt = 2 Then
Call mciSendString("play """ & "C:\アンパンマン.mp3" & """", "", 0, 0)
Else
Call mciSendString("close """ & "C:\アンパンマン.mp3" & """", "", 0, 0)
End If
If cnt = 3 Then
Call mciSendString("play """ & "C:\カレーパンマン.mp3" & """", "", 0, 0)
Else
Call mciSendString("close """ & "C:\カレーパンマン.mp3" & """", "", 0, 0)
End If
・・・以下 cnt=7 まで
End Sub
>>30 ありがとー。ちゃんと見直したらうっかりだった。
で、このif文。うーん、確実にmp3をクリックで消すのでこの処理だけど
もっとスマートにならんかのー。
ファイル名を配列に突っ込んでおけばいいじゃない。
んで、ループで回してcntに一致している奴だけplayで後は全部close。
33 :
デフォルトの名無しさん:2011/11/29(火) 21:42:18.96
初心者です。
実行時エラー1004が出ます。
どこを直せばいいのか教えてください。
windows7/excel2010
Sub SetRows()
With Worksheets("Sheet2")
.Activate
.Range(Cells(2, 2), Cells(5, 5)).EntireRow.Value = "hoge"
End With
End Sub
Cellsの出所が怪しいな。
>>33 標準モジュールに書いてれば糞コードだけど一応それで動くはず。
Sheet2以外のシートモジュールに書いてあればRangeとCellsの親(シート)が違うので動かない。
正しくは
Sub SetRows()
With Worksheets("Sheet2")
.Range(.Cells(2, 2), .Cells(5, 5)).EntireRow.Value = "hoge"
End With
End Sub
とCellsにもシートの修飾をつける。
>>35 なるほど、なるほど
ありがとうございます!!
Sheet2以外のシートモジュールに書いてます。
インターネットのサイトを見て勉強し始めた段階なので
糞コードなのは申し訳ないです。
勉強になりました!
VBAの入力補完機能だっけ?(Ctrl+Spaceのヤツ)
自分で定義したConstなどなどが
入力補完されることに今更気がついた。
しかも標準モジュールにつけた名前なんかも
入力補完の対象なのね。
処理時間は落ちるかもしれないけど、
標準モジュール名.モジュール名〜などで
明確に定義付けすると意味が通ってメンテが楽になりそう。
38 :
デフォルトの名無しさん:2011/12/01(木) 10:32:45.43
VBAからデスクトップ上などになるtxtファイルの中身を操作(文字列の追加・書き換え・削除)することは可能ですか?
可能
40 :
38:2011/12/01(木) 15:48:27.73
どうするのかを聞いておるのだ、アホ
41 :
デフォルトの名無しさん:2011/12/01(木) 15:53:42.14
>>40 VBAでそういうコードを書けば良い
OK?
>>38 は可能かどうかを聞いてるだけだが? アホ?
ここはあえてOPENステートメントを推してみる。
How meny files? な世界も偶には良いよね。
Windows Script Host Object Modelへ参照設定して
Dim DesktopPath As String
Dim ShellObject As IWshRuntimeLibrary.WshShell
Set ShellObject = New IWshRuntimeLibrary.WshShell
DesktopPath = ShellObject.SpecialFolders("Desktop")
これでデスクトップのパスは得られるから、後は好きなようにやればよろし
FileSystemObject使ってファイルパスとってきてそれを開いてあなた色に染めてから閉じる
テキストファイルに色を付ける方法kwsk
47 :
デフォルトの名無しさん:2011/12/03(土) 11:02:53.92
48 :
46:2011/12/03(土) 11:15:11.77
そんなこと言わずに教えれ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄l/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∧_∧
( ´・ω・`) ∧_∧
/ \ ( )何言ってんだこいつ
.__| | .| |_ / ヽ
||\  ̄ ̄ ̄ ̄ / .| | |
||\..∧_∧ (⌒\|__./ ./
||. ( ) ~\_____ノ| ∧_∧
/ ヽ 空気読めよ \| ( )
| ヽ \/ ヽ. オマエ馬鹿だろ
| |ヽ、二⌒) / .| | |
.| ヽ \∧_∧ (⌒\|__./ /
51 :
デフォルトの名無しさん:2011/12/04(日) 03:36:25.49
VBAで日付のシリアルの変数はIntegerで保管しておいて良い?
あるいはLongにしないとだめ?
あらまDate型もあるのね。絶対にDateにしないとだめ?
>>51 用途による
IntegerでもByteでもお好きな型をどうぞ
2011/12/4はシリアル値だと40881だけど、必要な範囲はプログラムの作者にしかわからないから
53 :
デフォルトの名無しさん:2011/12/04(日) 09:46:54.70
>>52 Integerだと32000位までじゃなかったか?
54 :
デフォルトの名無しさん:2011/12/04(日) 10:45:24.69
NumberFormatとNumberFormatLocalの違いは
なんですか?
55 :
デフォルトの名無しさん:2011/12/04(日) 11:08:24.36
activecell.offset(1,0).select
activecell=10
activecell.offset(1,0).activate
activecell=10
これ結果は同じですよね?どちらがどういう理由で好ましいですか?
>>54 NumberFormatLocalプロパティ
使用中のWindowsの国別情報に従った言語の書式記号が表示される
NumberFormatプロパティ
Exel既定の言語(英語)に従った言語の書式記号が表示される
基本、NumberFormatLocalを使っておけばOK
57 :
デフォルトの名無しさん:2011/12/04(日) 11:26:58.13
>>56 なるほどよくわかりました。
Localは地球の地域という意味でのlocalだったんですね。
Thank you.
58 :
デフォルトの名無しさん:2011/12/04(日) 14:20:50.44
時間を変数にするときも型はdateでOK?
あと、date型に日付だけを代入して使ってるときって時間の情報もたとえば0:00:00みたいなのがダミーで入ってるの?
逆の場合も疑問。(時間を代入したときは日付も入ってる?もしそうならそのときの日時は?)
やりたいようにやれよ
いちいち他人に聞いてたら
出来るもんも出来んよ
>>58 > あと、date型に日付だけを代入して使ってるときって時間の情報もたとえば0:00:00みたいなのがダミーで入ってるの?
> 逆の場合も疑問。(時間を代入したときは日付も入ってる?もしそうならそのときの日時は?)
なぜ試さん?
61 :
58:2011/12/04(日) 17:38:50.35
みんなのVBA力と回答力を試しているんですが
>>61 VBA力とか言ってる時点でみんなより自分が格下なのに気付けよ
63 :
58:2011/12/04(日) 18:27:48.04
わからないなら無理にレスしてくれなくていいよ?
64 :
58:2011/12/04(日) 19:36:00.70
>>63 こら、それはオレのセリフだ
ニセモノめが
ここまでおれのじえん
ツマンネ
67 :
デフォルトの名無しさん:2011/12/05(月) 15:49:51.74
セルに色が塗ってて、
その色をRGB(x,y,z)で表すときのx,y,zの値を取得するにはどうすればいい?
>>67 C = Range("A1").Interior.Color
R = C And &HFF
G = (C \ &H100) And &HFF
B = (C \ &H10000) And &HFF
スレ違いでしたらごめんなさい
Excelを用いてオークションのシミュレーションをしたいのですが、そのためには何について学ぶべきですか?
参考となる書籍やサイトをご存知でしたら教えていただきたいです
現在、どうやらExcelでオークションのシミュレーションができそうだ、ということを知ったレベルです
よろしくお願いします。
70 :
デフォルトの名無しさん:2011/12/05(月) 23:46:22.60
>>69 Sub オークションシミューション()
Dim a As Integer
a = Int(Rnd * 100 + 1)
If a <= 20 Then
ActiveCell = "あなたは入札に性交しました"
Else
ActiveCell = "あなたは入札に失敗しました"
End If
End Sub
>>69 > Excelでオークションのシミュレーションができそうだ、ということを知った
どこで知ったのか知らんけど、そこで聞けよ。
>>71 それはExcelでシミュレーションをできるということを知って、自分のやろうとしてることも恐らくできるだろうと判断しました
どこかの掲示板で聞いた、というわけではないんです
>>72 > Excelでシミュレーションをできるということを知って
だから、どこで知ったんだよ。
て言うか、他人と会話したことないのか?
>>69 まずオクのシミュレーションはどんな作りにしたいのかをフローにして、
その後VBAでどう言ったコードにすればいいかを
考えればいいんじゃないかな
>>74 何から手を付ければいいかわからなかったので、とても参考になりました
ありがとうございます
ネットワーク上の共有フォルダにアクセスしたいんですが
VBAからネットワーク認証を行うにはどうすればよいのですか?
77 :
67:2011/12/06(火) 13:35:25.49
>>68 あなた頭いいですな
脳ミソ詰まってる
わたしにも分けてくれ
78 :
デフォルトの名無しさん:2011/12/06(火) 21:38:46.64
別シートを操作するとき、そのシートをactivateしないとできないんだっけ?
でもできることもあるみたいだし。
でもそれを忘れてるか気にしないでいるとエラーが出ることもある。
どなたかこのしくみはどうなってるか教えてくれませんか?
非常に困っております。
Excelで実際に操作するのと同じ様に使えばほぼ問題は無い。
でも、同じ操作で無くてもある程度は融通が利くよ。
って感じじゃね?
うまく動かなくて困ったら実際の操作を真似させる、で十分かと。
深く悩んだところで、MSの中の人すら完全に理解しているかどうか怪しいし。
>>78 特定のシートオブジェクトを明示的に取得して、activate せずに、そのシートに対して操作することは可能
activate しないと使えない機能もあるが、どちらかというとレアじゃないかと思う
問題はマクロの記録とかで記録したコードについては activate前提のコードの書き方になっているということで、
記録したコードをそのまま使い回したいなら、アクティベートしたほうが無難だとは思う
81 :
デフォルトの名無しさん:2011/12/06(火) 23:47:01.44
個人用マクロブックを作ったら
Excelを[X]で閉じようとしたときに
2回ボタンを押さないといけなくなりやがった。
これを防ぐ方法ある?
最近vbaの勉強始めた
大村あつしさんの参考書使ってる
4月までには使えるようになりたい
プロ野球の選手成績を管理したいんだ
野球ゲームの成績まとめでも使いたいし
84 :
デフォルトの名無しさん:2011/12/07(水) 19:26:41.10
>>83 メッセージはなにも出ないんだ。
みんなも個人用マクロブックを作ってたらそうなってるんでしょ?
85 :
デフォルトの名無しさん:2011/12/07(水) 19:27:27.27
>>78 activateしないとできないのは、copyメソッドとかpastespecialメソッドとかでしょ
他にもあったっけ
なぜできないのか、この辺の理屈がどうも分からないんだよな〜
87 :
デフォルトの名無しさん:2011/12/07(水) 21:12:04.89
Pasteメソッドが、シートに対して行うというのも理解できない。
なぜそういう仕様になってるかおわかりのかたいらっしゃいますか?
お知恵を拝借させてください。
下のように右クリックメニューから選択範囲のセルを塗りつぶす、みたいなことがしたいのですが、
「引数は省略できません。」のエラーになります。
どうすれば引数(例:34)を渡せますでしょうか?
Sub addMenu()
Dim CB
Set CB = Application.CommandBars("Cell").Controls.Add()
With CB
.Caption = "塗りつぶし"
.OnAction = "setColor(34)"
End With
End Sub
Sub setColor(col As Long)
With Selection.Interior
.ColorIndex = col
End With
End Sub
>>88 パージョンいくつ?
.OnAction = "'setColor(34)'"
又は
.OnAction = "'setColor 34'"
じゃないかな?(シングルクウォートで括る。)
ちなみに複数の引数を渡したい時は、自分の知ってる限りでは
.OnAction = "'setColor 34,4'"
とかでうまくいくハズ
>>87 仕様の理由はわからんけど、動作見る限りエクセルVBAって
人が操作する動作をトレースしてるだけだから
手動で出来ないことはVBAでも出来ないってコトでいいんじゃね?
だからコピーもペーストもシートをアクティブにしないと出来ないと。
>>90 VBの機能も使えるから出来ることは同じじゃない
>>86,90
Sub test()
Sheet2.Activate
With Worksheets("Sheet1")
.Range("C1:C5").Copy
.Range("D1:D5").PasteSpecial _
Operation:=xlPasteSpecialOperationAdd
.Paste (.Range("E1:E5"))
End With
End Sub
別にシートがアクティブじゃなくても使えますが?
>>87 (この場合の)Pasteメソッドがシートのメソッドなんだから対象がシートなのはまあ当然
RangeにPasteメソッドが無い理由なら解らん。PasteSpecialはあるのにな
どうせ操作対象をちゃんと指定してないから、アクティブシートが対象になってるだけだろ
アクティブじゃないとできない操作の実例教えてくれ
Activateが必要だと思ってる奴はド素人
どうせExcelのバージョンで挙動が違うとかいうオチだろ。
実際に使われる環境で正しく動けば、それで良いじゃん。
>>89 できました!ありがとうございました。
バージョンは2003と2007です。
96 :
デフォルトの名無しさん:2011/12/08(木) 22:14:25.21
さまざまな処理を各プロシージャが担当させるようにし
本体プロシージャはシンプルそのもの、
そしてプロシージャから他のプロシージャを呼び出しまくるような
かっこいいプログラミングがしたいです。
そんなスキル (=プロシージャを呼び出しまくるスキル) を学ぶに特化した学習用の本があれば紹介していただけますか?
最近学習を始めたばかりの初心者です
わからないことがあったので質問させてください
VBAを使って
1、2500、5000、7500
の4つの数字をランダムで選ぶ
そしてこの動作を繰り返す
というプログラムはどうやって書けば良いのでしょうか
よろしくお願いします
丸投げいくない
>>98 すいません
できるか出来ないかだけでも教えていただけますか?
この4つをMT乱数を用いて選び出したいんです
そしてこの試行を繰り返す、という動作です
数字を配列変数に代入
乱数を取得
乱数の3の余剰を求める
前記余剰を配列番号に与えてアタイを撮る
数字を配列変数に代入
乱数を取得
乱数の3の余剰を求める
前記余剰を配列番号に与えてアタイを撮る
アタイをLogに出力
の上記をひたすら気が済むまでLoopする
>>97 0〜3もしくは1〜4の整数の乱数の出し方知ってる?
配列(0)に1
配列(1)に2500
配列(2)に5000
配列(3)に7500
に入れておいて0〜3の乱数で3が出たら配列(3)の値を取得すればいい。
配列が分からなければCellsを使ってもいいだろう。
そんときゃA1〜A4に希望する数値を入れて1〜4の乱数を求め4が出たらCells(4,1)の値を取得すればいい。
最近は配列に入れないでCollectionに入れるDQNがいるけど。
>>99 もちろん「できる」
ところでVBAの乱数って内部アルゴリズムは公開されてたっけ?
MT乱数の使用が必須条件なら自分で乱数発生プログラムも書く必要があるかも
MT乱数 VBA
で
ヤホーでググればたくさん落ちてる
ちなみにワシは100-101だが
ボケてた。
3の余剰じゃなくって4の余剰だ
みなさんありがとうございます
C言語の基本的なことはわかるので、配列で出来そうです
乱数は自分でプログラム書かなくても大丈夫だったような……
わからないことだらけなのでまた質問することもあるかとは思いますが、その時はよろしくお願いします
今回は皆さんのおかげで解決出来ました
ありがとうございます
>>105 C言語の基本なことがわかってる奴が
>>97 みたいな質問するのか?
と、思った奴は俺だけじゃないと思う。
>>103 正式には公開されてないけど、どこかで解析されてたぞ。
MT乱数ならExcelで使えるdllがある。
なんか64bitのWindowsでは使えないみたいだが。
PtrSafeかましてもうまくいかん。
うまくいかんのは64bitのExcelだった。
VBA上だと変数のビット数が足りなくて完全なMTは実装できないとかなんとか
>>106 すいません
実はVBA触るのは今回が初めてでなにが出来てなにが出来ないのかがまるでわかってないんです
基本Cと同じく考えて良いんですかね
>>111 まじめにCが普通に使える奴なら、VBA はマージン見ても一週間もあれば
それなりに使えるようになると思う。
ポインタは使えない (異論ある人もいるだろうけど、あえて言い切る) けど、
構造体もあるし、似たようなもんだと思っていい。
>>112 Cが使えるか?と言われると中々自信が無いですけどね
基本は学んだことがあるので、コードを見てなにが書いてあるか位なら何となくはわかるかと
おかげで少しやる気がでました
とりあえずやりたいことに関する参考書でも探してみようと思います
>>113 > コードを見てなにが書いてあるか位なら何となくはわかるかと
自分で書いたことはないってこと?
読めるのと書けるのの間はそれなりにある (例えば小説考えればわかるでしょ) ので、
一週間じゃ難しいかも。
幸いなことに VBA はネットにも本屋にも山ほど情報はあるから、じっくりがんばれ。
文章と違ってコードは書くより読む方が難しいと思うんだけどなあ
117 :
デフォルトの名無しさん:2011/12/10(土) 12:35:07.22
大は小を兼ねるから
変数の型は
integerやlongやは使わず
すべてdoubleにしていいですか?
整数使いたいの?小数使いたいの?どっち?
>>117 プログラムが複雑になってくると、最小限に切り詰めた方が計算は速くなるんだけど
そういう質問をするレベルなら大したプログラムは作らんだろうから、たぶん大丈夫
すべてVariant使えばいいじゃん
>>116 >文章と違ってコードは書くより読む方が難しいと思うんだけどなあ
読むと言う意味が違うんじゃない?
俺は、例えば I = I + 1 がどういう動作かわかるのを読むと言ってて、
貴方はプログラム全体がどういう動作するかをl理解することを読むと
言ってるんじゃない?
122 :
デフォルトの名無しさん:2011/12/10(土) 15:52:32.15
そういえば変数じゃなくて定数は型宣言しなくていいんだっけ?
いま手元にあるVBAの本には定数のことについての説明が1ページもない。
変数は
Dim a as Integer
だけど、
定数は
Const a=3.14
みたいな感じ?
それとも
Const a as Double = 3.14
みたいに書くんだっけ?
↓自分で作って動かしてるもの w
Public Const shisuu As Integer = 0
Public Const sakimono As Integer = 4
Sendkeysステートメント(メソッド)を使って、他アプリケーションへの入力作業を行っています。
日本語入力の文字化け現象についてはVBAではどうにもならないと聞きました。
クリップボードを経由してもダメでした。
何か良い方法は無いでしょうか?
ファイルから読み込みしたら?
SendMessageすれば*
>>126 ありがとうございます。
SendMessageについて色々調べてみましたが、今一理解できません。
失礼は重々承知ですが、使い方を教えて下さいませんか?
とりあえず、Yahooトップページの検索ボックス(既にフォーカスされているものとして)に
下記の文字列を送信するコードを教えて下さい。
"日本語で入力します。"
よろしくお願いします。
128 :
デフォルトの名無しさん:2011/12/10(土) 20:36:01.01
定数はどうやって型宣言するんだっけ?
Const a=3.14
みたいな感じ?
それともこう?
Const a as Double = 3.14
このスレ的には、
>>&H80
>>&H7B
じゃね?
131 :
0x81:2011/12/10(土) 21:30:56.65
すまぬのう
ExcelVBAで組み込みCの色々なテーブルとかマクロ作って生活の足しに
しているんでな。
つーかワークシートの位置指すのにヘキサで書く理由がわからないですが
そういう仕事の人はいますか?(居たら事例を聞きたい)
132 :
0x81:2011/12/10(土) 22:16:12.22
すまん、自分でも何言っているのかわからない。
まぁ、ワシのティンコは言うこときかないんですけどね。元気すぎて
>>127 Sub yahoo_search()
Dim objIE As Object
Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True
objIE.navigate ("
http://yahoo.co.jp")
Do While objIE.ReadyState <> 4
DoEvents
Loop
SendKeys "日本語で入力します。"
SendKeys "{ENTER}"
End Sub
VBAのSendKeysは普通に日本語送れるけど
>>124はどういう状況なんだろう
2バイト文字入力で化けるソフトがあって、その入力支援が出来ません
ってことかな
表示がバグるだけで内部データは問題ないんじゃね
136 :
0x81:2011/12/11(日) 00:20:33.70
ADOと使って変換すればいけるの?
>>133 >>134 すみません!完全に私の記述ミス&勘違いです!!
エクセルファイルの各内容を変数に取得して、
社内システムにフォーカスを移して入力を試みています。
半角文字列や数字は問題なく入力できるのですが、
全角文字列(日本語)をSendkeysで送っても文字化けしてしまうのです…
文字化けしないようにするにはSendMessageを使う必要があるって聞きましたが、
使い方がよく分かりません。お手数掛けてすみませんが、ご教授お願いします。
>>135 え、そうなんですか?
月曜日に確認してみます!
ありがとうございます!!
>>137 全角文字とSendKyesの組み合わせだと、
入力したい全角文字列をクリップボートにコピーしてから、SendKeys で Ctro+V のみを送るって方法がある
>>139 ありがとうございます。
でも、 ^V って何故だか動作しませんでした…
>>139 なるほど
みんな苦労してるんだなあ
うちもツギハギのWEBアプリで四苦八苦してるよ
十何年もかけて機能の拡張やバージョンアップを繰り返してるから画面のデザインとか操作体系がめちゃくちゃになってる
支店が全国に一万店以上あるからうっかり大幅に変更すると再教育のコストもかかるしどうにもならなくなってきてる
うーん、確かにメモ帳だと SendKeys "^v" で貼り付けできるのにIEだとできないね
何度も試してるとできることもあるけど、再現条件がわからん
Sleepで待ち時間を入れてもDoEventsをはさんでも同じ
半角だと貼れるのに全角は貼れない
わけがわからん
VBAでDOSコマンド書いてそこから介入
できた
VBAのSendKeysではうまくいかないけど、VBSのSendKeysならうまくいくことがわかった
以下のサンプルはクリップボードにデータを設定する部分で警告が出るけど、そこは問題の本質じゃないので無視してくれ
Sub yahoo_search()
Set IE = CreateObject("InternetExplorer.application")
IE.Visible = True
IE.navigate ("
http://yahoo.co.jp")
Do While IE.ReadyState <> 4 '表示終了まで待つ
DoEvents
Loop
Set ws = CreateObject("Wscript.Shell")
IE.Document.ParentWindow.ClipboardData.SetData "text", "英語を貼り付ける。"
ws.SendKeys "^v"
End Sub
っていうか相手がIEだったら(
>>124)
SendKeysなんか使わずにDOM操作した方がよくない?
例えば
>>133のコードを拝借すると、SendKeysの2行をこんな風にする
objIE.Document.getElementById("srchtxt").Value = "日本語で入力します。"
objIE.Document.getElementById("srchbtn").Click
対象がすでに表示中のIEだと捕まえるのがちょっと面倒だけどね
146 :
145:2011/12/11(日) 07:25:19.85
うわ編集中に送ってしまった
1行目
っていうか相手がIEだったら(
>>124)
↓
っていうか相手がIEだったら(
>>124は「社内システム」としか書いてないからわからんけど)
147 :
デフォルトの名無しさん:2011/12/11(日) 09:07:00.03
環境 XP、Office2003
[Sheet1]
Private Sub Worksheet_Calculate()
Worksheets("Sheet1").操作()
End Sub
という事を実現したいが、シート名は可変です。
で、
Private Sub Worksheet_Calculate()
ActiveSheet.操作()
End Sub
という例を見かけますが、この場合 ActiveSheet が Sheet1 という保証はあるのでしょうか。
(手元にExcelがないのでコードは不正確かもしれません)
148 :
124:2011/12/11(日) 09:16:05.26
>>142-146 お返事が遅くなりすみません。
社内システムはIEではありません。
.exeファイルです。
…VBSのSendkeysとか想像もしてませんでした。
DataObjectでクリップボードに格納して、VBSのSendkeysを試してみます。
いずれにせよ、月曜日じゃないと確認できませんが。。。
何度もアドバイス下さり、本当にありがとうございます!
また、結果などをご報告いたします。
>>147 ブックの"Sheet1"という名前のシートに操作をするなら
For i = 1 To ActiveWorkbook.Sheets.Count
If ActiveWorkbook.Sheets(i).Name = "Sheet1" Then
操作
End If
Next
にしたらいかがでせうか
150 :
149:2011/12/11(日) 10:36:30.35
レスを良く見てなかったんで
取り消してくらはい
>>147 >という例を見かけますが、この場合 ActiveSheet が Sheet1 という保証はあるのでしょうか。
当然そんな保証はない。
「シート名は可変です。」と書いてあるが、ではソノシート名はいつどこで指定するのか?
あらかじめ指定しておくと言うなら、
Dim SheetName As String
Private Sub Setup( )
SheetName = "Sheet1"
End Sub
Private Sub Worksheet_Calculate( )
Worksheeets(SheetName).操作( )
End Sub
でいい。
Sheet1 がないケースなどがあるなら、適切なエラー処理が必要。
あと、本来名前でいろいろ参照するのはお勧めしない。
>>151 の例なら、
Dim TargetSheet As Worksheet
Private Sub Setup( )
Set TargetSheet = Worksheets("Sheet1")
End Sub
Private Sub Worksheet_Calculate( )
TargetSeet.操作( )
End Sub
の方が (個人的には) よりいいと思う。
>>147 Worksheet_Calculateイベントはアクティブシートがどこにあっても発生する可能性があります
シートモジュールの中で自分自身に対して何か処理をしたい場合はシート名を書かなければ良いだけです
[Sheet1]
Private Sub Worksheet_Calculate()
操作() ' ←これだけ
End Sub
シート番号指してシート名取得してその名前が欲しいシート名と一致ならば処理すれば?
変なエラーが起こらない。
For I = 1 To Worksheets.Count
If Worksheets(I).Name = "Hoge" then
'やりたいことやる
endif
Next
>>147 すんまそん、アンカ忘れてた。
今からカリ首吊ってくる
シート番号指してシート名取得してその名前が欲しいシート名と一致ならば処理すれば?
変なエラーが起こらない。
For I = 1 To Worksheets.Count
If Worksheets(I).Name = "Hoge" then
'やりたいことやる
endif
Next
Excel:2007、OS:Win7
上書き保存時、セーブ前に行列番号を消し、保存後、行列番号を再度表示させたいです。
ビュアーで見る時に番号を消したい、という意図です。
とりあえず調べた限り、以下でいいと思ったのですが以下の問題点でつまずいています。
・そもそも保存されない
・ブックを閉じようとすると上書き保存するか聞かれるが保存するを選んでも何度も同じことを聞かれる。
いいえかキャンセルのみで抜けられる。
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean _
, Cancel As Boolean)
With ActiveWindow
.DisplayHeadings = False '行列番号消し
ThisWorkbook.Save 'セーブ。できてない?
Cancel = True '通常の上書き保存をキャンセル
.DisplayHeadings = True '行列番号表示
End With
End Sub
>>156 環境が無いんで確認できないけど、
ThisWorkbook.SaveがWorkbook_BeforeSaveを誘発してるでしょ。
自分で聞いてやるしかないと思うよ。
Msgbox("保存しますか?",vbYesNo)
Yesなら
Application.DisplayAlerts = False
ThisWorkbook.Save
Application.DisplayAlerts = True
メッセージは、Ctrl+S時に表示しちゃまずいから、
BeforeCloseで保存確認しちゃった方がいいかもね。
まぁ結局はWorkbook_openで
DisplayHeadings = True '行列番号表示
しちゃう方が簡単だと思うんだ。
>>156 Saveの直前にイベント抑止してみるとか
Application.EnableEvents = False
ThisWorkbook.Save 'セーブ。できてない?
Application.EnableEvents = True
ただ、保存されたものは常に行番号なしになるのでopen時には再度行番号有効化してやるとかの考慮は必要になる
あと、実際に保存された直後、
.DisplayHeadlings = True
の行でおそらく編集扱いになるので、ただ閉じようとしても必ず
保存しますか?
と聞かれてしまうのは仕方ないように思える
157>>
返信ありがとう!
上司からのオーダーなもんで出来るだけ対応したいんだけどねぇ。
Ctrl+Sでやりたいから、必ずしもウィンドウを閉じる時ばかりじゃないもんで。
俺もこれを聞く前に閉じるときにセーブ前に非表示→開くときに表示というふうに
したんだけどそれだとダメらしい
出来ればCtrl+Sとかでも対応できるようBeforSaveでやりたいが……
自前の保存マクロでやるしかないかな……
>>158 >.DisplayHeadlings = True
>の行でおそらく編集扱いになるので
ThisWorkbook.saved=Trueでどう?
>>158 こっちもありがとう!
イベントの抑制・・・そういうのもあるのですね。参考にしてみる。
開くときに表示ON自体は_OpenでしてやればOKですね。実際それはもう仕込んであるので。
しかし、なるほど、結局、表示消すのが編集扱いになってるから何ども聞かれるのか。
そりゃそうだわな……
>>160 遅れたがサンクス。
とりあえず各アソバイスを入れた結果、Ctrl+Sで保存で行が消せるようになった!
ビュアーでみてもちゃんと消える。
ただ
・ブックを閉じようとすると上書き保存するか聞かれるが保存するを選んでも何度も同じことを聞かれる。
いいえかキャンセルのみで抜けられる。
は解消されないな……一度保存すればあとはいいえ押せばいいだけなんだけどね。
ThisWorkbook.Saved = Trueの使い方がまずい?
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean _
, Cancel As Boolean)
With ActiveWindow
.DisplayHeadings = False '行列番号消し
'Application.DisplayAlerts = False
Application.EnableEvents = False
ThisWorkbook.Save 'セーブ。できてない?
Application.EnableEvents = True
Cancel = True '通常の上書き保存をキャンセル
.DisplayHeadings = True '行列番号表示
ThisWorkbook.Saved = True '変更適応OK
End With
'Application.EnableEvents = False
End Sub
※その他、Open時とClose時にそれぞれ行列表示のOn,Offをいれてます。
あ、vbNoの処理間違ってた。
Saved=Trueが必要かな
165 :
147:2011/12/11(日) 23:51:37.67
Worksheet_Calculate()時のActiveSheetは自シートか?という質問に関し、
>>149-155 ありがとうございました。勉強になります。手元にExcelが無いので明日試させて頂きます。
が、理解を超えている点があるので再質問させて下さい。
>>153 > シートモジュールの中で自分自身に対して何か処理をしたい場合はシート名を書かなければ良いだけです
その場合、省略された自分自身を表わす記法はどのようになりますか?
例えば、自シートをローカル変数に代入したいとか。(他モジュールで使い回したいような目的で)
[Sheet1]
' Set SelfSheet = Worksheets("Sheet1") 相当をシート名無しで実現するには?
Dim SelfSheet As Worksheet
Set SelfSheet = ' ThisWorksheet と書きたいが。
>>165 俺はそんな時 Me を良く使うお
Set SelfSheet = Me
すいません、質問が
VBAを使って、
Aというセルに数値を入れた時に、BというセルにそのAに入れた数値によって様々な値を出力する
というのを作りたいのですが、どうすればいいのでしょうか
>>167 セルBにセルAを参照する数式を記述する
質問です
mnock = 1: hno = 1の
:ってどういういみなんですか?
代入を一行に書いたわけではないんですよね・・・
改行の代わり
>>170 そうなのか・・・特殊記号かとおもってしまいました
ありがとう
範囲指定をして何か処理(ソートとか)した後、その選択範囲が選択されたままになってしまいますが、それを解除する命令
とかってありますか?
何処かのセルを選択すればそれが解除されはするんですが、それとは別に言ったような選択を解除するようなものがあるのか
?と思いまして。
未選択状態見たこと無いから無いんじゃない?
thxです
やっぱり無いですかね w
175 :
デフォルトの名無しさん:2011/12/12(月) 11:18:55.59
質問があります。
OS:Windows 7 Ultimate 64bit SP1
Excelのバージョン:Office 2007 Personal SP3
A1-A10までのセルのいづれか1つに*が入力されたら、それ以外のA1-A10のセルを空にしたいです。(排他?)
※A1-A10のうち、*が入力されているのは常に1つの状態にしたいという事です。
よろしくお願いします。
わーくしーとあふたーあっぷでーと()
A1〜10に入力があったら他排除
えんどサブ
177 :
175:2011/12/12(月) 12:35:42.16
>>176 すみませんが、貴方の言う「A1〜10に入力があったら他排除」が分からないと質問をしているのです。
回答する気がないのであれば、中途半端なレスはいりませんよ、176さんも暇じゃないでしょうから。
>>175 おまえの態度が気に入らない
VBAを勉強する前に掲示板の使い方を覚えろ
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
r = Target.Row
c = Target.Column
If c = 1 And r <= 10 Then
If Cells(r, c) = "*" Then
Range("A1:A10").Clear
Cells(r, c) = "*"
Else
Intersect(Target, Range("A1:A10")) = ""
End If
End If
Application.EnableEvents = True
End Sub
180 :
175:2011/12/12(月) 13:12:20.64
>>179 態度を改めます。
掲示板の使い方も覚えます。
コードありがとうございました。
ああごめん、フックが解んないかと思ってたわ
>>163 サンクス。かなり参考にさせてもらった。
でもブックを閉じた時、保存ではいを押しても保存出来ないっぽい。2007の差でもあるのか
ちなみに皆さん、マクロ配布するときどうしてます?
エキスポートでcls出してインポートで使わせようと思ってもthis bookに書かなきゃうまくうごかなかった。そもそもVBAわざわざ開かせるのも微妙で。
>>172 Application.CutCopyMode = False じゃないのか?
>>182 プログラムの入ってるブックとデータの入ってるブックは別にして
配布はプログラム用のEXCELブックを丸ごと配布する
184 :
デフォルトの名無しさん:2011/12/12(月) 14:24:08.14
オブジャクト指向ってなんですか?
オブジェクト指向は、継承とポリモルフィズムです
smalltalkという言語が有名
186 :
184:2011/12/12(月) 14:39:05.33
わたしが聞いてるのは「オブジャクト指向」のほうなんですが
187 :
175:2011/12/12(月) 15:34:06.89
>>179 度々すみません。
*の排他入力?は出来たのですが、
文字列の中央揃えなどの設定が消えてしまいます。
書いてあるコードググれよ
宿題なら自分でやりな
俺が聞く時に雰囲気悪くなったらどーすんだ!
それを気にするほどのやわな神経なんてないだろ
190 :
デフォルトの名無しさん:2011/12/12(月) 17:16:44.25
VBAでシート関数はApplication.Sheetfunction.[関数]と書けばどんなものもつかえる?
>>187 >>175 >>2 >★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
> コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
> ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ
と書いてあるんだが 読んだのか?
>>191 当たりまえです
>>187を聞いてるのに関係ない話で誤魔化さないでください
わかりもしない、答える気もない屑が掲示板を荒らすのは本当に不愉快です
オレ ジエン ここまで ぜんぶ
俺の自演って言ってるじゃないですカー!
中央でそろえるとか、マクロの記録があるんだからそれ使えばいいじゃない
そのコードを今までのに追記するだけなんだし。
ここでやり取りしてる時間の方が無駄でしょ
>>190 使えないものもあるよ。そういう時はEvaluateを使うみたいだけど。
198 :
124:2011/12/12(月) 20:29:23.23
今日、会社で色々試しました。
解決策は意外な盲点にありました。
私はSendkeysはApplicationクラスのものを利用していましたが、
(こっちの方が安定性が高いらしいので)
普通のSendkeysを使用したら文字化けしませんでした。
それからメニュー等を操る時は、大文字入力だと失敗することが多いですね。
いずれにせよ、親身にアドバイスを下さった皆さん、
本当にありがとうございました。
そういや「Sendkeysステートメント(メソッド)」って書いてたもんな
なんでメソッド?と微妙にひっかかっていたがそういうことか
>>191 すみません。
他にExcelのVBAスレが見当たらなかったもので、勝手は承知で質問してしまいました。
>>196 失礼ですが、このスレの回答側の人はその程度のレベルなんですか?
>>179 さきほど、.Clearの所を= ""にしたら、できました。
あえて、勉強のために.Clearを使って書いてくれたのかな?
質問者が恐らく理解出来るだろう内容で回答してるよう見えるけど
>>201 私が言っているのは>179さんに対してではなくて、>196さんの発言に対してです。
>179さんのコードは綺麗だと思います。
.Clearメソッドを使った意図が、私に学習させるためなのかなと思っただけです。
なので、>179さんには感謝はすれど文句はありません。
度々すみません。
>>179さんの書いてくださったコードで、
>r = Target.Row
という部分があると思いますが、これをAとかBで指定できるように
したいのですが、何かうまい方法はありますでしょうか?
これを、If c = 1 And r <= 10 Then
こうしたいです。
Dim strRowPos as String
strRowPos = A
If c = strRowPos And r <= 10 Then
ここを見て調べているのですが見つけられなくて。
www.eurus.dti.ne.jp/yoneyama/Excel/vba/index.html
度々すみませんが、179さんか分かる方いたら教えてください。
どうかよろしくお願いします。
またまたすみません。
Dim strRowPosA as String
Dim strRowPosN as String
strRowPosA = A
'
'ここで、strRowPosAを数値にして、strRowPosNに入れたいということです。
'その変換方法がないかなと。
'
If c = strRowPosN And r <= 10 Then
うーーーーーぜーーーーーーーーーーー
だぁ・・・。
スレ伸ばしてすみません。
誤)Dim strRowPosN as String
正)Dim strRowPosN as Integer
スレチ押し通すなっての。
既に聞く態度じゃないとと取られてんだし、誰も真面目に答えないよ?
>>207 失礼ですが、どこがスレチなんでしょうか?
>>2の>★5と指摘されたので、調べつつ少しなりとも自分でやっているんですけど。
聞く態度じゃないというのも具体的に分かりませんが、改めて私のできる範囲で丁寧な
言葉でレスしているのですが。
ちなみに、誰も答えないとおっしゃられていますが、それは貴方の推測ですよね。
事実、もしそうであれば
>>178でレスが止まっているはずですが、
>>179氏はちゃんと指摘
とレスをしてくれましたよ。
質問者の立場で何ですが、一言あなたに言わせていただくと、あなたは回答できないので
はないですか?
基本2chて自分が嫌だと思ったらスルー推奨ですよね。
それで結果的にスマートではないと思うのですが、26進数変換の関数を作って対処(仮)しました。
もしもっと、いい方法を知っている方いらっしゃいましたら、教えていただけると助かります。
209 :
デフォルトの名無しさん:2011/12/13(火) 00:23:31.37
211 :
デフォルトの名無しさん:2011/12/13(火) 00:37:20.63
213 :
デフォルトの名無しさん:2011/12/13(火) 00:41:27.05
超初心者です・・・
Sub 例題()
Dim n As String
For n = 1 To 10
Cells(n, 1) = n
If n Mod 2 = 0 Then
Cells(n, 2) = " 偶数 "
End If
Next n
End Sub
で型が一致しないとでるのですがどうすればよいでしょうか
ちょっと煽られただけですぐ感情的に反論するとか、どんだけ子供なんだよ
気に入らないレスは無視しろ
正論でも印象悪い
書き間違いが多すぎる
書き込む前に3回読み直せ
strRowPosA = A ← これは不可能。こういう書き方だとAは変数名になってしまう
やるならこう
strRowPosA = "A"
strRowPosN = Cells(, strRowPosA).Column
さらに言えば、ワークシートのA、B、C…はRowじゃなくてColumnだから、全体を修正すると
Dim strColumnPosA as String
Dim strColumnPosN as Integer
strColumnPosA = "A"
strColumnPosN = Cells(, strColumnPosA).Column
If c = strColumnPosN And r <= 10 Then
>>213 ○ Dim n As Integer
× Dim n As String
授業はちゃんと聞こうね
>>214 すみません。
指摘感謝です。
>179さんかな?
コードありがとうございました!
202
>>196ですら君は及ばないレベルだと自覚出来ない時点でもうね
218 :
デフォルトの名無しさん:2011/12/13(火) 00:56:20.86
219 :
147:2011/12/13(火) 02:19:10.83
>>166 ありがとうございます。まとめます。
<Q>
[Sheet1]
Private Sub Worksheet_Calculate()
Worksheets("Sheet1").操作()
End Sub
という事を実現したいが、シート名は可変です。
で、
Private Sub Worksheet_Calculate()
ActiveSheet.操作()
End Sub
という例を見かけますが、この場合 ActiveSheet が Sheet1 という保証はあるのでしょうか。
環境 XP、Office2003
<A>
ActiveSheet が Sheet1 という保証は無いので、
Me.操作()
とすると良い。
220 :
デフォルトの名無しさん:2011/12/13(火) 09:41:54.02
「VBAは完全なオブジェクト指向ではない」との記述を見たのですが
このことをオブジェクト指向のことを十分には理解していない人に
200文字以上で説明してくださいませんか?
>>220 >十分には理解していない人
どこのどいつだ?
Deutschでもよければ400字くらいで?
222 :
220:2011/12/13(火) 14:52:35.87
>>221 ここのオレだ。
I'd rather prefer English than Deutsch.
I'd rather prefer English wife than Deutsch wife.
224 :
デフォルトの名無しさん:2011/12/13(火) 18:22:12.32
VBAでいくつか文字列が入ったセル(その時によりセルの数が違う)があって
そのうち昇順で並べて一番最後の文字列だけを取り出す方法はどうしたらいいですか?
225 :
224:2011/12/13(火) 18:22:47.09
セルちゃうわ、シート名だった。
シートの数は、ファイルによりいつくあるかはわからないの。
>>224 Sub 最後のシト()
s = ""
For Each ws In Worksheets
If ws.Name > s Then s = ws.Name
Next
Debug.Print s
End Sub
227 :
147:2011/12/13(火) 19:31:28.61
>>220 俺もオブジェクト指向とか理解していないけど、
継承できなのにはかなりまいった。
Excelではないのですが・・・知恵をお貸しください
Visioで下記の図を作成しようと思っています
A→ F→Z
B→↑
・Aに値が入ると、F・Zにも値が入る
・Bに値が入ると、F・Zの値がクリアされ、Aに値が入っている場合はAに値が入っている状態を維持。Bをクリアすると、上記と同じA・F・Zに値が入る
ここまではVBAで作成できたのですが、これを
・(Bに値が入っていない状態で)Aの値をクリアしてもF・Zの値をそのまま維持
にしたいのですが、値を維持するためにFにstaticを宣言してもうまくいきません。
そもそも、Staticでいいのかすら、迷ってきて・・・値を維持できるうまいやり方はないでしょうか
>>229 226
が
213
のボケをかますとは思えない
つーか一々煩いからお前が黙ってろ
>>220 オブジェクトを部品として利用することは出来るが
既存のオブジェクト(クラス)を継承して新たな部品を作ることは出来ない
シートで行を削除するのにマクロの記録だと1行目・2行目を消すのに
Rows("1:2").Select
Range("A2").Activate
Rows("1:2").Delete Shift:=xlUp
Range("A1").Select
というのが出来たんで、この開始行と終了行を変数にしたい。
んで、
i= 11
endrow = 13
とかして
Rows(i:endrow).Delete Shift:=xlUp とすると構文エラーになってしまいます
行を変数にするのはどのようにしたら良いんでしょう?
Rows(i:endrow).Delete Shift:=xlUp
↓
Rows(i & ":" & endrow).Delete Shift:=xlUp
236 :
デフォルトの名無しさん:2011/12/14(水) 18:54:02.39
>>235 ついでに言うと、Rowsに対するDeleteは常にxlUpだからShift:=xlUpは不要
削除は下から消さないと・・・
239 :
デフォルトの名無しさん:2011/12/14(水) 22:21:48.02
>>238 分割された領域なら下からとか右からで削除しないと面倒だけど、
連続の領域をまとめて消すんなら別にどうでも良いんじゃね?
アドバイスお願いします。
数字、名前のペアが複数あって、数字をキーにすると名前が取り出せて、
名前をキーにすると数字が取り出せる連想配列のようなものを作りたいのですが、
VBAではどのようにすると効率的でしょうか?
それぞれ、一意的にペアが決まっています。
>>240 Scripting.Dictionary オブジェクトを2つ用意して、
一方は数字をキー、もう一方は名前をキーと使い分ければいい
242 :
240:2011/12/15(木) 22:30:21.63
どちらで聞いたらいいのか分からなかったのでこちらで聞きますが
セルの値を数値処理する場合vbsから操作するのとvbaから操作するのだとどちらが計算早いですか?
vbs
Excelとのやり取りが殆ど無い場合でも、
腐っても型付言語であるVBAの方が速いと思う。
やり取りが多い場合はインプロセスとアウトプロセスの
越えられない壁があるからVBSに勝ち目無し。
VBSでエクセルを偽装してだね
247 :
デフォルトの名無しさん:2011/12/16(金) 08:03:26.05
x個の数からy個の数をランダムに取り出したいときってどうしてますか?
数の集合が{1, 2, 3, 4, 5}つまりx=5でy=3の場合だと
毎回
2, 3, 5
1, 2, 4
3, 4, 5
みたいに5個の数のうちランダムに3つ選び出す、というアルゴリズムです
単純にやるなら乱数3つ
問いの内容ならxCy個の中から乱数1つ
1なら(123)、2なら(124)……て形で割り振るアルゴリズムを通してゲット
重複や順列の内容で幅を変えればいい
vbaって動的の多次元配列ってできねえの?
型はstringで
なんでそういうサイトを上げるんかねぇ。
恥かかせるためか?
dim hoge(,) as string
これだとエラーなんだけど
dim hoge[][] as string
これもエラーだった
二次元で要素数が不定の動的配列はできないんじゃないの?
検索するとできるって書いてあるページもあるけど、サンプルをコピペするとエラー出るし
VBとVBAを勘違いしてんじゃないかと思う
要素数固定で宣言して、片方の次元だけReDimする方式の動的配列なら可能だけど
>>250 Dim hoge() As String
ReDim hoge(10, 5, 3)
hoge(0, 0, 0) = "3次元"
Debug.Print hoge(0, 0, 0)
>>257 思ってたのとちょっと違いますけどこれとpreserveで代用できそうだな
ありがとうございます
259 :
デフォルトの名無しさん:2011/12/17(土) 00:44:13.36
WindowsAPIを使用したいときは、いちいち定義しないとダメなんでしょうか?
現場では資料もなくネットも使えない環境なので手打ちをキツイです。
>>259 いちいち定義しないとダメですが、WinAPIなら百科事典が発売されているのでそれを持ち込むという手も
あとはmsdnのオンラインヘルプ(CD-ROM版)を用意して、CのソースをVBAに書き換えるマクロとか用意すれば
なんとかなるでしょう
vbaでこんな感じのリクエストを飛ばすのってどうやるのですか?
GET / HTTP/1.1
Accept-Language: ja
Accept-Encoding: gzip
User-Agent: hoge (1.1.1)
Host: wwww.aaa.bb
GET /hogehoge.cgi HTTP/1.1
Accept-Language: ja
Accept-Encoding: gzip
User-Agent: hoge (1.1.1)
Host: wwww.aaa.bb
送るとこかいてませんでした
>>261 WinInet関連のAPIを使う
HttpAddRequestHeadersしてHttpSendRequestかな?
WinHTTPライブラリ(WinInetの後継らしい)てのもあるが詳細はしらない
これ以上はスレチになるんで
ググるか APIのすれで聞いておくれ
>>261 ネットのやりとりはいろんな方法がある
たぶん、こんな感じで行けると思う
Set oHttp = CreateObject("MSXML2.XMLHTTP")
oHttp.Open "GET", "
http://www.aaa.bbb/hoge.cgi", False
oHttp.SetRequestHeader "Accept-Language", "ja"
oHttp.SetRequestHeader "Accept-Encoding", "gzip
oHttp.SetRequestHeader "User-Agent", "hoge(1.1.1)"
oHttp.Send ' リクエスト送信
istatus = oHttp.Status ' 結果確認
If istatus = 200 Then s = oHttp.responseText ' 本文(HTMLソース)取得
Dim WS As Worksheet
Set WS = Worksheets("記録")
Worksheets(WS).Activate ←
で、矢印の部分で型が一致しないって出るんですけど、String型でないと駄目ッてこと
ですか?
Dim WSName As String
WSName = "記録"
Worksheets(WSName).Activate
じゃないの?たぶん
267 :
デフォルトの名無しさん:2011/12/17(土) 09:52:46.36
>>265 265の方法でもよいし、Object型(Worksheet型)で宣言したときは
Worksheets(WS).Activate
じゃなくて
WS.Activate
って書けば良い
268 :
267:2011/12/17(土) 09:54:36.29
安価ミスった
「265のやり方」じゃなくて「266のやり方」でした
269 :
265:2011/12/17(土) 09:55:52.47
なるほど!
ありがとうございます
constって使う必要あるの?
変数に値持たせてそれ変えなければいいだけじゃないの
>>271 プロシジャ毎にPrivate変数に一々代入するのって面倒じゃない?
Constの場合は確実に固定値だと判断が出来る。
普通の変数だと、その点が曖昧にならざるを得ないから、
後でソースを見返す時に面倒。
274 :
デフォルトの名無しさん:2011/12/17(土) 19:14:43.41
>>272 ところでモジュール間でも定数は自由に使えますかにゃ?
標準モジュールとフォームモジュールを使ってた場合、
どちらかのモジュールの一番上に書いておけば、他方のモジュールをその時点で未使用でも、その他方の上のほうに書いてある定数は使用可能?
275 :
274訂正:2011/12/17(土) 19:16:32.05
>>272 ところでモジュール間でも定数は自由に使えますかにゃ?
標準モジュールとフォームモジュールを使ってた場合、
どちらかのモジュールの一番上に書いておけば、他方のモジュールから実行が始まったとき、
書いてるほうのモジュールがその時点で未使用でも、その他方のモジュールから別のモジュールの上のほうに書いてある定数は使用可能?
ちょっと試せばすぐにわかるのに
モジュールはマクロ開始時点で全て初期化される。
278 :
デフォルトの名無しさん:2011/12/17(土) 19:39:29.49
>>276 あなたのVBA力と回答力を試しているんですが
VBA力とか言ってる時点でみんなより自分が格下なのに気付けよ
280 :
デフォルトの名無しさん:2011/12/17(土) 20:11:42.31
わからないなら無理にレスしてくれなくていいよ?
281 :
デフォルトの名無しさん:2011/12/17(土) 21:08:41.34
VBAで、数値から文字列、文字列から数値への変換の方法はいろいろあるみたいだけど
どの方法が一番標準ですか?
自分は前者はCStr、後者はVal、でそれぞれやってますが、これって変?
基本は自動型変換で良くね?
後、Val関数は何気に色々と面白い仕様だから注意した方が良いよ。
283 :
デフォルトの名無しさん:2011/12/17(土) 22:04:12.83
>>282 自動型変換とは何ですか?
面白い仕様とはどういうことですか?
あにゃたの発言のほうが意味がいろいろ取れて神経を使います。
別に標準とかないでしょ
いろいろな方法があるのにはそれなりに理由があるんだから
その時によって最適な方法を選べば良い
285 :
デフォルトの名無しさん:2011/12/17(土) 23:21:52.65
valは使わないな
文字列にする時はこんな自作ライブラリつかってる
Function dfVntToStr(ByVal StringVal As Variant) As String
On Error Resume Next
dfVntToStr = \\\"\\\" \\\'初期化
If Not IsNull(StringVal) Then
dfVntToStr = StringVal & \\\"\\\" \\\'文字列へ変換
End If
On Error GoTo 0 \\\'エラークリア
End Function
同じようにintに変換とかlongに変換とかのライブラリも作ってる
ネタ元はこれ
VisualBasic6エラーコーディング
ttp://www.amazon.co.jp/dp/4894712237/
VBAで自作ライブラリ作ってる人とか初めて見た・・・すごいな
287 :
デフォルトの名無しさん:2011/12/18(日) 01:00:33.26
>>285 なぜ標準的な機能がすでに存在してるのに
わざわざ自作ライブラリまで作るんですか?
つこてる豆が違うんですか?
その\\\は何なの
289 :
デフォルトの名無しさん:2011/12/18(日) 01:18:30.50
つこてる豆です
290 :
デフォルトの名無しさん:2011/12/18(日) 01:50:27.77
\\\\\\はたぶんp2が原因、だと思う
理由は変換でエラーが起きても統一した処理が書けるようにするため
ネタ本はVB6のエラー処理を解説してる本で、安全なプログラミングの
フレームワークのサンプルもある(285はその1つ)
個人的にツッコミを入れてたところへの解答がちゃんと書いてある本だったので、ExcelVBAでも使わせてもらってる
この本のライブラリと、「Excelプロフェッショナルエンジニアテクニック 」で
紹介されているアドイン:VBADeveloper.xla は自分が使うExcelVBA環境では
使いまわすようにしてる
1時間かけてコーディングたものをデバッグしたら、最後のコードが.saved=true:.closeで、次開いたらコードが全て消えていました!
途中保存はしていませんでした、どうすればいいですか!!!
デスクトップクリックして Alt + F4 押して エンター押せば解決だ!
Winキーを押してすばやくUを2回押すとバックアップ取得できるよ
>>291 おまえはこの1時間で金では買えない貴重な体験をした
明日からがんばれ
296 :
デフォルトの名無しさん:2011/12/18(日) 05:06:32.28
Sub kk()
Dim a As Long, b As Long, c As Long, d As Long
a = 10
Do While Cells(a, 2) <> " "
If Cells(a, 1) >= 9 And Cells(a - 1) <= 8 And Cells(a, 2) = Cells(a - 1, 2) Then
If Cells(a, "N") = 1 Then
Cells(a, "Y").Copy = Cells(a, "AA")
Cells(a, "Z").Copy = Cells(a, "AB")
End If
If Cells(a, "N") = 1 Or 2 Or 3 Then
Cells(a, "Z").Copy = Cells(a, "AB")
End If
Else: Cells(a, "AF") = "TRUE"
End If
a = a + 1
Loop
End Sub
297 :
296:2011/12/18(日) 05:07:21.63
>>296ですが、エラー1004が出てしまいます・・・
アドバイスいただけないでしょうか?
>>296 ここ、
If Cells(a, 1) >= 9 And Cells(a - 1) <= 8 And Cells(a, 2) = Cells(a - 1, 2) Then
↓ こうじゃないの?
If Cells(a, 1) >= 9 And Cells(a - 1, 1) <= 8 And Cells(a, 2) = Cells(a - 1, 2) Then
>>296 これは、
If Cells(a, "N") = 1 Or 2 Or 3 Then
↓ たぶん、こう
If Cells(a, "N") = 1 Or Cells(a, "N") = 2 Or Cells(a, "N") = 3 Then
>>296 Copyの使い方がおかしい
Cells(a, "Y").Copy = Cells(a, "AA")
↓修正
Cells(a, "Y").Copy Cells(a, "AA")
または
Cells(a, "AA") = Cells(a, "Y")
>>285 数値から文字列への変換って意味ではそれ単なる暗黙の型変換だね
302 :
デフォルトの名無しさん:2011/12/18(日) 11:21:49.50
これはなぜエラーが出るの?
Sub Test()
ActiveSheet.ActiveCell = 1
End Sub
ActiveCellはActiveSheetのプロパティではないから
304 :
302:2011/12/18(日) 12:22:44.96
>>303 でもActiveCellはsheet一般のプロパティじゃないの?
そしてActiveSheetはsheet一般に属するんじゃないの?
以上から、ActiveCellはActiveSheetのプロパティになるんですけど。
305 :
デフォルトの名無しさん:2011/12/18(日) 12:36:07.79
オブジェクトブラウザで確認しろ、ってことだな。
もしくは、一旦Sheet型に代入してからアクセスするとか。
変数を初期化する時に数値型なら0を入れるのが普通ですよね(まぁ特定のセルの値をそれに使うこともあるでしょうけど)
日付型の時って初期化はどうするんですか?
Dim hi_from As Date
で
hi_from = ""
としたら怒られちゃった^^;
308 :
296:2011/12/18(日) 14:27:36.53
>>307 >としたら怒られちゃった^^;
何のために初期化したいのか知らんけど、0 でも入れときゃいいんじゃね。
311 :
デフォルトの名無しさん:2011/12/18(日) 14:52:54.06
>>307 この野郎!
おまえ何をやっとるんだ(怒)!!
みたいに怒られたのか?
それって誰によ?
>>304 >でもActiveCellはsheet一般のプロパティじゃないの?
違う
ApplicationまたはWindowのプロパティ
>そしてActiveSheetはsheet一般に属するんじゃないの?
違う
Application、WindowまたはWorkbookのプロパティ
>以上から、ActiveCellはActiveSheetのプロパティになるんですけど。
ならないからエラー出るんだよ
>>307 っていうかDimした時点で初期化されてるよ
314 :
312:2011/12/18(日) 15:04:30.79
あーすまん
ActiveSheetが返すのはWorksheetオブジェクトね
>>304 Excelのオブジェクトは階層構造になっている
Application - WorkBook(Application毎に複数) - WorkSheet(WorkBook毎に複数)
ActiveCell は最上位の Application オブジェクトのプロパティなので、Sheet オブジェクトから直接参照することはできない
やるならたぶん
ActiveSheet.Application.ActiveCell
となるはず
317 :
デフォルトの名無しさん:2011/12/18(日) 16:00:58.06
じゃあActivecellの前には普通の人が使うような単語は書いちゃいけないのか?
XXXXX.Activecell みたいな形はない、と覚えておいてOK?
そしてこれらの法則は、Activebookや、Activesheetにも当てはまる?
つまり、Workbooks(2).Activesheet みたいな形はない?
>XXXXX.Activecell みたいな形はない、と覚えておいてOK?
ダメ
Application.ActiveCell
ActiveWindow.ActiveCell
>>312で「ApplicationまたはWindowのプロパティ」って書いたよね?
>>315とか
>>316にも書いてあるよね?
>そしてこれらの法則は、Activebookや、Activesheetにも当てはまる?
法則とかの話じゃないし
>つまり、Workbooks(2).Activesheet みたいな形はない?
ある
>>312で「Application、WindowまたはWorkbookのプロパティ」って書いたよね?
>>317 > XXXXX.Activecell みたいな形はない、と覚えておいてOK?
Type YYYYY
ActiveCell As Integer
End Type
Dim XXXXX As YYYYY
みたいなケースは (やるかどうかは別にして) ありえるから、ダメ。
>>317 >じゃあActivecellの前には普通の人が使うような単語は書いちゃいけないのか?
ActiveCellプロパティを持つオブジェクトを書く
書かなければApplicationとみなされる
あと、とりあえず
>>319は無視していい
321 :
デフォルトの名無しさん:2011/12/18(日) 16:51:48.87
Application
ActiveWindow
Application.ActiveWindow
この違いはなんなのでしょう?
誰か違いのわかる男(あるいは女)はいますか?
字数が異なります
323 :
321:2011/12/18(日) 17:50:13.70
ふざけるな
>>321 前提として
ApplicationはExcel自体
WindowはExcel内の子ウィンドウで、Book などに対応して作成される
Excelを起動すると、Applicationオブジェクトが作成される
Bookを作成すると、Applicationオブジェクト配下に、WorkbookオブジェクトとWindowオブジェクトが作成される
もう一つBookを作成すると、Applicationオブジェクト配下に、別のWorkbookオブジェクトと別のWindowオブジェクトが作成される
workbookは文書内容そのものを保持し、Windowはドキュメント内容以外の状態や表示設定(Book単位のActiveCellや画面の拡縮率など)を保持する
ActiveなBook(ActiveWorkbook)を切り替えると、ApplicationオブジェクトのActiveWindow、ActiveCell、ActiveChartなども一式自動的に切り替わる
で、
Application は、ActiveSheet.Applicationの省略形で、Excel全体を表すApplicationオブジェクトを指す
Application.ActiveWindowは、Excel内のアクティブなWindowオブジェクトを指す(workbookを切り替えるとWindowオブジェクトも切り替わる)
ActiveWindow は、Application.ActiveWindow の省略形で、Application.ActiveWindow と同じ
おそらく内部では、
Application.ActiveCell を参照したとき、Application.ActiveWindow.ActiveCell を返すような実装になってるはずなので、
ActiveCell
Application.ActiveCell
ActiveWindow.ActiveCell
Application.ActiveWindow.ActiveCell
の4つは常に同一になるはず
2つのオブジェクトが同一かどうか調べる方法ってあるのかな?
たとえば
Set ObjA = ActiveCell
Set ObjB = Application.ActiveWindow.ActiveCell
If ObjA = ObjB Then …
みたいな感じで
326 :
321:2011/12/18(日) 18:42:08.92
>>324 ご丁寧なご説明ありがとうございます。
かなりわかってきたような気がします。
>>322のアホとは違いますね。
つこてる豆が違います。
こういう基本的とも思えることまで解説した本などがあればいいのにね。
327 :
デフォルトの名無しさん:2011/12/18(日) 19:02:29.27
>>325 実際に試したら
書いているとおりのコードで調べることができましたよ。
Sub Test()
Dim objA As Object
Dim objB As Object
Set objA = ActiveCell
Set objB = Application.ActiveWindow.ActiveCell
If objA = objB Then
Stop '<=ここで止まった。
End If
End Sub
"つこてる豆が違います" の検索結果が見つかりませんでした。
つ こ てる 魔 眼 が 違います の検索結果を表示しています。
Bingワロタw
なぞなぞ
Debug.Print ActiveCell Is ActiveCell
の結果はFalse。さて理由は?
>>327 ダウト。これ試してみ
Sub Test()
Dim objA As Object, objB As Object
Set objA = Range("A1")
Set objB = Range("B2")
If objA = objB Then Debug.Print "同じ"
End Sub
331 :
327:2011/12/18(日) 21:22:50.30
>>330 If objA = objB Then
でレンジを入れたオブジェクト変数を比較すると、
objAとobjBのValueで比較するみたいですね。
上記コードに
else
Debug.Print "違う"
を付け加えて、セルに違う値入れて実行したら"違う"になりました。
あとは例えば比較対象をobjA.AddressとobjB.Addressにすると"違う"と判別されましたし、
A1とB2で書式設定を違うものにしたら
objA.NumberformatとobjB.Numberformatの比較も"違う"という結果になります。
>>329 ひょっとして、
ActiveCellが返すRangeオブジェクトは現在の選択座標をもとに都度新規に作成されるとかそういう話?
それを言うなら
Range("A1") Is Range("A1")
もFalseだね
>>329 これ前から謎だったんたよな
正解を教えてくれると助かる
で自分なりに出した答えは
セルの参照先は一緒だけどRangeオブジェクト(インスタンス?)が違うから
下と同じ原理かなと思う
Set objA = Range("A1")
Set objB = Range("A1")
Debug.Print objA Is objB
Set objA = Range("A1")
Set objB = objA
Debug.Print objA Is objB
前者はFalse だけと 後者はTrue
ヒント
Set objA = Worksheets(1)
Set objB = Worksheets(1)
Debug.Print objA Is objB
これはTRUE
うわあ・・・
別のプロシージャに配列渡してその値変えたら元も変わる?
ちょっと試せばすぐにわかるのに
339 :
334:2011/12/18(日) 23:27:21.13
>>335 これは
シートオフジェクトは最初からあるからだったりするのか?
VBEでみるとシートオフジェクトが見えるし
340 :
334:2011/12/18(日) 23:30:23.28
シートオフジェクト ってなんだよ(笑)
シートオブジェクト だった
VBAからVBEのユーザーフォームデザイン編集画面でツールボックスを右クリックして「その他のコントロール」を選択した時にでるダイアログの
「利用可能なコントロール」を制御する事は可能ですか?
制御は出来なくても利用可能か調べたりチェックされているかどうか調べる方法でも良いです
>>338 あなたのVBA力と回答力を試しているんですが
343 :
デフォルトの名無しさん:2011/12/19(月) 02:24:24.73
VBAでIEのHTML表示領域の幅と高さを調べたいのですが
どうすればよいでしょうか?
HTMLDocument の HeightやWidthですと
IEのウインドウ幅と高さの取得になってしまいます。
tree viewを使用し、配列gets(n,m)のツリーを作成しようと思ったのですが
n = 0
m = 0
Do While gets(n, m) <> ""
thttp = gets(n, 0) '親カテゴリ
TreeView1.Nodes.Add , , thttp, thttp, "oya"
m = 1
Do While gets(n, m) <> ""
sthttp = Split(gets(n, m), "/") '子カテゴリFormat = KEY/TITLE
TreeView1.Nodes.Add thttp, tvwChild, sthttp(0), sthttp(1), "child"
m = m + 1
Loop
n = n + 1
m = 0
Loop
gets(n,m)はm=0が親カテゴリ m>0が子カテゴリで
親カテゴリ(n,0)は 単語 が格納されて、子カテゴリ(n,m)m>0には KEY/単語 が格納されています
空白の要素を余分に持っているため <> "" で飛ばしています
親カテゴリ(n,0)の要素が空白になった時終了するようにしているのですが
実行すると実行エラー35602 "Key is not unique in collection"と出てツリーが作成できません
同じkeyが指定されてるんじゃね
keyは親子の関係なく 一意でないと いけなかったと思ったけどそうなってる?
>>345-346 ご指摘通りでした
配列の内容を見直しましたところ同じKEYの物がありました
ありがとうございます
>>343 scrollHeight, scrollWidth
>>343 表示領域とは?
>>348 以外に
ClientWidth ClientHeight
もあるが
>>334 Isってメモリのアドレスを比較してるんだよ。
Set objA = Range("A1")
Set objB = Range("A1")
Debug.Print objA Is objB
って
Set objA = Range("A1")
Set objB = Range("A1")
Debug.Print ObjPtr(objA) = ObjPtr(objB)
と同じ。
どういう時にインスタンスが複製されるのかよくわからんちん
public変数使わない方が良い理由が分からん
>>339-340 >シートオフジェクトは最初からあるからだったりするのか?
多分そう。
Cell オブジェクトなんてものがあれば、Cells("A1") Is Cells("A1") が
True になるかもしれないけど、VBA には、Cell オブジェクトはなくて、
(*仮に単一のセルだとしても) 常にRange オブジェクトになってしまう。
Range オブジェクトは、当然範囲の情報を持つ必要があるので、
Obj = ActiveCell とやる度に、各々別の Range オブジェクトが「生成」される。
と言うのが、
>>329 の答えだと思う。
>>353 >public変数使わない方が良い理由が分からん
必要ない奴に見せたがることはないだろ。
ユーザーフォーム間で変数やり取りとかするときにどうしてもpublic使いたくなる
それでもやっぱりpublicには抵抗がある
パブリックプロパティならいいんじゃない
>>353 プログラムの規模が大きくなった時にバグの元になりやすいっていう経験則だよ
今はまだピンと来なくても、先人の言うことは聞いておいた方がいい
逆にPublic変数を使った方がいいっていうシチュエーションはあるのかな
Public変数
メリット:小規模プログラムで受け渡しI/Fを考えなくて良い
デメリット:クラス間の結合度が問題になる(再利用しにくくなる)
位?
ところでVBAって
ユーザー定義型変数の参照渡しをプロシジャ引数で渡せたっけ?
もちろんPublicで型宣言しておいて。
なんだか言語仕様上ダメだった記憶がある。
変数クラスを定義してそのクラスのインスタンスをローカルで定義して
参照渡ししないとダメだった記憶もある。
なので、ユーザーフォームクラスとの受け渡しはPublic使った様な記憶
がある。
361 :
デフォルトの名無しさん:2011/12/20(火) 11:09:24.62
矢切の渡しってたまに聞くけどどういう意味なの?
調べてもそれっぽいのでてこないけど
ListViewのSortOrderって昇順と降順しかない?
1,5,10,50,100
とあるとしても
1
10
100
5
50
となってしまいます
これを
1
5
10
50
100
のようにできないですか?
Functionプロシージャ内でSubプロシージャって呼び出せますか?
自分でやったらダメでしたが、何か方法があれば教えてください。
普通に呼べるが
>>366 具体的には、シートで「=Function名(引数値)」って書いたんですが
Function中のSubが実行されないのが疑問になっています。普通に呼べますか?
呼べる。MsgBox入れてみればわかる。
あ、MsgBoxは動きました。有難う御座います。
自分がしたいのは、ワークシートのA1をクリアする様なSubを
Function中から呼び出す様にして、そのワークシートで
=Function名(引数)
とA1以外のセルで書いて、シートのA1をクリアすることです。
求むESPer
>>371 おお、有難う御座います!そうか、できないのかぁ。セルの総和とかで
クリアするかどうかをFunctionで判定して消去、ってやりたかったなぁ。
関数でシート操作をしたいんだろうけど
更新処理をフックにするくらいだろうなあ
>>360 >ユーザー定義型変数の参照渡しをプロシジャ引数で渡せたっけ?
Public Type hogeType
a As Integer
b As Integer
End Type
があるとして
Sub test()
Dim hoge As hogeType
hoge.a = 1
hoge.b = 2
MsgBox hogesum(hoge)
MsgBox hoge.a
End Sub
Function hogesum(ByRef hage As hogeType) As Integer
hogesum = hage.a + hage.b
hage.a = 0
hage.b = 0
End Function
でtestを走らせると、3と0と表示される
問題なく渡せるようだ
ちなみに引数をByValにすると
ユーザー定義型をByValで渡すことはできません
ってコンパイルエラーになった
できないのは値渡しと矢切りの渡しだな
375 :
360:2011/12/21(水) 07:31:46.89
>>374 申し訳ないですが、言葉がごっそり抜けてました。
-----------------------------------------------------
(誤)
ところでVBAって
ユーザー定義型変数の参照渡しをプロシジャ引数で渡せたっけ?
(正)
ところでVBAって
標準モジュールでGlobal定義されたユーザー定義型変数の参照渡しを
標準モジュールからクラスモジュールのプロシジャに
プロシジャ引数で渡せたっけ?
-----------------------------------------------------
同一クラス内や標準モジュール内で渡せるのは知ってます(実際にできているので)。
標準モジュールからクラスモジュールのプロシジャに渡そうかなと思って書いたら、
VBAから怒られた。
解決方法は、
クラスモジュールにユーザー定義型変数だけPublic定義したクラスを定義して
そのクラスのインスタンスを標準モジュールに定義してからそのObjectを参照渡しする。
だけど、面倒なので、サクッと渡せないかなぁ、とおもっだだけです。
377 :
360:2011/12/21(水) 07:34:45.04
あと、
矢切りの渡しって
「global宣言されたユーザー定義型変数を標準モジュールからクラスモジュールのプロシジャに参照渡しする」
の意味でしょうか?
隠語を良くしらないので(不勉強済みませんが)。
378 :
360:2011/12/21(水) 07:37:20.28
>>376 Friendも試したけどダメだった様な記憶があります。
VBだと可能らしい(VBは使ったことないですが)。
というので混乱した覚えがあります。
>>377 昔、矢切の渡しってヒット曲があっただけのおっさんジョークだからあまり真面目に受け取るなよ… w
380 :
360:2011/12/21(水) 08:23:29.73
りょうかい。
まぁ、ワシも40過ぎのおっさんですけどねw
Windows97 Excel2003で、アドインについて。
下記のコードを一度実行後にxlaファイルの配置場所が変わった場合、そのまま再度下記を実行すると、変更後のパスでAddしても、実際には変更前のパスのアドインが追加されます。(ファイルがないため関数実行部分でエラー)
Set myAddIn = AddIns.Add(パス.あどいん.xla)
myAddIn.Installed = true
アドイン関数実行
myAddIn.Installed = false
どうもエクセル→ツール→アドイン から、該当するアドインを手動で削除しないとパスの変更に対応できないのですが、どうにか自動で対応できないでしょうか。
AddしたxlaファイルをKillしてもダメでした。
ケータイからなので見にくければすみません。よろしくお願いします。
382 :
デフォルトの名無しさん:2011/12/21(水) 18:47:10.91
質問あげ
そのOSパチモンだよ
384 :
381:2011/12/21(水) 21:14:08.81
うわどういう間違いしてんだorz
OSはXPです……
385 :
381:2011/12/21(水) 21:15:50.46
自ら晒しageしてしまった…
アドンズからリムーブしてみては?
>>375 クラスモジュール(Class1)
Function hogesum(ByRef hage As hogeType) As Integer
hogesum = hage.a + hage.b
hage.a = 0
hage.b = 0
End Function
標準モジュール
Public Type hogeType
a As Integer
b As Integer
End Type
Sub test()
Dim hoge As hogeType
Dim c As New Class1
hoge.a = 1
hoge.b = 2
MsgBox c.hogesum(hoge)
MsgBox hoge.a
End Sub
同じように3と0の表示
ためしたのは2007だから、それ以前のバージョンではどうかしらんが、問題なさそうだ
具体的にどういうエラーが出てたのか気になる
388 :
360:2011/12/21(水) 23:13:55.10
どうもです。
私は2003で駄目だったんですが、
VBA6.Xという意味では同じですかね?
ただ、やったのが2年位前だったんで?です。
ユーザー定義型のサイズが数10KBクラスなので
その辺が怪しいのかも?
ありがとうございました。
389 :
360:2011/12/21(水) 23:21:38.00
あ・・・思い出した
String型がメンバに含まれてました。
サイズを指定してないので動的変数ということになるので
その辺も影響しているかもです。
それと、ユーザー定義型のメンバに他のユーザー定義型を含んでます。
エラーメッセージは・・・・忘れてしまいましたが、
何となく理由が分かった様な気がします。
ありがとうございました。
390 :
381:2011/12/22(木) 09:50:46.01
>>386 いろいろやってみましたが、リムーブの仕方がわかりません…
諦めて手動でやってもらう手順にするしかないかな…
VBAと相性の良い言語って何がある?
相性ってどういうこと?
どの言語でも組み合わせて使うという発想はあんまりないと思う
目的で使い分けるのが普通じゃないのかな
Excelとって意味なら.NETかな
VBSとか
ActivePerl+WIN32::OLE
webとデータのやり取りをするって意味です
もしかして探してるのはアドインとかライブラリ?
VBAが言語である事を知らないのでは
入出力にExcelのワークシートを使って、演算処理は高速なCでやりたいとか
>>399 > 演算処理は高速なCでやりたいとか
そんなこと思いつく奴の質問とは思えないが…
3ステップで学ぶExcelVBA入門終わったんだが、次にオススメの課題有りの参考書オススメ無いですか?
横から失礼します。
>>399 >入出力にExcelのワークシートを使って、演算処理は高速なCでやりたいとか
ちなみにこれの実現方法としては、例えばどんなのがあるんですか?
404 :
デフォルトの名無しさん:2011/12/23(金) 10:03:27.62
FromにTimerを貼り付けるには?
>>404 >Fromに
それは難しそうだ、その From とやらを作っている会社に問い合わせるべき。
Excel.Application.Visible = False
ブック作成
★ループ★
シート追加
ペースト
★ループ★
マクロ動作中に他の作業(ブラウザ使う)とかができない・・・(正確には画面がチカチカする)
完全にバックグラウンドで動作させるのは無理なのかな?
408 :
404:2011/12/23(金) 13:36:54.66
>>405 アホ
>>406 ありがとうございます!
やっぱり標準機能ではないのですね
でも工夫すればできるということなんですね
タイマーコントロールってVBAで出来たんだっけ
.netは標準装備だったけど
APIのSetTimerとか使った自前実装っぽい。
なんでググらないんだろうな
タイマーの実現方法調べるのに3時間か…
412 :
デフォルトの名無しさん:2011/12/23(金) 21:54:29.88
Formについてです。
はじめのときの
Load、Initialize、Activateの使いわけを教えてくださいませ。
あと、おわるときの
Unload、Terminateの使い分けを教えてくださいませ。
ちなみにLoad←→Unload、Initialize←→Terminateと対応ペアがあるようだけど、Activateに対するペアもう一方はなぜないのですか?
413 :
デフォルトの名無しさん:2011/12/23(金) 22:23:42.54
>>387 こういう似非オブジェクト指向が面倒だからVBAではPublicばっか使ってるわ
vba程度で大規模なもんつくらねーし
415 :
413:2011/12/23(金) 22:35:43.53
>>413はちょっと書き方に配慮が足りなかった。
(メソッドとイベントの対応が分かりにくい書き方になってた)
LoadするとInitializeイベントが発生して、
Showでイベントが発生する。
HideするとDeactivateイベントが発生して、
UnloadでTerminateイベントが発生する。
LoadしないでShowすると自動的にLoadされてShowするし、
HideしないでUnloadしても自動的にHideされてUnloadする。
416 :
413:2011/12/23(金) 22:37:50.21
度々スマン
なぜか抜けてた
誤:Showでイベントが発生する。
正:ShowでActivateイベントが発生する。
418 :
デフォルトの名無しさん:2011/12/24(土) 04:42:11.86
特定のセルにコントロールを移したときに
そのセルに文字を入力したいのですがどうすればいいですか?
>>418 SelectionChangeイベント
420 :
418:2011/12/24(土) 05:01:13.86
>>412 Loadは命令。Initialize、Activateはその結果実行されるプロシージャ(イベント)
Initializeはそのフォーム(のインスタンス)で1回しか起きないが、Activateは何回でも起きる(可能性がある)
Unloadも命令。Terminateはその結果起きるイベント
>>415 どうせならもうちょっと正確に書け
LoadとUnloadはメソッドじゃない。ステートメントだ
オブジェクト(フォーム)に定義されている命令ではなく、VBA言語に定義されている命令
LoadでInitializeイベントが起きるのも、ShowでActivateイベントが起きるのも結果に過ぎないぞ
ShowしなくてもActivateイベントは(そういう状況になれば)起こるし、HideしなくてもDeactivateイベントも起こる
こっから先は気にしなくてもいいかもしれんが、実験すると
Loadする前にインスタンス生成した段階でInitializeイベントは起こる
まあこれは解る
Unloadするとその時点でTerminateイベントが起こる
どうもインスタンスへの参照が無効になるっぽい。これはちょっと嫌な仕様だ
Unloadしないでインスタンスへの参照を削除した場合、Terminateイベントが起こってないかもしれん
デストラクタはあてにするなって事か
とりあえずLoadとUnloadメソッドは忘れて、Terminateイベントは無いものとして扱うのがいいんじゃないかな
ついでに実験中に気付いたこと
UserForm1.Show vbModeless
MsgBox "表示しました"
このコード走らすと初回表示のActivateイベントが発生しなくなる
これってバグじゃねえかと
422 :
デフォルトの名無しさん:2011/12/24(土) 08:52:42.72
>>421 LoadはShowがあるから使わなくて済むけど、
Unloadはあったほうが良いんじゃないの?
423 :
ラーメン:2011/12/24(土) 09:56:51.82
424 :
デフォルトの名無しさん:2011/12/24(土) 09:59:18.68
Unloadを使わないとどんな不幸が起きますか?
425 :
デフォルトの名無しさん:2011/12/24(土) 10:28:49.72
>>424 不幸ってわけじゃないけど要らないオブジェクトをメモリに残しとくのってなんか嫌だ
426 :
デフォルトの名無しさん:2011/12/24(土) 10:31:35.95
>>425 それはExcelを閉じてもメモリに残りますか?
427 :
デフォルトの名無しさん:2011/12/24(土) 10:38:43.47
excel閉じたら残らんけど閉じるまで残ってるのが嫌なの
>>422 LoadはShowするまえに初期化とかするために必要なんで、Showで代用はできんぞ
Load,Unloadはもともと既定のインスタンスを生成する命令で、インスタンスの概念がなかった時代の名残だからな
>>427 本来ならすべての参照が切れたら、適切なタイミングで消されるはずなんだが
このへんはカーベージコレクタの動作とか絡んでるからなぁ
既定のインスタンス使うならLoadは代用がないだろうし、Unloadもすべきかもしれん
既定のインスタンス使わないならLoadは不要だろう
UnloadはNothing代入とセットで使うなら良いんじゃね
ガベージコレクションは無いよ
あるメンバーサイトにログインして、目的のデータ取得してセルに表示するやり方分かる人いる?
お前はVBAと相性のいい言語でも探してろ
ここでいいのか知らないが
VBEのコード記入する画面の文字の色とか背景色って変えれる?
調べれば3秒で分かるだろ
3秒では無理だった
どうやったら3秒で調べられるん?
どうやればいいと思う?
答えがわかってて、それを表示するだけなら3秒
調べるのは無理
色の変更はオプション→エディタの設定
>>363 これ分かる方いませんか?
ListViewのノードが数でソートすると数の大小で並び替えができるか、です
>>438 自分はわからん
別列作って文字列などで桁そろえてソートすれば解決するような気もする。
1→0001
50→0050
みたいにしてあとで0取ればいいんじゃね?
環境 WindowsXP SP3、excel2003です。
処理が終わったブックを保存する時に、マクロは含めずに
シートのみ保存するマクロってどうすればいいでしょうか?
別名保存で出来るかと思ったのですが、マクロファイルを外す
ような項目が見あたらなくて、わからなくなってしまいました。
>>441 VBAマクロ入りのをアドインでセーブ。
そのアドインをExcel に登録すればマクロ無しで行けることになる。
バージョン管理ツールで管理しやすくなるし、pj内で共用しやすくなる
。
>>441 単純にシートを新しいブックに移動またはコピーしてそれを保存するってのはどうかな?
>>442-444 今回は444さんの方法で出来ましたが、
アドインは思いつきませんでした。
ありがとうございます。
アドインがいいと思うけどなぁ
シートコピーは1セル256文字?制限あるし。
数文字程度の欠けだと誰も気付かないまま被害が拡大して…
入力されているセル範囲の最終行が知りたくて
Dim R As Range
R=ActiveSheet.UsedRange
って、やってRから 最終業を取り出そうとしたんだけど、「オブジェクト云々」とエラーが出ます。
なんか間違ってる?
うん間違ってる
Set R=ActiveSheet.UsedRange
何が間違ってるってその姿勢だよね。
エラーメッセージを読む気すらないっていう。
ユーザーフォームのリストビューで
カラムをクリックしたときにクリックしたカラムの2行目のテキストを取得するにはどうしたら良いでしょうか
SETの使い分けが分からん
代入する時は基本的に付けるもの?
objectの参照のときにだけつける
ヘルプ嫁
ずぐだんずんぶんずんゲームやるときにつける
456 :
147:2011/12/28(水) 08:26:45.66
俺も分からん。
For Each文や、関数での授受時にSetが要るのか要らんのかさぱーり理解できん。
For Each Set obj in collection とか、
Set objResult = funcMine(Set objArg) とか。
=も代入じゃん(比較もするけど)
区別する必要って何?
>>457 たとえばなんでも入れられるVariant型の変数aにa = AtiveCellとしたときaに参照を代入したのかActiveCell.Valueを代入したのか分からないから。
型によって区別する仕様にしてもよかったとは思うが。
459 :
デフォルトの名無しさん:2011/12/28(水) 15:45:58.78
本当に初歩的な質問をして申し訳ございません。
sheet1のcells(7,1)の部分から、cells(3,3)に入力した数字分だけ下に伸ばしたいのですが
自動的にやる方法ご存知でしょうか?
Sub Number()
Worksheets("sheet1").Activate
a = Worksheets("Sheet1").Cells(3, 3).Value
For n = 1 To a
Worksheets("sheet1").Cells(n + 5, 1).Value = n
Next
End Sub
上記のコードを書き込んだのですが、マクロ上で実行ボタンを押さないと
sheetに表示されません。
初歩的で大変すみません。よろしくお願いします。
何がしたいのかわからん
日本語の初歩からやり直せ
>>459 多分動いてるんじゃね?
マクロ実行押さないと何も動かない。
event で動かしたいならsheetモジュールの予約されたプロシジャに書けば?
463 :
デフォルトの名無しさん:2011/12/28(水) 18:01:44.22
459です。すみません。割愛しすぎました。
cells(3,3)の部分に、たとえば任意で4や5といった数字を入れて
エンターキーを押すと自然に作動してほしいということです。
実行ボタンを押さずにということです。ただ単にそこのセルに数字を打ち込んで
エンターを押すだけで作動という意味です。
失礼します。
>>463 Worksheet_Changeイベント
465 :
デフォルトの名無しさん:2011/12/28(水) 18:13:14.55
Private Sub Worksheet_Change()
Worksheets("sheet1").Activate
a = Worksheets("Sheet1").Cells(3, 3).Value
For n = 1 To a
Worksheets("sheet1").Cells(n + 5, 1).Value = n
Next
End Sub
にいれたのですができませんでした…
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Cells(3, 3)) Is Nothing Then Exit Sub
a = Cells(3, 3).Value
Application.EnableEvents = False
For n = 1 To a
Cells(n + 5, 1).Value = n
Next
Application.EnableEvents = True
End Sub
>>462 そもそも俺のエクセルのユーザフォームにはリストビューなんてないんだが
何をつかってるんだ
Microsoft list view control 6.0です
MsgBox りすとびゅー.SelectedItem.SubItems(2)
470 :
a:2011/12/28(水) 22:15:38.89
行と列が逆だったか?
Private Sub りすとびゅー_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
MsgBox りすとびゅー.ListItems(2).SubItems(ColumnHeader.Index - 1)
End Sub
UserFormをModelessで二つ以上開いてるときにエラーでたら強制終了するのは仕様?
474 :
デフォルトの名無しさん:2011/12/29(木) 10:45:54.58
あるセルに入力規則でドロップダウンリストの設定がしてあるのですが、
それをボタンを押せば、入力規則の設定を消すマクロを組みたいのですが、
clearではだあめなようで、どうすればいい?
トリミングするために CropTopなどに値を整数を入れるのですが
Debug.Print CropTop を実行すると 値が変更されてしまいます。
例
CropTop = 80
Debug.Print CropTop = 79.998
この現象を回避したいのですが
どうしたらよいでしょうか?
478 :
デフォルトの名無しさん:2011/12/29(木) 12:21:59.85
もそっとくわしくおねがいしまふ
.Delete
480 :
デフォルトの名無しさん:2011/12/29(木) 12:32:12.17
>>47 さんへでふ。 もそっとくわしくおねがいしまふ
481 :
デフォルトの名無しさん:2011/12/29(木) 12:32:46.14
483 :
デフォルトの名無しさん:2011/12/29(木) 14:30:45.27
>>466 本当にすみません。マクロを作るときは
マクロを選択して、名前を作って作成というボタンを押すんですよね?
それに466さんが張り付けてくれましたコードをそのまま入れましたら
できませんでした。。。
すみません。よろしくお願いします。
>>483 1.シートの見出しタブを右クリックしコードの表示を選択
2.466のコードをコピペ
3.とりあえず動作確認
4.イベントマクロで検索
5.コードの意味を理解
6.そのままじゃ使い勝手悪いと思うので修正
485 :
デフォルトの名無しさん:2011/12/29(木) 16:48:54.26
Private Sub CommandButton1_Click()
Dim a, b, c As Single
c = 0
For b = 1 To 5
For a = 1 To 5
c = c + 3
Sheet.Cells(a, b).Value = c
Next
Next
d = 1
For b = 1 To 5
For a = 1 To 5
d = d + 1
Sheet.Cells(a + 10, b + 10).Value = d
Next
Next
End Sub
非常に簡単なんですが、シートに書き込むことができません。どうすれば
書き込めますか?
フォームを作って、クリックボタンを一つ作っています。
>>485 僕も、シートに書き込むことができません。
どうすれば書き込めますか?
Private Sub CommandButton1_Click()
Dim a As Integer, b As Integer, c As Integer
c = 0
a = 1
b = 1
Sheets("Sheet1").Cell(a, b).Value = c
End Sub
487 :
デフォルトの名無しさん:2011/12/29(木) 18:43:31.84
ありがとうございます。
Private Sub CommandButton1_Click()
Dim a, b, c, d As Single
c = 0
d = 1
For b = 1 To 5
For a = 1 To 5
c = c + 3
Sheets("Sheet1").Cell(a, b).Value = c
d = d + 1
Sheets("Sheet1").Cell(a + 10, b + 10).Value = d
Next
Next
End Sub
上記のとおりにやりましたが、それでも、
Sheets("Sheet1").Cell(a, b).Value = c
の部分にエラーが出てしまいます;
>>483 標準モジュールに作ってない?
WorkSheetの関数として実装するんだよ?
>>487 いや、だから僕も書き込めないんだって…
× Sheet.Cells(a, b).Value = c
× Sheets("Sheet1").Cell(a, b).Value = c
でも↓はOKなのはなぜ?
Private Sub CommandButton1_Click()
Dim c As Integer
c = 0
Sheets("Sheet1").Cells(1, 1).Value = c
End Sub
エラーメッセージを読むことを覚えよう
Cell(a, b).Value = c
Cell じゃなくて
Cells だろ?
エラーメッセージなんて読んでも意味わかんねーし
つべこべ言わずに答えを教えろやカス
お前らそれくらいしか取り柄がないんだろ?
(でも本音です)
495 :
デフォルトの名無しさん:2011/12/29(木) 21:04:15.31
行列の掛け算同士って
for構文を使うのだと思いますがどうすればよいのでしょうか?
試行錯誤するのですが非常に複雑です。。。
>>492 > エラーメッセージなんて読んでも意味わかんねーし
エラー箇所でF1押してヘルプを読むのは役に立つと思うけどな
>>495 何をやりたいのかわからんが
Worksheetfunction.MMult
じゃ駄目なのか
Dim i As Long, j As Long
Dim V(1 To 2, 1 To 2), VV(1 To 2, 1 To 2)
Dim VVV
For i = 1 To 2
For j = 1 To 2
V(i, j) = i
VV(i, j) = j
Next j
Next i
VVV = WorksheetFunction.MMult(V, VV)
Debug.Print WorksheetFunction.Index(VVV, 1, 2)
>>495 4行4列くらいまでならべた書きの方が速い
500 :
デフォルトの名無しさん:2011/12/30(金) 06:45:51.03
>>499 4行4列ではなく、要素によって変わってくるため、
恐らく20行前後になってくると思います。。。
501 :
デフォルトの名無しさん:2011/12/30(金) 08:01:37.33
>>498 すみません。ありがとうございます。
worksheetfunctionではなく、他の方法でできますか?
Function MProd(X() As Double, Y() As Double) As Double()
'行列の積を計算する関数
'2009/07/10 山田宏
Dim m1 As Integer, n1 As Integer, n2 As Integer
Dim i As Integer, j As Integer, h As Integer
Dim tmp As Double, Z() As Double
m1 = UBound(X, 1): n1 = UBound(X, 2): n2 = UBound(Y, 2)
ReDim Z(1 To m1, 1 To n2)
For i = 1 To m1
For j = 1 To n2
tmp = 0
For h = 1 To n1
tmp = tmp + X(i, h) * Y(h, j)
Next h
Z(i, j) = tmp
Next j
Next i
MProd = Z
End Function
調べたらこれが出てきましたがまったくわかりません。。。
>>501 worksheetfunctionで結果がでるならそれでいいじゃない
なんか問題あるの?
もしも 万が一 宿題なら自分でやろうぜ
あと
>>2 ★5 な
行列の積の計算手順と、最低限度のプログラミングが理解できていれば、
悩むことではないと思うのだが。
>>501 わからないならエクセルにまかせりゃいいじゃん
↓ならわかるだろ
Function MProd2(X() , Y() )
Dim Z
Z = WorksheetFunction.MMult(X, Y)
MProd2 = Z
End Function
506 :
デフォルトの名無しさん:2011/12/30(金) 09:41:47.52
すべてのシートに同じ処理をするマクロで
For Eachの入れ子で組んだら上手くいきません
For Each sh In Worksheets
Columns("AA:AR").Select
For Each c In Selection
Case "1"
c.Interior.ColorIndex = 7
Select Case c.Value
End Select
Next c
Next sh
それはたいへんですね。ごしゅーしょーさまです。
508 :
デフォルトの名無しさん:2011/12/30(金) 09:49:00.68
>>504 そのリンク先が
>>503と何の関係が有るのかは分からないけど、
今の教育現場が酷いことになってるのは分かった。
>>506 構文でたらめじゃねーか
でも並べかえれば動きそうな気がするし
さて、おちょくられているのかな
510 :
デフォルトの名無しさん:2011/12/30(金) 10:03:24.56
>>504 単位を省略しなければどちらも正解
○ 6本/人 × 8人=48本
○ 8人 × 6本/人=48本
? 6本 × 8人=48?
? 8人 × 6本=48?
きっとその先生はCPU のbit数を意識して、演算結果が飽和しないように式を組む癖を叩き込みたいんだと思いますん。
ふつーCPUの演算では飽和しません
セル番地を指定するのにrangeとcellsが混在しているとみっともないでしょうか
ユーザーフォームにラベルとテキストボックスを配置しました。
フォントは同じでサイズも同じですが
高さがズレて表示されます。
見た目の高さを揃えるにはどうしたらよいですか。
よろしくお願い申し上げます。
>>514 そもそもcellsはrangeを返すプロパティ
これを踏まえてどう思うか
517 :
デフォルトの名無しさん:2011/12/30(金) 11:39:08.66
>>516 偉大な
>>514様は、例えば左上のセルを Cells(1,1)と書くのとRange("A1")と書くことの違いが分かっておられないと思う。
その説明じゃなんのことは分かりやすく伝えてないから、説明になってないと思うぞ。
もう少し分かりやすく説明して差し上げたら?
>>509 この構文のどのへんがだめなんでしょうか
よろしかったら教えてください
>>518 条件付き書式でいいんと思うんだがCase "1"とSelect Case c.Valueが逆だろ?
Case "1"よりはCase 1だと思うが
それにたった一つの分岐ならSelect Case使うまでもねーな。
Ifで充分。
521 :
デフォルトの名無しさん:2011/12/30(金) 11:58:18.99
>>519 逆と言われて、こうしたりして
Select Case c.Value
c.Interior.ColorIndex = 7
Case "1"
End Select
そうだな。
まぁ色々と並べ替えてやってみんしゃい。
それにしてもAA:ARのすべてのセルを調べるのもなんだかねぇ。
せめてUsdRangeとの共有セルにした方がいいと思うね。
もしかして、Excel2007以降だと104万行全部調べる羽目になるの?
104万8576行*18列*シート数だね
おわりゃしねえ
3シートでやってみた。たしかにそうだ (^-^*)
急いでます。
=PRODUCT(A1:B1)
=PRODUCT(A2:B2)
と同様に一気に計算する方法ってどうやるんですか?
528 :
デフォルトの名無しさん:2011/12/30(金) 22:26:13.26
Excelだと、スロットゲームとか作れそうだけど、
どこかにサンプルないかな?
お勉強にしたい。
テーブルからの検索でなるべく早い方法ってなんでしょうか。データ量によりいろいろ方法あると思いますが。
特に列二つか三つに一致するデータを検索する使い方が多いのでvlookupは普段使ってません。
とりあえず上から順に検索
for i = 2 to .cells(rows.count,1).end(xlup).row
if .cells(i,1).value = ID then
if .cells(i,2).value = Name then
処理
exit for
end if
end if
next
上のやり方が遅すぎるので配列に代入してから。上のやり方より遥かに早くなったので
現状この方法を多用。
Dim Rng as variant
rng = .UsedRange
for i = 2 to Ubound(Rng)
if Rng(i,1) = ID then
if Rng(i,2) = Name then
処理
exit for
end if
end if
next
もっと早い方法あれば何かキーワードだけでもヒントお願いします。
上の方法だと5000〜1万件になるとちょっと実用できなさそうなので。
findやVlookupは知ってますが2列で一致するような使い方が出来なくて。
Accessとか使った方がいいんじゃない
検索した上で何がしたいのかによる
>>530 検索キーの構造が単純なら、キーを結合した上でVLOOKUPするとか。
この場合だと、IDとNameをそれらで絶対に使われない文字を挟んで繋いでやれば
単一キーとして利用できる。
WinXP Excel2000で作っていたときは問題なく動作をしていたのですが
Win7 Excel2010で実行すると
エラー番号1004'Range'メソッドは失敗しました'_Global'オブジェクト
とでました
問題の箇所は
UserForm2.Show vbModeless
ここです
コード自体は間違っていないと思うのですが環境の変化によって何が変わりエラーがでたのでしょうか
どっかでみたコピペだな
コピペじゃなくて真剣に悩んでます
537 :
530:2011/12/31(土) 02:16:34.54
ありがとう
>>533 ワークシート関数で作業列で結合してそれでVLOOKUP使ってるのを見た事
ありますがそういう事ですね。
>>532 この質問では何がという特定の目的はありませんでした。ほかの検索方法
があれば知りたいなと思って。
>>531 アクセスっぽい事をエクセルでやりたいのです。どの会社行ってもエクセル
は必ずあるけどアクセスはあんまり見ないですし。
538 :
デフォルトの名無しさん:2011/12/31(土) 02:50:44.07
ただ検索して知りたいだけなら、VBA使わずに手動でオートフィルタだが。
VBAでオートフィルタって手もあるけど。だからどういうことをやりたいのか聞いた。
エクセル97のおんぽろ会社PCで400行×20列くらいのデータ抽出を
数式のコピペだけでやって10秒ほど?で出来てるけどそれより早いなら解からん
>>537 AccessなしでもAccessデータベースを扱うことは可能
他にもタダで使えるデータベースはあるから使い途によっては選択肢に入れてもいいかもね
でもいろいろ敷居が高いかな
>>540 ようするに会社のパソコンで必ず使える物ならいいのでエクセルで無理やり頑張るより無料のデータベース
勉強する方が良いかもしれないですね。
現状の配列方式で5000〜1万件ってそんな時間かかるものなん
条件合致したら、ループ抜けるんだよね?処理は1回だけ
543 :
デフォルトの名無しさん:2011/12/31(土) 11:57:37.43
エクセルの表に対してADO&SQLつかえば?
遅いよ
546 :
530:2011/12/31(土) 13:48:33.96
>>542 ダミーデータ1万行まで入れて一番下に入れた文字を検索してみたら0.015秒でした。
十分早いですね。
検索回数増えないようにロジック考えればこの方法で十分なんですね。
オートフィルタとか使わずに検索を一度に何十回とか繰り返してたのでそもそもそのへん
を考え直すべきなんですね。
547 :
デフォルトの名無しさん:2011/12/31(土) 20:54:03.70
下記はどう使い分けるのが適切でしょうか?
vbCR
vbLF
vbCRLF
vbNEWLINE
vb.netで質問です
trackbar1のvalueからpicturebox1のbackcolorのレッドの濃淡を出したいのですが
trackbar1のvalueはinteger(0−255)にしています。
Public Sub TrackBar1_Scrollするとtrackbar1.valueから0の場合picturebox1のバックカラーは一番薄い色に(白か初期の灰色に)
逆に255ならばtrackbar1のバックカラーはどす黒いredにしたいのですが…
まず濃淡を出すこと自体可能なのでしょうか。。。
スレ違いと言うことは重々承知しております。vb.netスレが検索してもないもので。。。
お願いします。
549 :
デフォルトの名無しさん:2011/12/31(土) 22:05:09.51
550 :
デフォルトの名無しさん:2012/01/01(日) 02:14:28.71
選択範囲を全て罫線を引くのは下記で出来ますが
Selection.Borders.LineStyle = True
例えば
一番上と下のラインを以外の横の罫線を点線にしたい場合って
どうすればいいのでしょうか?
一応マクロの記録でやると何十行もの内容が出てる来たので
それは避けたいのですが
全部書いてから横罫線だけ上書きするとか
Selection.Borders.LineStyle = xlContinuous
Selection.Borders(xlInsideHorizontal).LineStyle = xlDash
552 :
デフォルトの名無しさん:2012/01/02(月) 09:58:08.79
あけましておめでとうございます。
行列のことで質問したものです。
再度整理して、再質問します。
octave系のプログラミングソフトでは、行列表示は
a=[2 2;5 5]
などで表せます。
逆行列は、inv(a), また、転置行列は、a'で表せます。
Excelでは、
1.a=0 とまず、空の成分を置いて、
b=0
for i=1 to 10
for k=1 to 10
b=b+1
a(i,k)=a(i,k)+b
next i
next k
のように置くことは可能でしょうか?
つまり、例えばですが、
a(1,1)の部分には1が入り、a(2,2)の部分には2,また上の例には
対応していませんが、a(1,2)には3や4などといった数字が入り…といった感じです。
よろしくお願いします。
馬鹿には無理
試せばわかる
for i=1 to 2
for k=1 to 2
debug.print a(i, k)
next k
next i
2行2列で足し算
掛け算でなかったっけ?
For i = 1 To 2
For k = 1 To 2
a(i, k) = 1
b(i, k) = 2
c(i, k) = a(i, k) + b(i, k)
Next k
Next i
iとkなのが気持ち悪いんだが
>>552 新しく質問する前に前回の質問にケリ付けとこうよ。
>>502が聞いてたWorksheetFunctionを避けたい理由とか、
>>501で紹介していたFunctionの何が童話からないのかとか、
一切説明ないじゃん。
自分が分かればそれで良いってのは虫が良すぎるんじゃないの?
559 :
デフォルトの名無しさん:2012/01/02(月) 15:05:35.05
>>558 大変申し訳ございません。
worksheetfunctionを避けたい理由としましては、excelではなく
visual studio(ほとんど同じコードだと思います)でも使いたいので、
応用させたいと思っています。
また、501に関しては、Z() と最初においていますが、
これにより、
z(1,1)=5 , z(1,3)=4 , z(2,1)=3と打つと、
例えばですが、z(1,3)に入っている数字は4ということなんでしょうか?
561 :
558:2012/01/02(月) 15:51:07.30
>>501のは2つの引数X(),Y()で与えられた2次元配列について行列積を求め、MProd()で返す関数
まず、m1,n1,n2,は行列の大きさを格納するための変数
m1 = Xの行数,n1 = Xの列数 = Yの行数(もし違ってたら行列積の計算ができない),n2 = Yの列数
i,j,h,はFor next のためのカウンターの変数
tmpは各要素の計算結果を一時的に格納する変数
Z()は最終的な計算結果を格納する配列変数
UBound(X,1)はX(a,b)のaの個数の上限を求めるもので
UBound(X,2)はX(a,b)のbの個数の上限を求めるもの
UBound(Y,2)も同様にY(a,b)のbの上限になる
行列の大きさが分かったので
結果を入れるZ()をRedimでm1行、n2列に再定義して
m1,n2,n1,の順にネストしてループをまわす。
一番内側のhのループ内でX()i行目の各列とY()j列目の各行との要素の積を一個ずつtmpに合算していくと、
Z(i,j)の要素が求まるのでZ()に代入
これをその外側の2つのループでi,jを変えながら繰り返すとZ()の全要素について求まる。
最終的にZ()をMProd()に代入して処理完了
>>552 > a(1,1)の部分には1が入り、a(2,2)の部分には2,また上の例には
> 対応していませんが、a(1,2)には3や4などといった数字が入り…といった感じです。
どうしてそうなると考えたのか?
564 :
デフォルトの名無しさん:2012/01/02(月) 16:35:00.75
VBA以外触ったこと無いから分からないのですがクラスとはどういう時に使うものですか?
中二病の発作を起こした時に作ってみるもの。
クラスにするまでも無かったと我に返ってコードを投げ捨てることも多い。
XMLHttpRequestを使ってページの差分取得をしようと思ったのですが
Set XMLhttp = CreateObject("MSXML2.XMLHTTP")
XMLhttp.Open "GET", URL, Flase
XMLhttp.SetRequestHeader "If-Modified-Since", LastTime 'LastTimeにLast-Modified格納している
XMLhttp.SetRequestHeader "Accept-Language", "ja"
XMLhttp.SetRequestHeader "Accept-Encoding", "gzip"
XMLhttp.SetRequestHeader "Connection", "close"
http.Send
これでResponseBodyを見たところ全てのデータが含まれていました
上記のコードは正しくヘッダーがセットされていますか?
最終行のhttp.SendはXMLhttp.Sendの間違いです
もはやExcelと何の関係もないな…
>>567 スレチ
If-Modified-Sinceは差分取得するもんじゃない
指定したLastTime以降更新されてなければ "304 Not Modified"が返る
と言う事で ここでは これ以上聞いてもスルーする
>>567の件はぜんぜん分からないからスレチでなくとも俺は答えられないけど、
ちょっと便乗で質問。
ExcelのVBAでWebブラウザ制御するのって自動巡回扱いになるの?
この前仕事で某官庁のHPから統計データを引っ張るためにマクロ組んだら
上司にそれは自動巡回だからやっちゃだめって怒られた
(某官庁のHPには自動巡回ソフトの使用はご遠慮くださいって書いてあった)
IEをCreateObjectしてURLを自動的に生成(対象データの年度の部分を動的に変えるだけ)
して
表示されたらExecWBでSelectAll、Copy、して
クリップボードから.PasteSpecial でワークシートに貼り付けただけなんだけど、
そういうのも自動巡回ソフトに当たるんだろうか?
こんなの手作業をマクロに書き換えただけじゃんねぇ?
手動じゃないなら自動でしょ
>>572 いや、そういう意味じゃなくて自動巡回ソフトってサーバーに負担かけるからだめなんでしょ?
手作業でできることをマクロ化したところでサーバーにかかる負担なんて変わらないよねってこと
(一応、念のために適当にウェイトかまして速くならないようにはしてた。)
わからんでもないが、それは配慮。
遠慮してくれってんだから、だめでしょ、やっぱり。
手作業をマクロ化って自動化そのものじゃんねぇ?
ねぇねぇ、思いつきだけど言って良い?
自動ポルノ。
>>573 そう思うのならその某官庁とやらに説明して許可もらえばいいじゃん
そうでもしないと上司を納得させられないんじゃないの?
こんな所でグダグダ言ってても意味ないよ
スレ違いどころの話じゃないし
うーん、結局釈然としないのは、
自動巡回ってもっと高度なことやってるもんなんじゃないか
っていう疑問が残るからなんだよね。
グーグルとかヤフーのクローラって(Robot.txtで排除できるらしいけど)
もっと直接HTMLのソースとか解析して根こそぎ情報取得するんでしょ?
そういうのがここでいう「自動巡回」なんじゃないかっていう気がしてるんですよ。
こちとらそんな高度なことできないから
普通にブラウザ開いて表示したページをコピペしてただけですから。
まぁ、上司に禁止されたからもうそのマクロは使えないんですけど、
もう少し上記の件に関する技術的なことを教えてもらえたら
って思って質問したんです。
(そういう方向の話になるとスレチっぽいんで答えてもらえないかもしれないけど)
>>578 LibraHackの件みたいな事もあるからね
Static変数ってStatic変数を使う全てのプロシージャで宣言する必要ある?
試せよ
583 :
581:2012/01/02(月) 23:09:41.91
VBA力とか言ってる時点で自分が格下なのに気付けよ
関係ない話で誤魔化さないでください
わかりもしない、答える気もない屑が掲示板を荒らすのは本当に不愉快です
Publicを使わないでユーザーモジュール標準モジュールからアクセスでき
モジュールが終了しても記憶しておく変数を宣言することは可能ですか?
セルを使用する以外でお願いします
public使えよ
589 :
587:2012/01/02(月) 23:51:54.46
Publicを使わないでと言っておるんだよ
>>560、561
大変ありがとうございます。理解できました。
しかし、したの例のように試してみると、たとえばz(1,1)の部分に
数字を入れることができなかったです。。。
Sub test()
Dim z() As Double
z(1, 1) = 1
Cells(1, 2).Value = z(1, 1)
End Sub
>>589 どうせ別人だろうけど
temp.txtとか作ってそこに値いれとけばいいんじゃね
>>587 Textファイルに書き出せばセルもパブリック変数も使わないで済む
こういう頓知解答がNGなら不可能
ホント酷いな
>>590 Z()を宣言しただけじゃZが2次元配列とは限らないから
Z(1,1)に値は入れられない。
はじめから
Dim Z(1,1) As Double
みたいに2次元配列で宣言するか
Redim Z(1,1)で配列の再宣言するかしなきゃ駄目
(あとはVariantで宣言する方法なんてのもあるけど割愛する)
とにかくこういうのは基本的な事なんで、
ここで聞く前にまず自分で調べるべき話。
自分で調べるようになって欲しいと思ってるならそこまで甘やかすなよ
>>587 Static変数をプロシジャの引数として参照渡しする。
変数クラスを定義してそのインスタンスを参照渡しする。
矢切の渡し。
あ。。( ̄▽ ̄;)。
まちごた。
忘れてくれ。
だからクラスってなんだよ
>>590 www.eurus.dti.ne.jp/yoneyama/Excel/vba/vba_array.html
>>587 セルに保存とかわらんが、BuiltinDocumentPropertiesとかUserFormのTagはときどき利用する。
フォームモジュールにはあまり処理を書かない方がいいですか?
引用しようと思っても呼び出せないので
他モジュールのSubを呼び出すのに、
Call Module2.TestProcess
のようにモジュール名をつけないとダメですか?
みなさんのVBA力はその程度ですか?
見ず知らずの人に無償で提供できる範囲はこの程度
606 :
デフォルトの名無しさん:2012/01/03(火) 14:42:14.27
>>604 おまえのレス力は最低レベルだ。「レス力検定」でレス力を磨きなさい。
わかりもしない、答える気もない屑は黙っていてください
ここは、質問するのが自由なら
答えるのも自由だし、横やり入れるのも自由、そういう場ですよ
そういう場に自ら来ておいて、「回答以外はするな」はお門違い
ボウヤ、何勘違いしちゃってるの?ってな感じだ
横やりが嫌なら横やり禁止のとこ行け
609 :
デフォルトの名無しさん:2012/01/03(火) 16:06:39.58
ここは、横やり入れるのも自由なら
縦やり入れるのも自由だし、「回答以外はするな」も自由、そういう場ですよ
そういう場に自ら来ておいて、
>>608の書き込みはお門違い
オマエモナー
悔し紛れにオウム返しするも、的を射て無くて完全に負け犬の遠吠え状態w
答える能力のない自分を顧みずに上から目線ですか
哀れな屑ですね
遠吠え谺す
ユウナレスカ検定一級ですがなにか
ねえマジで
この程度の質問にも答えられないの?
大した事ないっていうか…お前ら…
好きなエクセルでもこんなレベルって
きっと他の分野じゃ本当に無能なんだろうな
>>615 あんた質問書いてないじゃん
書いてない質問にどう答えろと?
617 :
デフォルトの名無しさん:2012/01/03(火) 20:12:26.74
Sub sample()
Dim a, i As Double
a = Cells(2, 3).Value
For i = 1 To a
Cells(i, 1).Value = i
Nexti
End Sub
上記のように、マクロを使用せずに、シート1のセル(2,3)の部分に数字を
入れれば、自動的に、(1,1),(2,1),(3,1)の部分に1,2,3といったように
表示させたく上のコードを作りました。
しかし、なぜかエラーとして
subあるいはfunctionが定義されていません。
と出ました。
どうすればよいのでしょうか?
またfunction関数を作る場合は、module以外のシートに作る必要があるのでしょうか?
何卒よろしくお願いします。
×Nexti
○Next i
619 :
デフォルトの名無しさん:2012/01/03(火) 20:29:03.06
早急なご返事大変ありがとうございます。
できました。
しかし、これは再生ボタンを押さないと表示されないです…
自動的に数字が変わる方法はご存じでしょうか?
よろしくお願いします。
セルが変更された場合のイベントを補足して処理する
Worksheet_Change
とかで検索
できました。本当にありがとうございました。失礼します。
>>617 これはOption Explicitを指定しないせいで
Nextiが変数として処理されたために起きたトラブルだから、
モジュールの先頭にOption Explicit を書いておけば
Nextiと書いた部分がエラーになってその時点でトラブルが防げた。
OptionExplicitを書く癖をつけといたほうが良いと思う。
あと、変数iをDouble型で宣言している意味が分からない。
整数しか入れないならLongやIntegerで宣言しとけば良いと思うし、
さらにいうと変数aはVariantで宣言してるんだから
それならiもVariantで良いんじゃないかとも思う。
もしかして宣言の仕方自体が分かってないのかもしれないから補足しておくと、
Dim a,i As Double
と書くと、a は Variant型、i は Double型で宣言される。
両方ともDouble型で宣言するなら
Dim a As Double,i As Double
と書かなきゃ駄目だし、そんなこと書くぐらいなら
Dim a,i
で両方ともVariant型にしちゃっても良かったと思う。
ハリキッテルネ!
オマエモネ!
ソクレス・・・スレカンシゴクロウサマデス!
いや、たまたま新着レスがあったから
適当に書き込んだだけなんだけどw
>>622 詳しいアドバイスありがとうございます。
ところで、さらに質問が出てきました。まったくべつのものですが、、、
Sub test1()
Dim x(100, 100) As Integer
a = 0
For i = 1 To 20
For n = 1 To 20
a = a + 2
Cells(i + 4, n + 4).Value = a
Next n
Next i
a = UBound(x, 1)
Cells(2, 2).Value = a
End Sub
ためしに、UBound(x,1)が100なのか、それとも数字が入っている20行までなのか
試してみたのですが、結局上記の場合、UBound(x,1)=100でした。。。
数字が入っているところまで20とすることは可能なのでしょうか?
その例では、20はリテラル値なんだから
a = UBound(x, 1)
を
a = 20
にすれば良いだけじゃん
20の部分が変数になったとしても、同じく
a = 変数
で事足りる
固定のリテラル値にしろ変数にしろ、前段階の処理でどこまで数字を
入れたかが解ってるんだから、配列から取得する必要など何も無い
630 :
622:2012/01/03(火) 23:43:36.86
>>627 >ためしに、UBound(x,1)が100なのか、それとも数字が入っている20行までなのか
>試してみたのですが、結局上記の場合、UBound(x,1)=100でした。。。
>
>数字が入っているところまで20とすることは可能なのでしょうか?
申し訳ないんだけど質問の意図がまったく分からない。
UBound(X,1)はXという配列変数の1次元目の上限を求めているわけで
変数の宣言時にX(100,100)と宣言してるのだから
(その後Redimで大きさを変更したりしない限り)
その時点で100になるのは当然のこと。
そして、ForNextのネストの中でCellに値を代入しているけど
そこでもX()はまったく出てきてないんだから
UBound(X,1)が100から変化すると貴方が考えた理由が分からない。
んで、
>数字が入っているところまで20とすることは可能なのでしょうか?
というのも何の事だかさっぱり意味が分からない。
できたらもう一度、意味が通じるように質問しなおしてほしい。
ありがとうございます。
今、行列の計算のプログラムを作っています。
http://www.fastpic.jp/images/023/1362403442.bmp しかしながら、上記のように正しい計算結果を得ることができません。
コードは以下のようになっています。大変わかりにくくてすみません。
Sub 行列掛け算()
Dim z(100, 100) As Double
Dim x(100, 100) As Double
Dim y(100, 100) As Double
Dim s As Double
'aの行列
For i = 16 To 19
For j = 4 To 6
'xの要素に、入れていく(1から)
For n = 1 To 4
For nn = 1 To 3
x(n, nn) = Cells(i, j).Value
Next nn
Next n
Next j
Next i
'bの行列
For i1 = 16 To 18
For j1 = 8 To 12
'yの要素に、入れていく(1から)
For n1 = 1 To 3
For nn1 = 1 To 5
y(n1, nn1) = Cells(i1, j1).Value
Next nn1
Next n1
Next j1
Next i1
'逆行列の計算
For i2 = 1 To 4
For j2 = 1 To 5
s = 0
For k2 = 1 To 3
s = s + x(i2, k2) * y(k2, j2)
Next k2
z(i2, j2) = s
Cells(i2 + 21, j2 + 4).Value = z(i2, j2)
Next j2
Next i2
End Sub
書き込めなかったので2つに分けて書き込みます。
何卒よろしくお願いします。
>>630 すみません。もう一度理由を述べます。
なぜxboundで100ではなく20がほしかったのかというと、
自分が今から作ろうとするFEM法を使った方法でやると、
行列の数が40行くらいになってしまう可能性があるからです。
しかもその行列の数は、節点数によって変わってくるため(この辺は専門的ですみません;)
行列の数が予測できないため、最初にx(100,100)と置きました。
さすがに、100行列まではいかないだろうということで、です。
今回は試しに、20行列を作ってみたので、ひょっとすれば
xboundで20が出るのかな(つまり数字が入っているところまで)
と思いましたが駄目でした。
当たり前だろ
>>633 それは無理。
行列の数がわからないのであればRedimすればいい。
>>633 x(n, nn) に期待通り取り込まれているのは確認できているか
もはや"xbound"とか勝手な事書いてるけど、
"UBound"ってのはあくまでも配列の上限を返す関数であって
その配列の中でどこまで実際に値が入ってるかを調べるものじゃないから
そういう使い方は出来ない。
っつーか貴方、ここ最近行列云々で質問続けてる人だったのね?
VBAのこと事前に学習してないでしょ?
試行錯誤は決して悪いことじゃないけど、
中途半端な知識でプログラミングして失敗するよりも
一度きちんと学習してからプログラミングしたほうが良いと思うよ。
どっち道失敗はするだろうけど、今みたいなどうでも良い間違いは減ると思う。
本を買うなりWeb上の解説サイトを読むなり、多少基礎知識つけてから出直したほうが
ゴールに早くたどり着けるはずだよ。
こっちだってこんなどうでも良いこと質問されるのも正直迷惑だし。
>>637 今確認しました。期待通りではなかったです…
なぜか、yはすべての成分が121の3行5列で、
xはすべての成分が20の4行3列でした。
すみません。。たしかにfornextの部分頭の中でやっておかしいですね。。。
もう昨日の夜の12時からまったくの不眠不休でほかの研究作業もやりながらなので
ぜんぜん思考回路が回っていません。
寝て、もう一度再プログラムしてみます。失礼しました。
もうすこし自分で考えてきてから質問してね
ここの人たちだって貴重な時間を割いてアドバイスしてくれてるのよ
答えたくて答えてるだけだろ
思いっきりスレチだから
答えてる方も荒らしだから
Range("A100").Formula = "=countif(A1:A80,""<=2"")"
<=2の部分をA90の値にしたいのですがどう書けばいいんでしょうか
"=countif(A1:A80,""" & Range("A90").Value & """)"
646 :
644:2012/01/04(水) 10:41:57.67
ありがとうございます!
おはようございます。
>>642、643 まことに大変申し訳ございません。。。
最後の質問です。この分野さえ終わることができれば終了です…
以下の行列の逆行列を求めようとしましたができませんでした。。
1 2 2
1 1 5
1 2 1
答えが
-9 2 8
4 -1 -3
1 0 -1
ですが、
0 0 0
1 0 0
1 2 0
になってしまいました;
コードは以下です。
Sub 逆行列()
Dim x As Double
Dim A(100, 100) As Double
For i = 1 To 3
For j = 1 To 6
A(i, j) = Cells(i, j).Value
'ちゃんと数字が入っているか確認
Cells(i + 5, j).Value = A(i, j)
'確認OK
Next j
Next i
'逆行列計算
For k = 1 To 3
x = A(k, k)
For j = k To 6
A(k, j) = A(k, j) / x
Next j
For i = 1 To 3
If i = k Then
x = A(i, k)
For j = k To 6
A(i, j) = A(i, j) - x * A(k, j)
Next j
End If
Next i
Next k
650 :
デフォルトの名無しさん:2012/01/04(水) 12:58:01.29
"=countif(A1:A80,""" & Range("A90").Value & """)"
これでセルの値を指定することができたのですが
<=を入れるとエラーになってしまいます
あとRCを使ったやり方で<=をつけるにはどうしたらいいですか?
ここはVBAのスレです
VBAでの式入力方法ならまだしも
それ以前の式の作り方についてはスレ違い
>>650 " で囲まれた中に " 自体を記述したいときは "" と2つ続けて書く
だから、
=countif(A1:A80,"<=2")
の前後を"で囲むと
"=countif(A1:A80,""<=2"")"
になる。
また、""で囲まれた部分は文字列だから、
& で他の文字列や文字列型変数と結合できる
つまり、 上記の式の"2"の部分をA90の値に変更したいなら、
"2"以前の部分の文字列と"2"以降の部分の文字列を作って、
Range("A90").Valueを & ではさめばよい。
(
>>645は"<=2"をA90の値に置き換えてる)
ちなみに"2"以前の部分は
"=countif(A1:A80,""<="
になる。
後ろのほうは
>>645とおなじだから後は自力でやって
653 :
デフォルトの名無しさん:2012/01/04(水) 14:38:33.01
普通のカッコ ( ) は、たとえば数学の計算式では
y=(-b+(b^2-4ac))/2a
のようにいくらでもネスト構造がありえるのに
なぜダブルクオーテーション " は、内部のは二つ重ねるルールにしたのですか?
欠点は、三重以上に重ねられなくなってしまってないですか?
二つ重ねるルールの利点を挙げてください。
654 :
653:2012/01/04(水) 14:39:41.54
疑問の一つに、
=countif(A1:A80,"<=2")
の前後を"で囲むと
"=countif(A1:A80,""<=2"")"
になるなら、
"=countif(A1:A80,""<=2"")"
の前後をさらに"で囲むとどうなるの?
655 :
653:2012/01/04(水) 14:40:31.63
オフィス田中の人は、このダブルクオーテーションのネストについて
なにか研究成果を発表はしてないのですか?
単純すぎて研究するほどのことでもあるまいに
文字列の囲い記号(開始記号と終了記号)が「"」の場合
囲い記号としてではなく文字として「"」を表したくても
途中に"を入れるとそれが「文字 "」なのか「囲い終了記号」なのか判別できない
そこで、囲い開始記号以降の「"」は、1つなら「囲い終了記号」、
2つなら「文字 "」として扱うというルールにしただけのこと
この単純なルールだけで
> 三重以上に重ねられなくなってしまってないですか?
なんて欠点も無く、どんなものでも表現できる
657 :
デフォルトの名無しさん:2012/01/04(水) 14:59:18.98
できましたw
自力では無理だったと思うので助かりました
"=countif(A1:A80,"">=" & Range("A90").Value & """)"
658 :
デフォルトの名無しさん:2012/01/04(水) 15:09:23.33
redim kmax(100,100,100) as double
redim k(100,100) as double
for zzz=1 to 5
for z1=1 to 100
for z2=1 to 100
kmax(z1, z2, zzz) = k(z1, z2)
next z2
next z1
next zzz
とすると、kmaxの(z1,z2)の部分にはちゃんと、kの(z1,z2)は入るのでしょうか?
659 :
デフォルトの名無しさん:2012/01/04(水) 15:14:55.75
>にはちゃんと、kの(z1,z2)は入るのでしょうか?
自分で試せよ w
660 :
デフォルトの名無しさん:2012/01/04(水) 15:20:51.45
>>656 なるほど、あなた超頭いいですね。
こういう"の用法をたとえば本で書くときに
>>656の説明までちゃんと書いてくれてる本の作者こそ
物を書くセンスがあるといえる。
いままで"の由来について書かれたものは見たことがなかった。
>>656さんは自分でこの考えを発見したの?
そうすると、先の
「"=countif(A1:A80,""<=2"")" の前後をさらに"で囲むとどうなるの?」
の回答は、こうなるね。↓
"""=countif(A1:A80,""""<=2"""")"""
661 :
デフォルトの名無しさん:2012/01/04(水) 15:21:30.46
ここで皆に宿題だが
「"""=countif(A1:A80,""""<=2"""")"""」をさらに"で書くと、どうなるかね?
>>660 俺は
VB言語では文字リテラルの囲いは「"〜"」
VB言語では「文字 "」のエスケープシーケンスは「"」
という説明を本で読んで、それをちょっと詳しく解説しただけで
このルールを発案した人じゃないから、べつにそう大げさに褒められるほどのものじゃないが
早く 冬休み終わらないかなーー
スレチ話しがウザイ
ちょっとしたスレチ話にムキになって突っかかっていくような幼稚な奴も
冬休みが終れば消えますかね?
残念、永遠に冬休みでした
666 :
デフォルトの名無しさん:2012/01/04(水) 16:49:58.19
スレチを指摘する人はいるけど
適切なスレに誘導する人はあまりいないね。
そのほうがウザイスレチ話が減って有益だと思うんだけどな。
スレチ話ですまん。
ここ以外でVBAを扱ってるスレはないからね
そうでもないけどね
>>669 これが最後ね
Sub 逆行列2()
Dim A
Dim x As Double
Dim z
Dim i As Long, j As Long, k As Long
A = Range("a1").Resize(3, 6)
For k = 1 To 3
x = A(k, k)
For j = k To 6
A(k, j) = A(k, j) / x
Next j
For i = 1 To 3
If i <> k Then
x = A(i, k)
For j = k To 6
A(i, j) = A(i, j) - x * A(k, j)
Next j
End If
Next i
Next k
Range("a10").Resize(3, 6) = A
End Sub
間違ってはいない
そう言えば、前スレで話題になったサンプルコレクションの本、第3版出たのね。
パラパラ見たけど、印刷文字薄くて見にくくなってた。でも、2010での動作可否が載ってるのはいいなと思た。
参考までに…
Dこーてーしょんは、ユーザー自作メニューを汎用コードで作る時に地獄をみるのだ
ボタンとかラベルとか動的に作成するとこはできますか?
出来る場合、動的に作成した物へのアクセスはどうすれば良いですか?
私の辞書に調べるという文字はない
>>676 VBAは知らんが、普通のOOPなら、できて当然だな
ボタンなりラベルなりのオブジェクトを作ってビューに配置
してやればいいだけだもんな
アクセスも自分で作ったオブジェクトだからわかるし
>>676 たとえばボタンを作成して制御するなら
Dim button1 As Object
Set button1 = ActiveSheet.Buttons.Add(200, 200, 100, 25) ' left, top, width, height
button1.OnAction = "Macro2"
既存のボタンにアクセスするなら
Dim button1 As Object
Set button1 = ActiveSheet.Buttons(ボタンのインデックス)
たぶん
VBA知らん奴が何しに来たの?ん?質問かい?
VBA(VBも?)の場合、オブジェクト変数に代入する場合、
変数名の前にSetをつけなければならない理由はなんなのでしょうか?
そういう言語仕様だからというだけでしょうか?
それとも、同じオブジェクト変数に代入する場合でも、Setを伴う場合と
伴わない場合の2ケースあるのでしょうか?
引数が9つある関数って他人が見たらどう思う?
それなりの理由があれば問題無いな。
Excelのメソッドも、省略可能とはいえ引数がやたら多いのが結構あるし。
>>681 もともと初期の vb にはオブジェクトの概念がなく、後付けでオブジェクトを導入したとき、
既存仕様を維持してオブジェクトをサポートするために、特別な Set キーワードを導入した
とかそんな話だった気がする
Dim a
Dim b
Set a = Range("b2")
b = Range("b2")
変数 a には Range オブジェクトが格納される
変数 b には Range オブジェクトのデフォルトプロパティが格納される
>>684 なるほど、SetありもSetなしも文法上は許容されるのですね
であれば、Setキーワードの意味はありますね
この例でいうと、デフォルトプロパティは何を指しているのでしょうか?
687 :
684:2012/01/06(金) 01:55:17.69
>>685 すみません、オブジェクトの参照ですね
>>686 厳密にはかなり面倒で、
Range には _Default という隠しプロパティがあってそれがデフォルトプロパティになるらしい
_Default には引数(RowIndex, ColumnIndex)を与えることができて、
引数ありだと Item(引数)の評価結果、引数なしの場合は Value の評価結果を返すらしい
まあ、通常は Value と覚えておけばよいかと
Setは参照の代入だが、Setは省略できないぞ
Letっていう値を代入する命令があって、これは省略できる(というか書いてる事がほとんどない)
文法的には省略されてるのはLet
>>688 つまり、
>>684の
Dim a
Dim b
Set a = Range("b2")
b = Range("b2")
のb = 〜の行は、
Let b = Range("b2")
と解釈されて、そのとき代入されるのが_Defaultプロパティということ?
Letなんてキーワード見たの何年ぶりだろ
昔の教科書には必ず書いてあったけど最近の入門書は最初からスルーしてるよな
試してみたらこれはエラーになった
Let a = Range("A1")._Default
>>691 Let a = Range("A1").[_Default]
LETとかN-BASICですら使ったことがないなw
やたら丁寧なコードを書くやつがよくLet使ってたな。
長く書くのが趣味だったんだな。
凄くどうでもいいです……
>>690 どうもありがとうございました。
了解しましたm(_ _)m
700 :
デフォルトの名無しさん:2012/01/07(土) 02:53:29.64
Areasプロパティ
702 :
デフォルトの名無しさん:2012/01/07(土) 09:12:33.09
>>700 質問の仕方が悪いと思うよ
Excelで単純に"C"と書いたら、通常はシート左端から3列目の"C列"のことだと思われる。
貴方が貼った画像だと"A列"に"C"と書いてある"2","3","4","9"の"行"が選択されてる。
コピーしたいのは選択範囲の"すべての行"なのか、それとも選択範囲の"C列"なのか、
どっちか分からない。
703 :
デフォルトの名無しさん:2012/01/07(土) 09:50:23.96
>>700 ふつうにA列をフィルタして
抽出されたセルたちを「切り取り」して
他所に「貼り付け」してOKと思ったけど、
うまくできないね。
「切り取り」して「貼り付け」だと、フィルタで隠れた行まで移動してしまう。
「コピー」して「貼り付け」だと、フィルタしたものだけがコピーされるのに。
自分もこんな発見をして勉強になったよ。
力にはなれなかったけど、うまくいく方法が見つかるといいね。
>>702 すいませんでした。
2.3.4.9の選択されている行です。
22 名前:名無し募集中。。。[] 投稿日:2012/01/06(金) 23:40:34.39 0
AKB=金正恩
この意味わかるか
AKBという捏造ブームの裏に何があるか見えるか?
>>700 選択範囲は Application.Selection で取得できるけど、
選択範囲が複数になる場合、Application.Selection.Areas に各選択範囲(Rangeオブジェクト)のコレクションが格納される
面倒だけど、最初に Areas の値を保存しておいて、ループ処理で各 Range 毎に処理するとかになるんじゃないかなあ
>>700 とりあえず手動で今の状態からコピーしたいなら複数行の選択じゃなくセル範囲の選択でコピーしたら
貼り付け先には飛ばした行を詰めて貼り付けできるけど。
>>700 関数使いたいなら作業列使えば可能
作業列1 =IF($J$2=A2,COUNTIF($A$2:A2,A2),"")
作業列2 1から連番
作業列3 =MATCH(G2,$E$2:$E$28,0)
L列 =IFERROR(INDEX($B$2:$B$28,H2),"")
M列 =IFERROR(INDEX($C$2:$C$28,H2),"")
http://ozcircle.net/_uploader/69930900 常にデータが増える表ならVBAの方が楽だけどそうでもないなら関数の方が早い。
>>704 やっぱりよく分からない
複数選択範囲(行単位)の移動(カット&ペースト)が行いたいが、通常では複数選択範囲のカットができない、というだけ話なら
移動先を ActiveSheet.Range("100:100") と仮定した場合、
Application.Selection.Copy(ActiveSheet.Range("100:100"))
Application.Selection.Delete()
のようにコピー+削除でいけると思うけど、そういう話ではないの?
>>710 >>709の例は複数選択可能で、2行目のDeleteしなければただのコピー
現在のシートの選択行(複数選択あり)をたとえば シート(Sheet3)の10行目にコピーしたいなら
Application.Selection.Copy (ActiveWorkbook.Worksheets("Sheet3").Range("10:10"))
みたいなマクロだけでいけると思うけど
>>712 ああ、行を選択してコピーしたあと、セルを選択して貼り付けようとするとその警告ですね。
貼り付ける時も行を選択して貼り付けたら警告でないです。
ていうか
>>710は手動で選択してますよね。膨大な量というなら行を選択してる時点ですでに
間違いだとおもう。
オートフィルタ後コピペかABC列を昇順・降順並べ替え後にコピペが普通だとおもう。
714 :
デフォルトの名無しさん:2012/01/07(土) 19:07:31.79
>>710 なんか操作を間違ってないか?
複数の行を選択しているとして
右クリックから「切り取り」ならそのエラーが出るけど、
「コピー」だとエラーでないよ。
まぁ複数範囲の選択をしたときにいつでもコピーできるわけじゃなく、
たとえばA1とC3を選ぶみたいに行も列もばらばらの範囲だとコピーもできない。
Range(A1:C3)とRange(E1:G3)みたいに列が同じで行だけ飛んでる場合なんかはコピーできた。
715 :
デフォルトの名無しさん:2012/01/07(土) 19:12:24.86
>>710の訂正で
>私はカットではなく、[A.B.C]とグループ分けをしたうちの[C]だけを別のページをコピーペーストしたいです。
は、
[C]だけをコピーし
別のページにペーストしたいです。
わかりづらくてすいません。
今からレス返します。ありがとうございました。
>>711 なるほど!
そのマクロ(?)をペーストしたいセルに打ち込めば出来るんでしょうか?
今してみたら何も起きませんした…
>>712 選択の仕方が間違えていますか!そうかもしれません。
今は、コントロールキーを長押ししながら選択しています
>>713 ありがとうございました!!!!!コピー&ペーストできました!!!!、
本当にありがとうございました!
こんな皆様の高度な知識の中基本も知らない私が頼りに頼ってしまいすいませんでした……
本当に助かりました!
ありがとうございました!!!!!
複数選択の手動は大変ですがオートフィルの昇順がよくわからないので、今回は手動でいきます。
本当にありがとうございました!
721 :
デフォルトの名無しさん:2012/01/07(土) 19:25:40.93
>>719 オートフィルじゃなくてオートフィルタだよ
A列選択しといて ツールバーのデータ(D) -> フィルタ(F) -> オートフィルタで
A列の項目を選択してコピーできるようになる
と思ったたら、もうしてた
どうでもいいけどプリントスリーンってがあるよ
vbaでパケットキャプチャって出来る?
どっかでカーネルドライバが必要になるから、単体だと無理な気が。
そうやってカーネルで遊ぶんだよ。
たしか、井上も推奨してたな。
カーネル遊び
震災前
/::::::::::::::::::::::::::::::;;::ノ ヽ;::\
/::::::::;;;;;;;;;,,,;;...-‐''"~ ヽ:;::l
|:::::::::::| 岡田 異音 |ミ|
|:::::::/ ,,, ヽ,、 '|ミ|
'|:::::::l '''"" ゙゙゙゙` |ミ|
|:::::|. ,,r ‐、 ,, - 、 |/
,/⌒| ノ ・ _), (. ・ `つ|
| ( "''''" |"'''''" |
ヽ,,. ヽ |
| ^-^_,, -、 |
| _,, --‐''~ ) | マニフェストもう守れない。どうしよう・・・・
'ヽ ( ,r''''''‐-‐′ /
震災後
|:::::::::/ |ミ|
|::::::::| ,,,,, ,,,,, |ミ|
|彡|. '''"""'' ''"""'' |/
/⌒| -=・=‐, =・=- |
| ( "''''" | "''''" |
.ヽ,, ヽ .| キリッ
| ^-^ |
. | ‐-===- | 大震災が起こったのだからマニフェストの破綻も致し方ありません
,\. "'''''''" /
朝鮮民主党
おわり
ビジネスsoft板でVBAのスレ探してたんだけど、なかった。
プログラマ板だったのね。VBAやれる人はプログラマでいいんだ。
HTMLとCSSはできてもプログラマじゃないって言われたことあるけど。
VBAやれる人がプログラマと呼べるとは限らない。
プログラマが触る対象がたまたまVBAだったならマ版にスレが立つだけで。
ちょっと何いってっかわかんないっすね
パスワードかけるのを標準モジュールだけとかできる?
あれはプロジェクト単位でしょ
733 :
デフォルトの名無しさん:2012/01/10(火) 22:42:54.05
A列の一番最後にデータが入力されている箇所を取得したい場合
下記で良いと思いますが
Range("A60000").End(xlUp).Row
上記以外の方法つまりRange("A60000")の記載がソースとして綺麗ではないので
もし他のやりかたとかあれば教えてください
>>733 cells(rows.count,1).end(xlup).row
皆どれくらい勉強してVBAを使いこなせるようになった?
10年以上やってるけど使いこなせてるとは思えない
どこまでできれば「使いこなした」ことになるんだ?
737 :
デフォルトの名無しさん:2012/01/10(火) 23:58:18.81
VBAがある程度以上できる人の、他のPCスキル状況を知りたい。
Excel関数、Word文書づくり、Accessデータベース構造、Powerpointの効果的飾りや、
それにとどまらず、JAVA, JAVAScript、VisualBasic、VisualC++、
HTML、CSS、Perlや
Network、TCP/IP、Unixも完璧にマスターしたりしてる?
>>735 処理重くてもなんでもいいからこれ自動化したいと思った事をそれなりにできるようになる
ぐらいなら1日1時間で3ヶ月目ぐらいには出来てた。
後からの修正がやりやすいようにクラスを使うようになったのは1年過ぎてから。
現在は、4年過ぎた今でも、ちょっと凝った事する時はネットに繋がったPCで調べれないと
ちょっと困る。
VBAでゲームとか作ってる人のレベルには永久に到達しないと自覚してる。
ゲームが作れるのと、Excelの機能を活かせているかは全然別問題。
どちからというと縄張りの違いだな。
ユーザーから提供されたシートが、Excel関数活かしまくりで驚かされることも多々あるし。
関数を駆使してるようじゃ素人。
Excel扱うならほとんど関数は不要。
いるよな。ワークシート関数にあるの知らないで自作関数でバグ出すやつ
worksheet関数のコードって知ることできない?
埋め込み関数もVBAも両方使えば良いだろ。
VBAコードにするまでもない場合あるし、
VBAとハイブリッドでつこてもいいじゃろし。
カレントドライブを変更する方法教えてください
Sub testdirectory()
Dim fld As String
fld = "c:\temp"
If Left(CurDir, 1) <> Left(fld, 1) Then
??????????
End If
End Sub
↑の???です。
chdirはフォルダは変更してもドライブが変更しないってあるんで、ドライブを変える方法を知りたいです
chdriveは違うの?
それです^^;ありがとう
とあるwebサイトのHTMLテキストを取得してそれをエクセルに反映させたいのです
方法を誰かおすえて
>>747 それだけだと何とも言えん
Webクエリでも使っとけ
>>534 これ分かる方いませんか?
ツリービューを使っていますが
イメージリストコントロールver6
ツリービューコントロールver6
両方チェックいれています
ちなみにソースコード内全て検索しましたがRangeは使っていません
753 :
752:2012/01/11(水) 20:03:21.58
頭冷やしたら解決しました
functionである範囲を入力としてとる関数を作っています。
その範囲内の単一のセルが書き換わったとき、そのセル位置を取得方法を教えてください。
2003です。
文章がよくわからんがWorksheet_Changeイベント使ったらどうですか
Dim K-ON! As Nyan
As Nyan が言いたいだけなんじゃないかと
Dim Anal As Hole
>>755 sum関数みたいな範囲指定なんですが、
変更した数値に対して処理を付加したいんです。
直前のセルの値をstaticで保持しておいてもいいのですが、
全数を比較処理して、変更箇所を見つけるプロセスは処理コストかかるので、
簡単にできないかと。
>>759 ユーザー定義関数?
だとしたらそのアプローチが間違ってるよ
処理を付加とかわかんないから詳しく
762 :
デフォルトの名無しさん:2012/01/12(木) 16:11:18.52
2chやニコニコ動画に民主党から反日工作費が流れていることが知られるようになってきた。
民主党が用意した資金で工作員が2chを荒らしていることもだんだんと知られるようになってきた
>>759 あいかわららず何がしたいか全然わからいけど例えばこんなこと?
B1に下記のように式が入力してあって
=SUMもどき関数(A1:A2)
直前の操作(変更)がA1かA2なのかによって
B1に表示される結果を変えたいということかな。
だったら無理だと思う。
スレ違いなら誘導していただけるとありがたいです。
環境の都合上、vbaで作らなければいけないのですが、
別アプリケーションの指定したピクセルの色で判断し、
キー入力をエミュレーションしたいです。
別のアプリケーションの色の取得はどうすれば出来るでしょうか?
>>763 それなら出来る。
面倒くさかったけど作ったことがある
マクロ有効ブックAのvbaで別のマクロ有効ブックBを開き、ブックBはWorkbook_Openイベントで自分自身を編集します。
編集後にそのブックBを手動で別のフォルダに保存したいのですが、
『名前をつけて保存』のダイアログボックスはブックBの元の読み込みフォルダを開いてしまいます。
これを自分の好きなフォルダを開くようにマクロから設定できないでしょうか?
767 :
766:2012/01/13(金) 09:23:12.96
ちなみに、ブックBのマクロ内で
ChDir "C:\"
としてもダメでした。
ChDir "C:\"
S = GetSaveAsFilename()
ThisWorkbook.SaveAs S
とかならC:を開いて保存できますが、
保存するかどうかは任意なので
できれば手動で『名前をつけて保存』を選び、
そのときに指定したフォルダでダイアログボックスを開くようにしたいのです。
768 :
766:2012/01/13(金) 09:26:35.73
すみません、ちょっとミスってました
>S = GetSaveAsFilename()
は
>S = Application.GetSaveAsFilename()
の間違いです。
769 :
デフォルトの名無しさん:2012/01/13(金) 12:03:05.01
2000版だと
ChDir "C:\xxx"
Application.Dialogs(xlDialogsaveAs).show
もし違ったら新しいマクロの記録を使ってダイアログボックスで保存した後、記録の終了→マクロを開いて編集して下さい
770 :
766:2012/01/13(金) 12:49:53.26
どうもありがとうございます
都合により、来週水曜日まで
そのマクロにさわれないので来週試します。
本当にありがとうです
>>764 Win32APIで別アプリのウィンドウハンドルを取得
これでわからなかったら、正直に「できません」と言ってあきらめろ
773 :
デフォルトの名無しさん:2012/01/14(土) 01:11:28.42
A1=1 B1=あいう
A2=2 B2=かきく
A3=3 B3=さしす
1.txt、中身があいう といったテキストをUTF-8で複数作成したいのですが
どうすればよいでしょうか?
Sub out_ex_euc()
Dim MyIndex, myADOstr
For MyIndex = 1 To 3
myADOstr = FreeFile
Set myADOstr = CreateObject("ADODB.Stream")
myADOstr.Charset = "UTF-8"
Open Cells(MyIndex, 1) & ".txt" For Output As #myADOstr
Write #myADOstr, Cells(MyIndex, 2).Text
Close #myADOstr
Next MyIndex
End Sub
こんなの書いてみたのですがダメでした
>>773 なんでプロシージャ名がeuc?ってのはおいといて、FreeFileとか宣言してない変数がいきなり出てくるあたり
どっかのコピペなんだろうけど、もうちょっと落ち着いてコードを見直そうね
Sub out_ex_euc()
Dim MyIndex, myADOstr
For MyIndex = 1 To 3
Set myADOstr = CreateObject("ADODB.Stream")
myADOstr.Type = 2 'Textモード
myADOstr.Charset = "UTF-8"
myADOstr.Open
myADOstr.writeText Cells(MyIndex, 2).Text
myADOstr.saveToFile Cells(MyIndex, 1).Text & ".txt", 2
myADOstr.Close
Set myADOstr = Nothing
Next
End Sub
775 :
デフォルトの名無しさん:2012/01/14(土) 01:53:53.22
>>774 有難う御座います!
無事出来ました。
本当に助かりました。
指定されたフォルダー内のファイル名を作成日時の
降順に並べ替えるにはどうすればいいでしょうか?
ファイル名の一覧を取得して、別の配列に作成日時を
比較しながら挿入して行く方法しか思いつかないのですが、
もっと簡単な方法はありますか?
dir /b /a-d /od の実行結果を取り込む。
>>774 > FreeFileとか宣言してない変数
変数じゃないし。
まあ、ADODB.Stream 使うなら関係ないけど。
dir /b /a-d /od- だったw
ファイルディスクリプタを返す関数か
>>773 >>774 >>778 AODで
UTF-8のtxt作る場合にはBOMがくっつくから
不要ならばバイナリで扱って掃除しないと困るよん。
と、焼酎飲みながらカキコ
反日ネット工作員
朝日新聞社→社員約300人
民主党とその取り巻きの資金が入った反日工作会社→数社約450人
朝日新聞の社員は捕まった49歳の編集者を含め新聞記事を書く合間に2chを荒らしている程度とみられているが
民主党が用意した反日工作会社はほぼ24時間体制で工作を行っている
工作範囲は民主党が予め工作費を流している2ch、ニコニコ動画を中心にyoutube、個人のブログなどである。
785 :
784:2012/01/14(土) 18:05:05.75
エクセルマクロで十分そうな物をSEに頼むか普通。
>>782 >15:53:31.63
>15:53:31.63
>15:53:31.63
>771
ありがとうございます。無事書けました。
プリントスクリーンして〜 とかトンチンカンなことを考えてました。
http://codepad.org/tyOKeGsr のような構造体配列があって年度別に成績を格納するところまではできたんですが、
総合計を出すために nen = 9999 のところにどうやって加算するのかでつまずいて
ます。
みなさんのお知恵をぜひお借り出来れば m(_ _)m
> 最後に総合成績のためのidxを設ける
普通に
Public 合計 As nendobetu_seiseki
って宣言して、それに足しこんでいけば良いんじゃね?
nen は、無駄になるけど気にしない。
そもそも、nen を持つ必要はないと思うし。
791 :
788:2012/01/15(日) 23:07:29.37
なかなか上手く伝えられないですが^^;、イメージ的には
年度 勝 負
2004 12 6
2005 21 2
2006 18 1
2007 18 4
2008 13 4
2009 13 4
2010 15 4
2011 13 4
2012 0 0
9999 0 0
となっていて、勝・負の数を9999のところに足しこみたいということです。
792 :
788:2012/01/15(日) 23:13:43.40
>>790 そういえば、確かに無理やり配列の中でやらなくてもいいですね^^;
分かりました。
ありがとうです
民主党には朝鮮人など外国人のなりすまし、スパイが約90名在籍している
野田内閣は過半数が帰化人
野田はどうだろうか
韓国人から賄賂を貰い、韓国人の集いに出席している野田は
首になった蓮○はシャブで逮捕歴のある人間と仲が良いな。蓮○自身はやってんの?
い-6-1
テレビが言えない民主党のスポンサー=韓国北朝鮮
あとはもうわかるよな
XP Excel2003です
複数のPCでブックの共有をしてるのですが、Excel以外にも
アプリを起動しているので常に前面にExcelがあるわけではないです。
この状態でAのPCで共有ブックをマクロを実行して更新したことをBのPCで
気づけるようにしたいのですが良い方法はないでしょうか?
msgboxを試してみたのですが実行したPCでしか表示されませんでした。
ちょっと質問。
実行時にウインドウを閉じてバックグラウンドで動作させるプログラムを組みました。
内容は、webクエリを実行してコピー→別シートに貼り付けというのが大まかな流れ。
それで、手持ちのノートPCなら動作中は他のプログラムを問題なく使える。
だけど、デスクトップで実行すると画面がチカチカしてクリックがうまくいかなかったり
フォームに文字を入力できなかったりします。
動かすパソコンによって動作の違いってあるのでしょうか?
パソコンはともにwin7 64bitでoffice2010です。
IEで開いたとあるサイトのテキストボックスに、エクセルのセルの値を貼り付けているVBA組んでいますが、
他のテキストボックスには値のが入るのですが、特定のテキストボックス入らず困っています。
(VBA知識は、「マクロの記録」+入門書レベル)
プログラムは
Dim strData(10) As String Dim objIE As Object で定義した変数に
strData(0) = Cells(intRow, 4).Value 値を変数に入れて
objIE.Document.getElementById("TEXT_BOX09").Value = strData(0)
って感じでIEのテキストボックスに入れていきます。
その問題の特定テキストボックスが、他のテキストボックスと違いそうなトコは以下の2点です。
1. そのテキストボックスは、隣にカレンダーボタンがあり、クリックするとカレンダーがでてきて、日付を選択すると
その日付がテキストボックスにはいる
ただし、Sendkeysでためしに、クリップボードの文字列を{~v}で貼り付けたら入るので・・よく分りません・
2. type=hidden テキストボックスがhidden型?の場合は何か特殊な処理必要なのでしょうか?
hiddenはテキストボックスじゃないし、そもそもブラウザ画面に表示されないし
hiddenなフォームフィールドに貼り付けとかどうやってできるのか俺には解らない
ホントにVBAの問題かちゃんと切り分けてから質問してくれ
どうせJavaScriptかなんかで上書きされてるってオチだろう
>>797 hiddenの値を書き換えたいならIEを外からコントロールするんじゃなくて、submitまでの処理を自前でやった方が簡単
たとえばGoogleの検索はqという名前のテキストボックスに検索ワードを書き込むけど、
URLの末尾に「q=文字列」と追加しても同じ結果が得られる
hiddenで隠されたパラメータも同じ方法で自由な値を送信することが可能
例
ttp://www.google.co.jp/search?q=文字列&num=20 numというのは表示される件数。設定画面で変更してcookieに保存されたパラメータがhiddenで送信されている
800 :
797:2012/01/18(水) 10:22:32.24
>798
ありがとうございます。JAVAの問題なのか。となると、これはVBAで操作ではできないことなんでしょうか。
ちなみに該当するとあるサイトのhidden(?)なテキストボックス(?)に20111225と、手入力した状態のソースです。
こんな感じで、そのテキストボックスに20111225と数字をVBAでエクセルからコピペしたいのです。
</TH><TD>
<INPUT tabIndex=6 onchange="KCCDateTextUtils.onChangeText( this );" value=20111225 maxLength=8 size=8 type=text tabIndexOrder="6">
↑サイトに20111225と手入力した時の、テキストボックス(?)の要素
<INPUT id=TEXT_BOX09 value=20111225 type=hidden name=TEXT_BOX09 kccext="dateText">
<INPUT type=hidden>
↑TEXT_BOX09にVBAで値を入れることはまではできますが、テキストボックス(?)に反映されないのが困りごとです。
<INPUT tabIndex=6 onclick="return KCCDateTextUtils.showCalendar( '〜〜/init.do' , this );" src="/〜〜/img/icon_calendar.png" type=image tabIndexOrder="7">
↑テキストボックス(?)のとなりにある、カレンダー呼び出しボタン
>799 URLでできるかも確認してみます。
>>800 間違ってるかもだけど なんとなく
<INPUT tabIndex=6 onchange="KCCDateTextUtils.onChangeText( this );" value=20111225 maxLength=8 size=8 type=text tabIndexOrder="6">
これがあるのに
<INPUT id=TEXT_BOX09 value=20111225 type=hidden name=TEXT_BOX09 kccext="dateText">
なぜここへ値を入れようとしてるの?
VBAで値を入れるべきところは前者のような気がするんだけど
>>800 間違いなくJavascriptで入力内容をチェックしてるね
(ちなみにJavascriptとJAVAは名前は似てるけど完全に別物だからきちんと区別してね)
803 :
797:2012/01/18(水) 15:05:07.95
>>801 ありがとうございます。
そこの使い方がわからなかったんです。
前者に20111225と値を入れたいのですが・・・
VBAで変数から入れようとしたら、 「name=」も「id=」もないので
objIE.Document.getElementById("−−−−").Value = 変数
でどう使えばいいのかわからなかったとこです。
型が一致しません。と出ます
原因を教えてください。
For t = 3 To 100
For y = 2 To 50
If Worksheets("01").Cells(t, y).Value > 10 Then
Worksheets("02").Cells(t, y).Borders.LineStyle = True
End If
Next y
Next t
>>805 Worksheets("02").Cells(t, y).Borders.LineStyle = xlContinuous
>>806 それでやってみましたがやっぱりエラーが出ます
>>805 ステップ実行でどこでエラーか調べてみて
>>809 ここまで黄色の帯がかかります
If Worksheets("01").Cells(t, y).Value > 10 Then
>>810 Dim t As Integer
Dim y As Integer
よろしくお願いします
>>811 エラーでとまったときのtとyの値は?
そのセルに入力されている値は?
813 :
805:2012/01/18(水) 19:52:01.57
>>812 セルの値が#DIV/0!になっていたのが原因だったようです
お騒がせしました
参照エラーね・・・・。
参照は小粒でピリリと辛いって言うからねぇ
あ・・・0除算だから参照エラーって言わないのかな?
如何ざんしょう?・・・・ナンツッテ
>>817 UsedRangeは空白の列や行が二つ以上続くと使われたセルの値を正確に返せない。
Endプロパティだと、列と行を一つずつ調べなければならない
そして列や行の端に値が有るのか無いのかの区別も別途ロジックを用意しなければならない
と言う認識なんだけど。
適当に作ったシートの中身をここら辺のプログラムで読み取るのって
汎用性が有る記述方法が見つからなかったんですが。
そもそもシートの記述の時点で、ユーザーフォームからしか書き込めなくするとか、
1シートに表を1つしか作れないようにするとかって制限をかける方が無難なんでしょうか?
DBに近いような物をシートに作る時はどのようにしてますか?
2007以降ならテーブル
ごめん 816と818を何度読み返してみても、
何がしたいのか、何に困っているのか理解できなっかた。
>>820 プログラムの設計書をVBAで自動生成しようとしてる。
電文の設計書と、それに対応した処理をするモジュールの設計書を作るとして。
両方自動生成するつもりなんだけど、テーブル二つを一つのシートに書くと、
検索のプログラムをシートの書き方毎に作らなきゃならないし面倒そう。
1 シート毎にテーブル一つにする。
2 ファイル名=モジュールのIDとし、特定の列のN番目からデータを取り自動生成すると楽っぽい
3 動的型でも使えるっぽいので、引数でどっちかを指定すれば、エクセルファイルの幅の設定もファイルの種類毎に変えられるっぽい
こんな感じの印象を持っている。
まぁ上のは例を挙げただけなんだが。
プログラムで何かをする時に、元データとして使うシート自体の書き方制限して特定の形にしておくと便利っぽいが
ネットで調べる限りそんな記述が出て来ないんだけど、言葉にしないだけで結構みんなセルに特定の規則作って使ってるよね??
と、出来る限り分かりやすく書き直してみたんだけどOK?
>>821 そのレスも自動生成なのかい?
実用レベルには程遠いね
>>822 もういいやw
説明するのも面倒だし、学校の先生から説明されるような物じゃ無いと何も理解できないとかww
金貰って書いてるわけじゃ無し、理解できない奴は無視しておけば良いやw
しかも実用にほど遠いってww
ひな形の作成ぐらいにしかなって無いだろうよ説明的にww
そりゃお前は中身解ってるから理解できるだろうけどさー
一つ言える事は、ExcelをDBとして使う事は愚の骨頂。できるけど。
どうしてもやるなら入力専用シートなりフォームを作って
データシートをテーブルに見立ててSQL
下手にLookUpとか使うと
>>813みたいに思わぬ所で参照エラー地獄
これで解らないなら敢えてExcelで作る必要無し
Accessとかなんか得意なのが有ればそっちのが良いんじゃね?
PGなんてのは一つ一つやりたい事実装してけば最後には出来るもんなんだよ
いっぺんにあれこれやろうとするから解らなくなる
すっ飛ばすのは数こなして慣れてからだよ
というかセルの型指定できるだろ
入力制限もかけられる
動的に生成したいなら、マクロの記録使ってセル設定すれば
ソースが出来るから後はそれを使いまわせ
>>824 DBに近いような物・・・
DB自体じゃないよ
PG作る時のクラスの命名規則とかいちいちDB作って登録するわけじゃないでしょ、
あくまで簡易な物
それにDBのテーブル自体もエクセルにしといた方が良いと思うが。
テーブルのデータじゃ無く、テーブルの構造な。
MVCアーキテクチャで作る時に、どのテーブルのどのデータ抜いてきたかとか分かると良いだろ。
で、参照値にしとけばって話で
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q127916537 こんなのも出来るし
まぁどちらにしろプログラムの作り方についての質問じゃ無く。
VBAで何かする時に、元になるシートが有るわけだが、好き勝手毎回適当に作るより、
規則性持たせた方が都合が良さそうだけど、どう思う>all
ぐらいな感じ
>>816 ヒトにとって読み易い表フォーマットは往々にして機械走査しにくいが、どんな運用ルールを設けてもなし崩しにされてしまうので、結局ニンゲンさまに合わてプログラムするしかないと諦めてます。
formのボタンを押すにはどうしたら?
プログラムから、ボタンを押すと実行されるサブルーチンをcallするのでなく、ボタンそのものを押す方法。
プログラムは、vbaで出来なければ、他のものでも良いです。
日付関係で質問
VBAでコピー元→コピー先に値の貼付を行なった際、表示がコピー先の書式設定に合ってない…
どう対処したら良いっすか!?
コピー元書式設定:「文字列」 値「2012/1/20」
コピー先書式設定:「yyyy"年"m"月"d"日"(aaa)」
「2012/1/20(金)」で表示されて欲しいところ「2012/1/20」になってしまう
ソース
'日付コピー
Range(Cells(2, HidukeCol), Cells(EndRow, HidukeCol)).Select
Selection.Copy
'値の貼付
Workbooks(HATUKESAKI).Activate
Range("B2").PasteSpecial Paste:=xlPasteValues
Type co
num As Integer
pr As Long
End Type
Dim CoStr(3) As co
こういう構造体配列があります。
数値としては例えば
num pr
1 125
2 138
3 175
みたいなのが入っていたとして、CORRELによる結果を出したいのですが、
CORREL(配列1, 配列2)
となっている時、どういうふうに書けばいいんでしょうか?
今は一旦シートに書きだしてその上でそれぞれrng1,rng2に入れてから
Application.Correl(rng1, rng2)
として計算しています。シートに書き出さず直接計算できたらと思っているのですけど。
831 :
教えてください:2012/01/20(金) 10:18:09.88
ユーザーフォーム内に10個のテキストボックスを作り、その中に数値を
入力していき、最後に別のテキストボックスに10個の数値のMAXと
MINを自動的に割り出したいのですが、どうしてもうまくいきません。
AVEはいくんですが・・・。
どうか、優しい方、教えてください。
>>828 VB6と一緒
ここはあくまでExcelをマクロ言語操作することに関してのスレなので
例え環境としてVBAを使おうと、Excel操作以外はスレ違い
>>829 コピー先に日付書式が設定されていても、それはあくまで数値(シリアル値)が入力されたら
その書式に沿って表示せよという設定なだけで、文字列を入力すれば文字列のまま表示されるので
日付文字列を一旦CDateやDateValueでシリアル値に変換してから入力すれば良い
>>830 VB6と一緒
ここはあくまでExcelをマクロ言語操作することに関してのスレなので
例え環境としてVBAを使おうと、Excel操作以外はスレ違い
>>831 VB6と一緒
ここはあくまでExcelをマクロ言語操作することに関してのスレなので
例え環境としてVBAを使おうと、Excel操作以外はスレ違い
>>826 何分かけて一レス書くのか知らないけど、それと同じ時間だけ何度も読んで、同じ時間だけかけて推敲してから送信してね。
>>832 ありがとうございます。
でもセル範囲でデータを取っているため
Cdateが使えません……
Dim セル As Range
For Each セル In セル範囲
>>833 お前のレベルに合わせたら例3つぐらい出して、起承転結付けて最初と最後に結論かくような、
いかにも国語の教科書って書き方しないと伝わらないだろ
>>819の時点で分かる人には分かるって気が付かないか?
そもそも最初の文だけでも伝わる人には伝わる。
俺に重要なのはお前に伝わる書き方をする事ではない。
同じような考察に至った人が現在どういう使い方をしているのかが知りたいだけ。
自分が経験不足で何を言いたいか理解できなかったからってこっちのせいにするな。
ここはお前のようなかまってちゃんに、必ず伝わらないと文章書いちゃいけないなんてルールは無いんだぞ
>>836 > そもそも最初の文だけでも伝わる人には伝わる。
> 同じような考察に至った人が現在どういう使い方をしているのかが知りたいだけ。
あーごめん俺
>>819だけどお前の話はさっぱりわからんわ
>>837 誰にも伝わっていないか、それとも同じような考察に至った者がいないか(笑)
ID無いとやり放題とw
使えない上司の定型文貼る奴はレベルが違いますね
>>839 俺にはこう伝わったぞ
>プログラムで何かをする時に、元データ(略)の書き方制限して特定の形にしておくと便利っぽい
プログラムで完全に不定なデータ扱うなんて、考察にいたるとかいうまでもなく
無理だってわかりそうなもんだが、彼は今初めてそれに気づいたらしい
あと助詞と句読点の使い方がおかしいので、日本語が不自由な人だというのも伝わった
同意
たぶん頭も不自由なんだろう
そもDBに近いようなものってとどのつまりDBじゃねーの
簡易だろうがなんだろうがDBはDBでしか無いじゃん
あとPG作る時のクラスの命名規則とかいちいちDB作って登録する事は普通に有るので
無いでしょ?と問われたらNOとしか言えませぬ。
まあ一つ言える事は、どんな規則作っても
一番偉い奴がガッチリ管理し続けない限りなし崩しになるから
そんなとこに無駄な労力を割く必要無し。
ルールをプリントアウトして目立つとこに貼っとけw
なにはともあれ質問が漠然とし過ぎてて解んねーよ
仕事なら一緒になって真面目に考えるけどさ
もうちょっと具体例というか・・・あ、ここVBAスレだな。
仕様は自分で考えて、コーディングの段階になってからまた来てくれよ
846 :
デフォルトの名無しさん:2012/01/21(土) 10:32:17.82
ソースコードジェネレータ、つーか、テンプレート、みたいなのを作りたいのか?
ひな形に読ませる設定一覧が表になってて、表のレイアウト込みで自動で読ませたい
こんなかんじ?
やめとけ、出来ない事はないと思うがレスのやり取り見てると作った本人でも使えないモノしか出来そーにない
何でもかんでもExcelでやろうとする奴は例外なく馬鹿
848 :
デフォルトの名無しさん:2012/01/21(土) 12:32:23.74
定型的コードを一意に作るならできる。
例えばc言語のテーブルみたいなのを想定したシートにパラメータつっこめばテーブルに加工するのは容易。
同じように定型的コードの要素をならべてシートに整理。VBAで処理したら、典型的コードの亜種がつくれます。
用途は、テストコードの量産とか。
849 :
デフォルトの名無しさん:2012/01/21(土) 12:34:52.45
補足
典型的コードの構成部品はVBAコードに埋め込み。リファインはVBAを直接弄る。
>>844 エクセルの使い道って、プログラミング組めなくてmysqlとか使えない奴が使う
簡易なDB機能じゃなかろうか・・・
いちいち作るのが面倒ならエクセル使うと思うんだが
クラス名をDBに登録ってどんな規模ならやる羽目になるん?
そうか、お前はプログラミング組めなくてmysqlとか使えない奴なんだな
>>853 いちいち作るのが面倒ならエクセル使うと思うんだが
いちいち作るのが面倒ならエクセル使うと思うんだが
いちいち作るのが面倒ならエクセル使うと思うんだが
いちいち作るのが面倒ならエクセル使うと思うんだが
文章自体読めない奴が何をw
ほう、ならプログラミングできてDBも使えるって言うのかい?
データ=DB
という錯誤が、この話題ではまかり通っているように思える。
> データ=DB
は実は錯誤でもなんでもなく正しいんだけどね
少なくともExcelにおいてはね
さすがにCSVデータのみを以てDBとするのは正しくないが
Excelは昨今のDBソフトには遠く及ばないものの、DBとして本質的な
最低限の機能は備えているので、Excelのシート上にデータを置けば
それはDBと呼んでも何の差し支えも無い
むしろDBに対して、本質的なところではなく
後発の固有DBフォーマットや固有DBソフトの付随的な機能や規格を挙げて
「この要素を満たしてなければBDとは言えない」とか言ってる奴の方に錯誤がある
BDソフトメーカーの高機能戦略に踊らされすぎて、本質的なDBというものが見えてない
>>856-857 もちろんExcel表(上のデータ)は立派なDB足り得るぞ
だが、データ=DBが正しいなら、CSVデータも本質的に立派なDBだが?
すべてのデータがDBだというのはさすがに間違ってるだろうが
今回の話でのデータはまさしくDBといって差し支えないぞ
そのDBのデータをエクセルで扱うのに、フォーマット不定でできないかって言ってる
DBの本質とかDBソフトの本質とかスレ違いだしそっちは他所で議論してくれ
ここはExcelのスレだが?
XP Excel2000です。
Q.
For Each i In 範囲 〜 next iの文で
範囲を.Range("B1:B8")、("C1:C9")等といった形でまとめて記述し
B1,B2,B3…C1,C2,C3…と順番に処理させたいのですが
どう記述すれば良いですか?
↓自分で試して失敗したコト↓
範囲をVariant型で宣言し、変数A("B1:B8")、変数B("C1:C9")…を
範囲 = Array(A,B,C…)と代入して動作は確認できたのですが
For〜nextの変数iにSelect Caseの条件分岐をかけたらエラーになってしまいました。
とりあえずFor〜nextの処理を i.value = 10 にしてわかったことは
1つの記述が"B1:B8"でまとめて成されてしまうため
i = "" で値が入力されているかどうかで分岐させる条件と比較できないということでした。
B1,B2…C1,C2…と1セルずつ処理を進行させるにはどういう記述にすればいいでしょうか?
範囲を.Range("B1:B8")という記述で必要分だけ文をコピペすると文が長くなりますよね…
861 :
sss:2012/01/22(日) 06:34:50.26
列毎のループとセル毎のループの2段ループにすれば良いだけちゃうの?
Dim cols As Range, cell As Range
Dim ii As Long
For Each cols In Range("A1:E5").Columns
For Each cell In cols.Cells
ii = ii + 1
cell.Value = ii
Next cell
Next cols
>>861様
感動!.cellsや.columnsという記述でこんな簡単に制御できたのかwww
色々試したら希望通りの動作が確認できました。
これで記述のシェイプアップが捗りそうです!ありがとうございます!
ところで範囲が四角でククれない不定形の場合(Ctrl+左クリックで選ぶような)で
記述を簡略化する場合はどう書けばいいのでしょうか?
今考えついて動作確認できたのが、Array(A,B)配列を作って
For Each I In 範囲(数字).cellsとして数字=0からスタートし、
next iを越えたら数字=数字+1としてGoToで頭に戻るという記述なのですが
もっとスマートに書く方法はありますか?
865 :
sss:2012/01/22(日) 08:44:03.75
>>863 よう解らんがこういうことか?
For Each cell In [A1:C3,E2:G4,C6:E8]
ii = ii + 1
cell.Value = ii
Next cell
>>865様
ですです、そういう内容の時に範囲の部分を[A,B,C]というように
手前でsetした変数としての記述はできないのかな、という疑問です。
というのは、手元の環境でDim A As Rangeの
set A = range("A1:C3")等と変数記述すると
For Eachのところでオブジェクトが必要と怒られるのですが
その解決方法がわからなかったので…
変数記述しなければ動作するのはこちらでも確認できましたが
867 :
sss:2012/01/22(日) 09:39:04.98
>>866 つまりこういうことか?
Dim x As Range, y As Range, z As Range
Dim cell As Range
Dim ii As Long
Set x = Range("A1:C3")
Set y = Range("E2:G4")
Set z = Range("C6:E8")
For Each cell In Union(x, y, z)
ii = ii + 1
cell.Value = ii
Next cell
>>867神
感動した。正にその記述です。
詰まるところArrayじゃなくてUnionを使えば良かったのですね。
VBA一ヶ月目の俺にはさっぱり意味が全然わからないけどwこれから勉強させて頂きます。
.cellsとUnionよくわからんけどすごい!びっくり!
とりあえずネカフェの12時間パックが切れそうなので一旦お暇して夜また来ます!
一番ネックだった部分が解決して本当に嬉しい!
お付き合い頂きありがとうございました。感謝。
>>864 相手にするだけ無駄だろ
データを大量に詰め込めて検索できればDBなのにそれも理解してなそうだし
VB以前にVLOOKUPも知ってるか謎
> データを大量に詰め込めて検索できればDB
トンデモすなあ
> データを大量に詰め込めて検索できればDB
データベースというものを、大手の作るデータペースソフトとしてしか
見れてない奴からすると、トンデモ理論に見えるんだろうね。
データベースというものの本質を解っていれば、
実にシンプルかつ的確にデータベースというものを表現しているのだが。
メモ帳もDB
>>871 削除も、更新も不要なんだ、へぇ〜。
馬鹿すぎ。
あなたのVBA力を試しているのですが
データベースというものを、大手の作るデータペースソフトとしてしか見れてない奴なので
> さすがにCSVデータのみを以てDBとするのは正しくないが
というトンデモ理論が口をつくのだろう。
削除や更新や検索は DBMSのお仕事であって
データベースそのものじゃないとおもうが
悪態をつくことは出来るが反論できない負け犬が吠えてるw
削除も、更新も不要なんだ、へぇ〜。
(こんな事も知らなかった俺って)馬鹿すぎ。
こうだなw
>>877 君の言う「データベースそのもの」って言うのを明確にしてくれ。
何でもかんでもデータベースだと言うなら別に止めないけど。
>>879 なら、詰め込むのも不要だよな。
馬鹿だね。(w
882 :
877:2012/01/22(日) 14:30:17.06
集めただけでいいの?
あと、その意見だと「データ=DB」は間違いだよね。
884 :
877:2012/01/22(日) 14:55:39.32
集めたデータを提供するのがDBMSの仕事だって認識
885 :
877:2012/01/22(日) 15:04:01.39
ちょっと訂正
×提供するのが
○管理し提供するのが
>>884-885 じゃあデータだけ見ただけだと何も言えないということでいい?
つまり
「データ=DB」
「CSVデータも本質的に立派なDBだが?」
「データを大量に詰め込めて検索できればDB」
は、データの目的が書いてないので、DBと言い切るのはトンデモ理論ということでいいよね。
887 :
デフォルトの名無しさん:2012/01/22(日) 16:11:31.87
888 :
877:2012/01/22(日) 16:48:18.64
それらを どうしても"トンデモ理論にしたい"で 考えたらそうなるね
そのスタンスでいる限り平行線になるな どっちも
メンドイから抜けるわ
罵倒されるだろうけどあえて受けるよ
じゃ頑張ってね
>>877 そもそも構うだけ無駄だった
まぁ言った通りの低能ぶりだったろ
結局辞書で調べろと言っても分からない奴には何を言っても無駄
お前が辞書で調べろっていう
>>890 生徒のテストの点数をエクセルで管理してる全国の教職員に謝ったら?
うわーえらーい、すごーい
え、何?
お前の中では「エクセル表がデータベースかどうか」って話だったの?
さすが、レベルが違うわ〜
引数付きのプロシージャーを呼び出す時って、
Callの時は引数を括弧でくくって、Call付けない時は括弧を付けない。
と言うことでOK?
半分OK
>>888 無理やり引き分けに持ち込んだ気になって、自己満か。
まあ、理論的に返せないから、彼にとっては一番いい解決法なんだろうな。
>>897 複数のアプリケーションソフトまたはユーザによって共有されるデータの集合のこと。
複数のアプリケーションソフトによって共有されるデータの集合のこと。
複数のユーザによって共有されるデータの集合のこと。
この片方でも満たしていればデータベースと呼べるわけだが・・・
頭悪いの?広い意味では図書館すらデータベースなのにw
VBA力と回答力を試しているんですが
>>898 へぇ〜、ファイルサーバーで共有されているファイルは、全部データベースって呼べるんだ。
これまた、すごい珍説乙。
まだ
>>888 で止めときゃいいのに、馬鹿だねぇ。(w
>>900 馬鹿過ぎワロタw
>ファイルサーバーで共有されているファイルは
ファイルサーバーは
それと別人だから、お前と違って恥ずかしい勘違いしてるから仲間が居ない奴とは違うw
>>901 落ち着いてレスしろよ、なに言ってるのかわからん。
本人にもわかっているのか、怪しいけど。(w
>>902 日本人専用なの、チョンに合わせて書く事はできませぬw
ああごめん、反論できなくなるとチョンとか言い出すんだったんだよな。
わかりやすいね。(w
>>905 え゛っ、マジで
>>901 がまともなレスだと思っているんだ…、すごいな。
>ファイルサーバーで共有されているファイルは
ファイルサーバーは
> それと別人だから、お前と違って恥ずかしい勘違いしてるから仲間が居ない奴とは違うw
誰か、翻訳してくれ。
質問のある方、こいつらのワケワカメな話に付き合う必要ないから、どうぞ〜
DBを解ってる奴が2人しかいないなんて・・・
レコードの中にフィールドがあり、フィールドの中にデータが入っているのがデータベース
データベースの定義はたったこれだけ
検索だの抽出だのシステムかどうのとかいうのはまた別の話
そもそもDBとDBMSの区別ができてないやつがいるな
一般論で言えばデータが集まってれば何でもデータベースだよ
一連のスレをざっと見て目に付いた単語を並べると、図書館、ファイルシステム、CSV、エクセルのシート、みんな正解
メモ帳はアプリだから違う。カテゴリー分けするなら、DBではなく、極めて原始的なDBMSの方に入る
それをどう使うか、効率、使いやすさ、規模ってのはまた全然別の話。検索だの削除だのもみんな運用側の話だわな
昼過ぎはDB理解してる奴が一人も居ない件について
エクセルのデータをIEにVBAで転記していますが、ボタンを押して、
データが正しいときと、間違っているときでは開かれるサイトが違います。
そこで処理が正しければ、EXCELのその行のA列に"OK"といれて
ダメなら"Error"とでも入れたいのですが、
そのIE上の処理が正しいかどうかを判別する方法ありますか?
例えば、ボタンを押した後に出てくるアドレスとかがEXCELに取得できれば
判別できるのかと考えていますが、そんな方法ありますか?
お願いします。
>>906 >ファイルサーバーで共有されているファイルは
ファイルサーバーは
↑これは、「データの集合」から「データ」に勝手に解釈変えて何言ってるの?馬鹿なの死ぬの?
>まだ
>>888 で止めときゃいいのに、馬鹿だねぇ。(w
それと別人だから、お前と違って恥ずかしい勘違いしてるから仲間が居ない奴とは違うw
これは勝手に同一人物認定してるんじゃね〜
ファイルサーバーがデータベースじゃないとか恥ずかしい勘違いしてる奴と違って、
論理破綻してね〜から同一人物の可能性がどれだけ少ないと思ってるんだ?この低能がw
馬鹿過ぎワロタw
↑これは、教えてもらえてるのに自分の知らない知識は間違ってる事にしたい君の全てのレスに対して
こんな感じ
>>912 いくらでも出来るけどスレ違い
ここはマクロ言語で「Excelを操作する」ことに関してのスレで
他のアプリを操作したりデータを取ったり渡したりは管轄外
議論ですらないから反論なんてあるわけないね
アプリ起動時にユーザフォームだけ出す方法として
Application.Visible = Falseがありますが、
これだと2つ以上ブックを開いていたときも全部非表示になってしまい都合がわるいです。
非表示させたいブックを指定する方法はないでしょうか?
ひとつのアプリ(Excel)で二つのブック開く場合は無理だろ
関連付け変えて、ブックを開くたびに新しいExcel開くようにしな
多少多めもメモリ食うが、昨今のどころかここ数年くらいのPCなら
Excelを10個や20個起ち上げたところでメモリ不足になんかならないし
タスクボタンもグループ化出来るからさほど邪魔にならないはず
つーかさ、ユーザーフォームだけ使いたいなら、わざわざExcel使わないで普通の開発環境使えば?
VBAと完全互換のVB6は有料な上にとっくに終了してるが、オクで1/10以下の価格で出回ってるし
互換性の高いActiveBasicとか、そこそこ互換性のあるVB.NET(VB2010)とかは無料で使えるし
HTA+VBScriptなんて手もあるし
>>917 アドバイスありがとうございます。
たしかにユーザーフォームだけ使うのであればエクセルである必要がないですね。
919 :
デフォルトの名無しさん:2012/01/23(月) 02:50:45.17
>>912 ↓こんなんですか?
Sub Test()
Dim MyObj As Object
For Each MyObj In CreateObject("Shell.Application").Windows
If MyObj.Name = "Windows Internet Explorer" Then
Exit For
End If
Set MyObj = Nothing
Next MyObj
If MyObj Is Nothing Then
MsgBox "IE が起動してないよ"
Else
MsgBox MyObj.LocationURL
End If
Set MyObj = Nothing
End Sub
見当違いの回答だったらごめんね
>>919 >MyObj.LocationURL
これできました。ありがとうございます。
921 :
デフォルトの名無しさん:2012/01/23(月) 09:29:03.86
以下は,配列に入っているデータを入れ替えるプログラムです
(配列xを引数として入れ替える関数subprogramに渡している)
(a)値呼び出しの場合,配列xと配列yの値はどのようになるか?結果だけでなく引数を渡す過程も含めて詳しく説明せよ.
(b)参照呼び出しの(ByVal を ByRefに変えた)場合,配列xと配列yの値はどのようになるか?結果だけでなく引数を渡す過程も含めて詳しく説明せよ.
Sub main()
Dim x(5) As Integer
x(0) = 10: x(1) = 20: x(2) = 30: x(3) = 40: x(4) = 50: x(5) = 60
Call subprogram(x())
For i = 0 To 5
debug.Print x(i)
Next
End Sub
Sub subprogram(ByVal y As Integer)
Dim i As Integer
For i = 5 To 1 step -1
y(i) = y(i- 1)
Next
End Sub
助けてください。
923 :
デフォルトの名無しさん:2012/01/23(月) 10:30:44.83
>>899 コラ
それはオレが広めたセリフであり
オレだけが使うことを許されたセリフだ
もし使いたいならオレの了承を取ってからにしてくれ
最初に使ったのは俺だぜ
使いたいならまずはお前が俺の承諾を取れ
925 :
923:2012/01/23(月) 11:25:08.87
のびたのくせに生意気だ
ところでVBAで配列をByValで渡すと、スタックに大量のデータが積まれるの?
それともデータ領域を複製してポインタを渡すだけ?
>>923 使うのがお前だけって事は全く広まってなくね?
>>926 データを複製してポインタを渡すだけ。
VARIANTとSAFEARRAYを使って実装されてるっぽいし。
929 :
デフォルトの名無しさん:2012/01/23(月) 22:19:20.89
930 :
デフォルトの名無しさん:2012/01/23(月) 22:23:00.95
>>910,
>>913 *.wav って、PCM データが集まってるよな。
それを共有したらデータベースって言うわけだよな。
すごいよ、お前ら。
さすがにあほすぎて太刀打ちできんわ。(w
もう・・・ノーサイドにしましょうよ・・・。
>>931 本当に残念な奴だなお前はw
データを特定の形で整理した
「データの集合」がまず有って、
それを複数のユーザーで使いまわす事が出来る状態になってれば
それはもう立派なデータベースだと・・・
PCMデータを一個ずつ抜き出して意味の有る物の単位になるのか?
いい加減謝れよ、てかその屁理屈考えるのにどのぐらいかけたの?w
>>933 >データを特定の形で整理した
おや?
>>898 には、一言も書いてないんだけど、そんな条件。
後出しじゃんけん乙。
ちなみに、PCM データは時系列に音の大きさを特定のビット数で並べると
言う形で整理されてるし、一個ずつ抜き出せばその時点の音の大きさと言う
意味のあるデータになる
もちろんファイルサーバーなり、P2P で複数のユーザーから使いまわすことが
でぎる状態にできるし。
て言うか、複数のユーザーとか何回もアホみたいに書いてるが、一人で使う
データベースと言うものの存在も知らないのか?
例) 自分の蔵書を自分が見るためだけにデータベース化してる奴など。
> どのぐらいかけたの?
「データの集合」と言う言葉から *.wav ぐらいはすぐ思いつくと思うが、
もしかして必死に考えないと思いつかないの? (w
>>934 丸一日レスが無かったから顔真っ赤にして必死に考えてたんだと思ったよw
>データを特定の形で整理した
>>869で検索できればと言っているわけだがw
検索、再利用、何かの指針にできるここまで分かってれば特定の形で整理されて無いとDB足りえないと分かるよなw
後出しではなく、君が低能なだけだねww
それと君の言ってるwavの話なんてそもそもDBじゃないでしょww
アルファベットの定義があるから、アルファベットの意味不明の文字列がDBになるなんて
誰も言ってないわけだがwww
>「データの集合」と言う言葉から *.wav ぐらいはすぐ思いつくと思うが、
>もしかして必死に考えないと思いつかないの? (w
わざと間違った方向に考える為に知恵を絞ったんじゃないの?w
真性の低能だからそういうのがパッと思いついたの?w
ブルドック.wavとチワワ.wavとドーベルマン.wavを集めたら
立派な鳴き声データベースですが?
データベースの定義はたった一つだけ「データの集まり」であること
補足すると、データの種類は問わない、集めた個数も問わない
定義の中にデータの種類や個数を限定する言葉は一切出てきてないんだから当たり前だね
つまり、PCMデータを集めてもいいってこと
ではここで問題
PCMデータを集めたwavファイルはデータベースか?
ヒント データが集まってればそれはデータベースだよ
wavファイル一個でデータベースとか暴論すぎだろw
おはよう
こんにちは
こんばんは
こんな感じで三つあればデータベースだが
おはよう
これ一個だけを
”お”・”は”・”よ”・”う”
こう分けられるからデータベースだとか酷過ぎるだろw
誰がこんなゴミデータ再利用するの?w
データ・ベース
http://dictionary.goo.ne.jp/leaf/jn2/198592/m0u/ ベースの意味を学習しなさいw
PCMデータの一覧とかならデータベース足りえるが・・・
wavで使われる一つ一つのPCMに意味なんかないだろ?w
ゴミの集合じゃデータベースとは言えないんだよ
意味のあるデータの集まりである必要がある
Microsoft Accessでテーブルを作り、無意味な16bitのデータをどんどん入れていきました
入っているデータに意味がないのでこれはデータベースではありません
これは○か×か?
上の問いで作成した、無意味なデータの入ったAccessのファイルを別の人に見せました
内容が何かは伝えていません
このファイルを見た人はこれをデータベースだと思うでしょうか、違うと思うでしょうか
>>935 >丸一日レスが無かったから顔真っ赤にして必死に考えてたんだと思ったよw
すごいなぁ、昼間に働くとか学校に行くとかの概念がないんだ…
>
>>869で検索できればと言っているわけだがw
はぁ? そのレスが君のレスで
>>898 に関連しているとエスパーしろと? ばかじゃゃねーの?
> 検索、再利用、何かの指針にできるここまで分かってれば特定の形で整理されて無いとDB足りえないと分かるよなw
> 後出しではなく、君が低能なだけだねww
検索、再利用、指針? どんどん後出しされるねぇ。
自分が
>>898 で「この片方でも満たしていればデータベースと呼べるわけだが・・・」って書いたことを忘れたのかなぁ? (w
>それと君の言ってるwavの話なんてそもそもDBじゃないでしょww
そりゃそうだよ、DBじゃない例出してるんだから。
でも、君の
>>898 の定義は満たしてるだろ?
>アルファベットの定義があるから、アルファベットの意味不明の文字列がDBになるなんて
>誰も言ってないわけだがwww
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
>わざと間違った方向に考える為に知恵を絞ったんじゃないの?w
ひょっとして、自画自賛?
>真性の低能だからそういうのがパッと思いついたの?w
そういう、自己紹介はいいから。
ぷ
ぷ。←ボウリングしてる人
944 :
デフォルトの名無しさん:2012/01/24(火) 10:21:26.30
>>938 wavファイル一個でも、異なる複数の音声が入っていて、
それがユーザーにとって意味あるものでかつシークとかで
検索できるものであればDBと言えるんじゃない?
「おはよう」はこれ一個だけがユーザーにとって意味あるもので
あって、一文字づつ分けるひつようないし、
「おはようこんにちはぽぽぽぽーん」とかのデータから
単語を抜き取るルールがあればDBなんじゃないの
どっちかってとそのインデックスがデータベースなのでは?
946 :
デフォルトの名無しさん:2012/01/24(火) 13:42:31.73
ここでは例えとして、インデックスではなくて、
I/OをDBMSが担っているということにしてはダメ?
そろそろVBAの話しろよ
948 :
デフォルトの名無しさん:2012/01/24(火) 15:30:28.97
いつまでDBの話してんですか。ちょっとした質問でも すれ違いだと言って回答しないのに。
>>941 >すごいなぁ、昼間に働くとか学校に行くとかの概念がないんだ…
すごいなぁ、真性のコミュ障が社会に出てると思われるとでも?w
それとも君のレスを見てコミュ障だと思われないとでも?w
検索、再利用、指針≒複数人数での使いまわしの必要条件
まぁ脳みそ腐ってる奴に言っても無駄なんだろうけどw
951 :
デフォルトの名無しさん:2012/01/24(火) 21:34:50.36
上司「12345−6789=の答えを33333になるにはどうすればいいか考えてきて^^」
俺新入社員の営業職でエクセルを使うよりも商品知識を付けたいのにエクセルの関数の問題出された
おまえら助けろ下さいおなしゃっす
952 :
デフォルトの名無しさん:2012/01/24(火) 21:36:16.60
あれ、スレ違いだったかな
エクセル総合にいってきます
if a = 5556 than a = 33333
シートを削除する際に
Sheets("シート名").Select
ActiveWindow.SelectedSheets.Delete
と普通にマクロの記録で書くと、
「選択したシートに、データが〜〜[削除]をクリックしてください]
というメッセージがでますが、それを出ないようにするか、
自動に[削除]をクリックすることはできますか?
検索してから質問しろ
>>954 Application.DisplayAlert = False
>>955 うぜぇバカヤロウは消えろ
みんながちゃんと検索するようになったら俺の存在価値がなくなっちゃうだろ!
とか思ってるのかな〜
質問です
RangeからCellsをFor Eachで取り出した時の順番は左上から右に向かうというのは保証されてるんでしょうか?
ヘルプかどこかに明記されていますか?
>>958 MSDNだったかヘルプだか忘れたが、どこかで保証されないと書いてあるのを見た記憶があるが、実際は決まった順序だろ?
二次元配列に取り込めば、縦方向が先になるけど。
>>958-959 Rangeの取り方しだいかもよ
単純な矩形の領域だと左上から横行って下に行くけど、
不定形の領域を指定するとそうじゃなくなった。
たとえば
For Each Cell in Application.Union(Range1,Range2)
だとRange1から先に処理するんで、
Range2の方がRange1より左上にあると全体としては左上からじゃなくなる。
>>958 おれが見てるのは2010のヘルプだけど、
「For Each...Next ステートメント」の所にある
「コレクション」のリンクにある記載でどう?
そもそもVBAのFor Eachって、順序保障してくれてるものなのか?
メモリによるんじゃね
>>950 反論できなくなったので、人格攻撃?
実にわかりやすい。(w
コード4桁の数値プラス "-M" 及び "-W"のシートがあり、それを
新しいブックを作りそこに移動させようとしています。
それでマクロの記録で
Sheets(Array("5541-W", "5541-M")).Select
Sheets("5541-M").Activate
Sheets(Array("5541-W", "5541-M")).Move
というのができたんで、それを直して
array_string = sc & "-W," & sc & "-M"
Sheets(Array(array_string)).Select
Sheets(Array(array_string)).Move
.Select のところで←インデックスが有効範囲にない
というエラーが出ます。
どのように直せば良いんでしょうか?
>>965 それだと、"5541-W,5541-M"になってしまうな。
Array(sc & "-W", sc & "-M")
このように、Array関数の個々の引数になっている事が重要かと。
>>966 深夜にお付き合いいただきありがとうございます
エラーも直りました。
968 :
デフォルトの名無しさん:2012/01/27(金) 00:13:20.74
ADOで取得したデータ20万件を、65000行単位で複数シートにすべて出力したい場合
"CopyFromRecordset dbRes 65000"という風に書いてループさせているのですが、
2枚目以降の出力になると途端重くなります。
他に高速コピーできる手段はありますか?
>>968 画面の書き換え、再計算、イベント、全部切ってる?
あとExcel2010に乗り換えれば分割する必要なくなるよ
CopyFromRecordsetか忘れたけど、知る限りDBからの貼り付けではそれが一番高速。
その場合、貼り付け行数分ずつの取得になると思う。
答えになってないけど何やったか書いてくれないと答えようがないなぁ
書いてあった!ゴメン!
Excel VBAから、ワードを開いて文書を加工するとこまで一気に処理したいです。
@Excel VBAから開いたワード文書についているマクロ呼び出して実行させることは可能でしょうか?
Aもし@がだめなら、Excelでワード文書をWordマクロと同じようなことをさせるマクロが可能でしょうか
(または、コマンドが詳しく書いてあるサイトを教えてください。
具体的には、以下のWordマクロをエクセルVBAで記述したく。
1.Selection.Paste ・・・エクセルVBAでクリップボードに入れたのを貼り付け
2.Selection.Find.ClearFormatting ・・・文字列AAAAが書いてある行探す
With Selection.Find
.Text = "value=""AAAA"""
:
End With
Selection.Find.Execute
3.Selection.MoveDown Unit:=wdLine, Count:=7 ・・・文字列AAAAから、先頭行まで削除
Selection.HomeKey Unit:=wdStory, Extend:=wdExtend
マクロのブックを外部から開いてマクロを実行する時にコマンドライン引数の様に
引数を渡すのにVBSを使うやり方がありますが、WIN7(32bit)&EXCEL2010の組み合わせでも
可能でしょうか?
可能な場合その時に使うAPIの名前や構造はXP(32bit)と同じでしょうか?
もしくは、簡単にコマンドライン引数を受け取るやり方はありますでしょうか?
当方、XPとEXCEL2003しかなく現地作業をしなくてはいけないので情報を御願いします。
>>973 別のBookからパラメータ付きでそのマクロブックのマクロを実行するのでは駄目なの?
>>975 レスありがとうございます。
別のマクロブックを用意して、そのブックで外部プログラムからのパラメータを受け取って、
目的のマクロを起動すると言うことでしょうか?
多分、私にはハードルが高そうな感じがします。
VBSに目的のマクロブックを起動するスクリプトを書いて、必要なパラメータを
渡すやり方は何度かやったことがあるので、この方法を採用しようと思ったのですが、
win7とexcel2010を扱ったことがないので質問しました。
>>964 検索、再利用、指針≒複数人数での使いまわしの必要条件
議論ですらないから反論なんてあるわけないね
↑これ無視してる都合の良い脳みそだから人格攻撃位されるだろw
>>977 >指針≒複数人数での使いまわしの必要条件
>>934 > て言うか、複数のユーザーとか何回もアホみたいに書いてるが、一人で使う
> データベースと言うものの存在も知らないのか?
> 例) 自分の蔵書を自分が見るためだけにデータベース化してる奴など。
わざわざ例まで書いてあるのに、アホ過ぎ。
>>978 基本複数人数で使う物だけどなw
同じシステムで作るから、名前そのままにしただけだろ
で、他に何かいえる事有るの?てか、別に複数人で使わないでも言うってURLまで
貼ってこっちから示してるわけだがw
そんなんだからコミュ障言われるんだよ
>>979 指摘されたら 「基本」とか、アホ過ぎて議論にもなってない。
> 別に複数人で使わないでも言うってURLまで
> 貼ってこっちから示してるわけだがw
示してるレス番書いてみな。