Excel VBA 質問スレ Part22

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
2デフォルトの名無しさん:2011/11/27(日) 22:37:24.79
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
4デフォルトの名無しさん:2011/11/27(日) 23:19:04.69
>>1
5デフォルトの名無しさん:2011/11/27(日) 23:22:10.17
>>1
前スレの最後はうんこくんが荒らして大変だったねw
ILの直腸注入だったっけ
6デフォルトの名無しさん:2011/11/27(日) 23:27:38.33
まだ、粘着してるよ。

スルー推奨 >> 各位
7デフォルトの名無しさん:2011/11/27(日) 23:28:32.99
愛の直腸注入に付いては俺も聞きたいが
また荒れるからやめとけ
8デフォルトの名無しさん:2011/11/27(日) 23:55:43.05
名前って値が増えても自動で拡張できないけどこれVBA使えばできるよね
やり方教えてくれ

  A
1 100
2 200
3 300

ここで、A1〜A3に「表1」という名前をつける
つぎにA4に、400という数値を入力すると
A1〜A3の範囲だった「名前:表1」が自動的に「A4」まで拡張される

みたいなことやりたいんだけどどうやればいい?
9デフォルトの名無しさん:2011/11/28(月) 00:20:00.95
セルの入力イベントで
名前の範囲をカレントリージョンのものに付け直せば?
10デフォルトの名無しさん:2011/11/28(月) 00:31:53.27
>>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"))
というアドバイスをいただいたのですが、この一文を経過したあとで、

ファンクションプロシージャで定義された語句を使うとエラーか、上手く作動しなく
なってしまうのですが、なにかそのようなルールがあるのでしょうか?
12デフォルトの名無しさん:2011/11/28(月) 07:25:32.21
質問です。
Offset(,1)とOffset(0,1)ではどちらが一般的でしょうか?
13デフォルトの名無しさん:2011/11/28(月) 07:30:48.54
>>11
うーん。
状況が見えないから何とも言えないけど、
@何か別に理由がある。
A合計対象セル範囲に足せない文字列とかが含まれている。
B合計対象セル範囲がシート枠を超えている。
CILとの直交性
あたりが原因なんじゃないかな。
14デフォルトの名無しさん:2011/11/28(月) 07:39:44.44
>>12
そこを省略しちゃうと、Offset知らない人に
NullやVbNullString辺りが入ることが許されるのか、
勝手に0が入るのかコードから見て取れないから、
前者は余り一般的とは呼べないと思う。
一般的、可読性が高いのは後者じゃない?
15デフォルトの名無しさん:2011/11/28(月) 11:15:08.97
>>12
俺は0は書かないな。
こんな簡単なものに可読性もへったくれもないと思うし。
ところで省略を嫌う人ってResizeで
With Range("A1").Currentregion
  .Resize( ,2)
End With
これを下のように略さずに書くのかな?
With Range("A1").Currentregion
  .Resize(.Rows.Count ,2)
End With
16デフォルトの名無しさん:2011/11/28(月) 11:30:47.07
>>8
Excelのバージョンは?
2007以降ならテーブル(構造化参照)使えばいいんじゃないの?
17デフォルトの名無しさん:2011/11/28(月) 12:16:00.19
「仕事に役立つ ExcelVBA実用サンプルコレクション」の本は大人気。
amazonの中古で売れに売れて、もう高額の出品者からしか買えなくなりました。
すでにレアものです。
18デフォルトの名無しさん:2011/11/28(月) 13:15:28.02
>>12,14,15
一般的って意味が、どう書く人が多いかって話なら
Offset(,1)やResize( ,2) って書く人が多いと思う
可読性に関して言えば、省略しない方が高いのはたしかではあるが
どっちにしろOffsetやResizeが何をするか、引数は何かが解らないと使えないので
大差がないと言えばまあその通り
だがたとえばこの例だと、Offsetは省略した値は0だけど、Resizeは省略した値はゼロではない
俺ならOffsetは0であることを明示的に示しときたいので省略しない
Resizeは変更しないことを明示的に示しときたいので、あえて書かない
19デフォルトの名無しさん:2011/11/28(月) 17:53:47.27
>>17
新装版あるけど
2017:2011/11/28(月) 19:39:03.82
>>19
新装版のことを言っておるにょだ
21デフォルトの名無しさん:2011/11/28(月) 21:54:24.65
Dim s(0) as String
s(0) = "aaa"
Debug.Print s(0)
これがなぜ通るのか理解できません。
22デフォルトの名無しさん:2011/11/28(月) 22:08:26.22
>>21
どこがどう問題だと思うの?
23デフォルトの名無しさん:2011/11/28(月) 22:15:17.18
>>22
どこがどう問題と思ってると思う?
24デフォルトの名無しさん:2011/11/28(月) 23:29:09.18
>>23
C言語に置き換えたらなんとなくわかるんじゃないか?
25デフォルトの名無しさん:2011/11/28(月) 23:32:05.60
C言語の配列は個数を指定する
VBAの配列はインデックスの最大値を書く

Dim s(1)だとs(0)とs(1)の2個になる
26デフォルトの名無しさん:2011/11/28(月) 23:32:32.36
>>17

つい、今確認したけど、普通に、Amazonで定価で買えるよ。
Amazonでは、常に人気書籍を定価以上の価格で出品している業者が張り付いている。

普段は売れないけど、たまたまAmazonの在庫が切れたときにアクセスして、、
「まずい、もうレアものになってしまったんだ」って勘違いして買う人が居るからだって。
27デフォルトの名無しさん:2011/11/29(火) 00:42:34.48
>>26
そうでしたか。
それはすばらしいです。

ところでVBAじゃなくExcelの関数のほうも
こういうサンプルがた〜くさん載ってる実用的な本は
ないものでしょうか?
28デフォルトの名無しさん:2011/11/29(火) 07:58:26.67
>>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
曲はここから入れ子にしたいのだけど、最初の曲が流れない・・・
30デフォルトの名無しさん:2011/11/29(火) 19:15:51.93
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をクリックで消すのでこの処理だけど
   もっとスマートにならんかのー。
32デフォルトの名無しさん:2011/11/29(火) 21:39:18.52
ファイル名を配列に突っ込んでおけばいいじゃない。
んで、ループで回して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
34デフォルトの名無しさん:2011/11/29(火) 21:45:14.47
Cellsの出所が怪しいな。
35デフォルトの名無しさん:2011/11/29(火) 22:53:27.13
>>33
標準モジュールに書いてれば糞コードだけど一応それで動くはず。
Sheet2以外のシートモジュールに書いてあればRangeとCellsの親(シート)が違うので動かない。
正しくは
Sub SetRows()
With Worksheets("Sheet2")
  .Range(.Cells(2, 2), .Cells(5, 5)).EntireRow.Value = "hoge"
End With
End Sub
とCellsにもシートの修飾をつける。
36デフォルトの名無しさん:2011/11/29(火) 23:39:35.49
>>35
なるほど、なるほど
ありがとうございます!!

Sheet2以外のシートモジュールに書いてます。

インターネットのサイトを見て勉強し始めた段階なので
糞コードなのは申し訳ないです。

勉強になりました!
37デフォルトの名無しさん:2011/11/30(水) 22:44:11.50
VBAの入力補完機能だっけ?(Ctrl+Spaceのヤツ)

自分で定義したConstなどなどが
入力補完されることに今更気がついた。

しかも標準モジュールにつけた名前なんかも
入力補完の対象なのね。

処理時間は落ちるかもしれないけど、
標準モジュール名.モジュール名〜などで
明確に定義付けすると意味が通ってメンテが楽になりそう。
38デフォルトの名無しさん:2011/12/01(木) 10:32:45.43
VBAからデスクトップ上などになるtxtファイルの中身を操作(文字列の追加・書き換え・削除)することは可能ですか?
39デフォルトの名無しさん:2011/12/01(木) 13:45:12.97
可能
4038:2011/12/01(木) 15:48:27.73
どうするのかを聞いておるのだ、アホ
41デフォルトの名無しさん:2011/12/01(木) 15:53:42.14
>>40
VBAでそういうコードを書けば良い
OK?
42デフォルトの名無しさん:2011/12/01(木) 16:48:51.03
>>38 は可能かどうかを聞いてるだけだが? アホ?
43デフォルトの名無しさん:2011/12/01(木) 22:06:18.25
ここはあえてOPENステートメントを推してみる。
How meny files? な世界も偶には良いよね。
44デフォルトの名無しさん:2011/12/01(木) 22:28:00.06
Windows Script Host Object Modelへ参照設定して
Dim DesktopPath As String
Dim ShellObject As IWshRuntimeLibrary.WshShell

Set ShellObject = New IWshRuntimeLibrary.WshShell
DesktopPath = ShellObject.SpecialFolders("Desktop")

これでデスクトップのパスは得られるから、後は好きなようにやればよろし
45デフォルトの名無しさん:2011/12/02(金) 00:53:27.34
FileSystemObject使ってファイルパスとってきてそれを開いてあなた色に染めてから閉じる
46デフォルトの名無しさん:2011/12/02(金) 12:00:59.07
テキストファイルに色を付ける方法kwsk
47デフォルトの名無しさん:2011/12/03(土) 11:02:53.92
そういうのスレ違いって>>2に書いてあるよ
4846:2011/12/03(土) 11:15:11.77
そんなこと言わずに教えれ
49デフォルトの名無しさん:2011/12/03(土) 15:46:49.14
50デフォルトの名無しさん:2011/12/04(日) 00:43:59.63
 ̄ ̄ ̄ ̄ ̄ ̄ ̄l/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
     ∧_∧
    ( ´・ω・`)     ∧_∧
    /     \   (    )何言ってんだこいつ
.__| |    .| |_ /      ヽ
||\  ̄ ̄ ̄ ̄   / .|   | |
||\..∧_∧    (⌒\|__./ ./
||.  (    )     ~\_____ノ|   ∧_∧
  /   ヽ 空気読めよ   \|   (    )
  |     ヽ           \/     ヽ. オマエ馬鹿だろ
  |    |ヽ、二⌒)        / .|   | |
  .|    ヽ \∧_∧    (⌒\|__./ /
51デフォルトの名無しさん:2011/12/04(日) 03:36:25.49
VBAで日付のシリアルの変数はIntegerで保管しておいて良い?
あるいはLongにしないとだめ?
あらまDate型もあるのね。絶対にDateにしないとだめ?
52デフォルトの名無しさん:2011/12/04(日) 08:00:58.14
>>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

これ結果は同じですよね?どちらがどういう理由で好ましいですか?
56デフォルトの名無しさん:2011/12/04(日) 11:23:59.67
>>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みたいなのがダミーで入ってるの?
逆の場合も疑問。(時間を代入したときは日付も入ってる?もしそうならそのときの日時は?)
59デフォルトの名無しさん:2011/12/04(日) 14:25:25.95
やりたいようにやれよ
いちいち他人に聞いてたら
出来るもんも出来んよ
60デフォルトの名無しさん:2011/12/04(日) 17:33:23.31
>>58
> あと、date型に日付だけを代入して使ってるときって時間の情報もたとえば0:00:00みたいなのがダミーで入ってるの?
> 逆の場合も疑問。(時間を代入したときは日付も入ってる?もしそうならそのときの日時は?)

なぜ試さん?
6158:2011/12/04(日) 17:38:50.35
みんなのVBA力と回答力を試しているんですが
62デフォルトの名無しさん:2011/12/04(日) 17:45:44.12
>>61
VBA力とか言ってる時点でみんなより自分が格下なのに気付けよ
6358:2011/12/04(日) 18:27:48.04
わからないなら無理にレスしてくれなくていいよ?
6458:2011/12/04(日) 19:36:00.70
>>63
こら、それはオレのセリフだ
ニセモノめが
65デフォルトの名無しさん:2011/12/04(日) 21:03:36.56
ここまでおれのじえん
66デフォルトの名無しさん:2011/12/04(日) 21:15:48.15
ツマンネ
67デフォルトの名無しさん:2011/12/05(月) 15:49:51.74
セルに色が塗ってて、
その色をRGB(x,y,z)で表すときのx,y,zの値を取得するにはどうすればいい?
68デフォルトの名無しさん:2011/12/05(月) 15:59:54.97
>>67
C = Range("A1").Interior.Color
R = C And &HFF
G = (C \ &H100) And &HFF
B = (C \ &H10000) And &HFF
69デフォルトの名無しさん:2011/12/05(月) 23:11:21.16
スレ違いでしたらごめんなさい

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
71デフォルトの名無しさん:2011/12/05(月) 23:54:05.05
>>69
> Excelでオークションのシミュレーションができそうだ、ということを知った

どこで知ったのか知らんけど、そこで聞けよ。
72デフォルトの名無しさん:2011/12/06(火) 00:19:38.14
>>71
それはExcelでシミュレーションをできるということを知って、自分のやろうとしてることも恐らくできるだろうと判断しました

どこかの掲示板で聞いた、というわけではないんです
73デフォルトの名無しさん:2011/12/06(火) 00:25:40.24
>>72
> Excelでシミュレーションをできるということを知って

だから、どこで知ったんだよ。
て言うか、他人と会話したことないのか?
74デフォルトの名無しさん:2011/12/06(火) 01:00:52.64
>>69
まずオクのシミュレーションはどんな作りにしたいのかをフローにして、
その後VBAでどう言ったコードにすればいいかを
考えればいいんじゃないかな
75デフォルトの名無しさん:2011/12/06(火) 01:21:45.52
>>74
何から手を付ければいいかわからなかったので、とても参考になりました

ありがとうございます
76デフォルトの名無しさん:2011/12/06(火) 12:27:07.14
ネットワーク上の共有フォルダにアクセスしたいんですが
VBAからネットワーク認証を行うにはどうすればよいのですか?
7767:2011/12/06(火) 13:35:25.49
>>68
あなた頭いいですな
脳ミソ詰まってる
わたしにも分けてくれ
78デフォルトの名無しさん:2011/12/06(火) 21:38:46.64
別シートを操作するとき、そのシートをactivateしないとできないんだっけ?
でもできることもあるみたいだし。
でもそれを忘れてるか気にしないでいるとエラーが出ることもある。

どなたかこのしくみはどうなってるか教えてくれませんか?
非常に困っております。
79デフォルトの名無しさん:2011/12/06(火) 21:55:14.09
Excelで実際に操作するのと同じ様に使えばほぼ問題は無い。
でも、同じ操作で無くてもある程度は融通が利くよ。
って感じじゃね?
うまく動かなくて困ったら実際の操作を真似させる、で十分かと。
深く悩んだところで、MSの中の人すら完全に理解しているかどうか怪しいし。
80デフォルトの名無しさん:2011/12/06(火) 22:39:11.97
>>78
特定のシートオブジェクトを明示的に取得して、activate せずに、そのシートに対して操作することは可能
activate しないと使えない機能もあるが、どちらかというとレアじゃないかと思う

問題はマクロの記録とかで記録したコードについては activate前提のコードの書き方になっているということで、
記録したコードをそのまま使い回したいなら、アクティベートしたほうが無難だとは思う
81デフォルトの名無しさん:2011/12/06(火) 23:47:01.44
個人用マクロブックを作ったら
Excelを[X]で閉じようとしたときに
2回ボタンを押さないといけなくなりやがった。

これを防ぐ方法ある?
82デフォルトの名無しさん:2011/12/07(水) 06:47:38.01
最近vbaの勉強始めた
大村あつしさんの参考書使ってる
4月までには使えるようになりたい
プロ野球の選手成績を管理したいんだ
野球ゲームの成績まとめでも使いたいし
83デフォルトの名無しさん:2011/12/07(水) 08:39:20.32
>>81
なんてメッセージ出てんの?
84デフォルトの名無しさん:2011/12/07(水) 19:26:41.10
>>83
メッセージはなにも出ないんだ。
みんなも個人用マクロブックを作ってたらそうなってるんでしょ?
85デフォルトの名無しさん:2011/12/07(水) 19:27:27.27
86デフォルトの名無しさん:2011/12/07(水) 20:52:36.60
>>78
activateしないとできないのは、copyメソッドとかpastespecialメソッドとかでしょ
他にもあったっけ
なぜできないのか、この辺の理屈がどうも分からないんだよな〜
87デフォルトの名無しさん:2011/12/07(水) 21:12:04.89
Pasteメソッドが、シートに対して行うというのも理解できない。
なぜそういう仕様になってるかおわかりのかたいらっしゃいますか?
88デフォルトの名無しさん:2011/12/07(水) 23:17:29.91
お知恵を拝借させてください。
下のように右クリックメニューから選択範囲のセルを塗りつぶす、みたいなことがしたいのですが、
「引数は省略できません。」のエラーになります。
どうすれば引数(例: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
89デフォルトの名無しさん:2011/12/08(木) 00:05:42.28
>>88
パージョンいくつ?

.OnAction = "'setColor(34)'"
又は
.OnAction = "'setColor 34'"
じゃないかな?(シングルクウォートで括る。)

ちなみに複数の引数を渡したい時は、自分の知ってる限りでは
.OnAction = "'setColor 34,4'"
とかでうまくいくハズ
90デフォルトの名無しさん:2011/12/08(木) 02:25:45.46
>>87
仕様の理由はわからんけど、動作見る限りエクセルVBAって
人が操作する動作をトレースしてるだけだから
手動で出来ないことはVBAでも出来ないってコトでいいんじゃね?

だからコピーもペーストもシートをアクティブにしないと出来ないと。
91デフォルトの名無しさん:2011/12/08(木) 09:27:07.74
>>90
VBの機能も使えるから出来ることは同じじゃない
92デフォルトの名無しさん:2011/12/08(木) 12:48:05.58
>>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はあるのにな

どうせ操作対象をちゃんと指定してないから、アクティブシートが対象になってるだけだろ
アクティブじゃないとできない操作の実例教えてくれ
93デフォルトの名無しさん:2011/12/08(木) 14:00:27.28
Activateが必要だと思ってる奴はド素人
94デフォルトの名無しさん:2011/12/08(木) 19:50:51.44
どうせExcelのバージョンで挙動が違うとかいうオチだろ。
実際に使われる環境で正しく動けば、それで良いじゃん。
95デフォルトの名無しさん:2011/12/08(木) 22:05:52.74
>>89
できました!ありがとうございました。
バージョンは2003と2007です。
96デフォルトの名無しさん:2011/12/08(木) 22:14:25.21
さまざまな処理を各プロシージャが担当させるようにし
本体プロシージャはシンプルそのもの、
そしてプロシージャから他のプロシージャを呼び出しまくるような
かっこいいプログラミングがしたいです。
そんなスキル (=プロシージャを呼び出しまくるスキル) を学ぶに特化した学習用の本があれば紹介していただけますか?
97デフォルトの名無しさん:2011/12/09(金) 06:29:49.64
最近学習を始めたばかりの初心者です
わからないことがあったので質問させてください

VBAを使って
1、2500、5000、7500
の4つの数字をランダムで選ぶ
そしてこの動作を繰り返す

というプログラムはどうやって書けば良いのでしょうか
よろしくお願いします
98デフォルトの名無しさん:2011/12/09(金) 06:43:25.56
丸投げいくない
99デフォルトの名無しさん:2011/12/09(金) 06:54:05.47
>>98
すいません
できるか出来ないかだけでも教えていただけますか?
この4つをMT乱数を用いて選び出したいんです
そしてこの試行を繰り返す、という動作です
100デフォルトの名無しさん:2011/12/09(金) 07:12:39.98
数字を配列変数に代入
乱数を取得
乱数の3の余剰を求める
前記余剰を配列番号に与えてアタイを撮る
101デフォルトの名無しさん:2011/12/09(金) 07:17:25.61
数字を配列変数に代入
乱数を取得
乱数の3の余剰を求める
前記余剰を配列番号に与えてアタイを撮る
アタイをLogに出力

の上記をひたすら気が済むまでLoopする
102デフォルトの名無しさん:2011/12/09(金) 07:46:34.64
>>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がいるけど。
103デフォルトの名無しさん:2011/12/09(金) 07:52:19.50
>>99
もちろん「できる」

ところでVBAの乱数って内部アルゴリズムは公開されてたっけ?
MT乱数の使用が必須条件なら自分で乱数発生プログラムも書く必要があるかも
104デフォルトの名無しさん:2011/12/09(金) 08:03:45.92
MT乱数 VBA

ヤホーでググればたくさん落ちてる

ちなみにワシは100-101だが
ボケてた。


3の余剰じゃなくって4の余剰だ
105デフォルトの名無しさん:2011/12/09(金) 08:06:06.37
みなさんありがとうございます
C言語の基本的なことはわかるので、配列で出来そうです

乱数は自分でプログラム書かなくても大丈夫だったような……

わからないことだらけなのでまた質問することもあるかとは思いますが、その時はよろしくお願いします

今回は皆さんのおかげで解決出来ました
ありがとうございます
106デフォルトの名無しさん:2011/12/09(金) 09:09:25.31
>>105
C言語の基本なことがわかってる奴が >>97 みたいな質問するのか?




と、思った奴は俺だけじゃないと思う。
107デフォルトの名無しさん:2011/12/09(金) 10:43:42.62
>>103
正式には公開されてないけど、どこかで解析されてたぞ。
MT乱数ならExcelで使えるdllがある。
なんか64bitのWindowsでは使えないみたいだが。
PtrSafeかましてもうまくいかん。
108デフォルトの名無しさん:2011/12/09(金) 10:46:17.93
うまくいかんのは64bitのExcelだった。
109デフォルトの名無しさん:2011/12/09(金) 20:35:25.18
VBA上だと変数のビット数が足りなくて完全なMTは実装できないとかなんとか
110デフォルトの名無しさん:2011/12/09(金) 21:43:02.26
'This is the Visual Basic for Applications (VBA) version of the MT19937ar,
'or "MERSENNE TWISTER" algorithm for pseudo random number generation,
'with initialization improved, by MAKOTO MATSUMOTO and TAKUJI NISHIMURA,
'of 2002/1/26.
'This translation to VBA was made and tested by Pablo Mariano Ronchi (2005-Sep-12)

http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/BASIC/mt19937arVBcode.txt
111デフォルトの名無しさん:2011/12/10(土) 01:13:56.71
>>106
すいません
実はVBA触るのは今回が初めてでなにが出来てなにが出来ないのかがまるでわかってないんです

基本Cと同じく考えて良いんですかね
112デフォルトの名無しさん:2011/12/10(土) 01:31:07.91
>>111
まじめにCが普通に使える奴なら、VBA はマージン見ても一週間もあれば
それなりに使えるようになると思う。

ポインタは使えない (異論ある人もいるだろうけど、あえて言い切る) けど、
構造体もあるし、似たようなもんだと思っていい。
113デフォルトの名無しさん:2011/12/10(土) 01:48:34.83
>>112
Cが使えるか?と言われると中々自信が無いですけどね
基本は学んだことがあるので、コードを見てなにが書いてあるか位なら何となくはわかるかと

おかげで少しやる気がでました
とりあえずやりたいことに関する参考書でも探してみようと思います
114デフォルトの名無しさん:2011/12/10(土) 10:31:40.78
>>113
> コードを見てなにが書いてあるか位なら何となくはわかるかと

自分で書いたことはないってこと?
読めるのと書けるのの間はそれなりにある (例えば小説考えればわかるでしょ) ので、
一週間じゃ難しいかも。

幸いなことに VBA はネットにも本屋にも山ほど情報はあるから、じっくりがんばれ。
115デフォルトの名無しさん:2011/12/10(土) 12:09:19.41
>>109
そんなわけあるか
「多倍長」でぐぐれ
116デフォルトの名無しさん:2011/12/10(土) 12:10:05.05
文章と違ってコードは書くより読む方が難しいと思うんだけどなあ
117デフォルトの名無しさん:2011/12/10(土) 12:35:07.22
大は小を兼ねるから
変数の型は
integerやlongやは使わず
すべてdoubleにしていいですか?
118デフォルトの名無しさん:2011/12/10(土) 12:54:57.60
整数使いたいの?小数使いたいの?どっち?
119デフォルトの名無しさん:2011/12/10(土) 12:58:11.55
>>117
プログラムが複雑になってくると、最小限に切り詰めた方が計算は速くなるんだけど
そういう質問をするレベルなら大したプログラムは作らんだろうから、たぶん大丈夫
120デフォルトの名無しさん:2011/12/10(土) 13:03:28.16
すべてVariant使えばいいじゃん
121デフォルトの名無しさん:2011/12/10(土) 14:11:46.85
>>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
みたいに書くんだっけ?
123デフォルトの名無しさん:2011/12/10(土) 16:43:38.17
↓自分で作って動かしてるもの w

Public Const shisuu As Integer = 0
Public Const sakimono As Integer = 4
124デフォルトの名無しさん:2011/12/10(土) 16:48:13.30
Sendkeysステートメント(メソッド)を使って、他アプリケーションへの入力作業を行っています。
日本語入力の文字化け現象についてはVBAではどうにもならないと聞きました。
クリップボードを経由してもダメでした。

何か良い方法は無いでしょうか?
125デフォルトの名無しさん:2011/12/10(土) 17:16:54.06
ファイルから読み込みしたら?
126デフォルトの名無しさん:2011/12/10(土) 17:23:31.69
SendMessageすれば*
127デフォルトの名無しさん:2011/12/10(土) 20:02:53.99
>>126
ありがとうございます。
SendMessageについて色々調べてみましたが、今一理解できません。
失礼は重々承知ですが、使い方を教えて下さいませんか?

とりあえず、Yahooトップページの検索ボックス(既にフォーカスされているものとして)に
下記の文字列を送信するコードを教えて下さい。

"日本語で入力します。"


よろしくお願いします。
128デフォルトの名無しさん:2011/12/10(土) 20:36:01.01
定数はどうやって型宣言するんだっけ?
 Const a=3.14
みたいな感じ?
それともこう?
 Const a as Double = 3.14
129デフォルトの名無しさん:2011/12/10(土) 20:41:52.19
>>0x80
>>0x7B
130デフォルトの名無しさん:2011/12/10(土) 20:57:48.09
このスレ的には、

>>&H80
>>&H7B

じゃね?
1310x81:2011/12/10(土) 21:30:56.65
すまぬのう

ExcelVBAで組み込みCの色々なテーブルとかマクロ作って生活の足しに
しているんでな。

つーかワークシートの位置指すのにヘキサで書く理由がわからないですが
そういう仕事の人はいますか?(居たら事例を聞きたい)
1320x81:2011/12/10(土) 22:16:12.22
すまん、自分でも何言っているのかわからない。


まぁ、ワシのティンコは言うこときかないんですけどね。元気すぎて
133デフォルトの名無しさん:2011/12/10(土) 22:36:49.98
>>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
134デフォルトの名無しさん:2011/12/11(日) 00:00:06.36
VBAのSendKeysは普通に日本語送れるけど
>>124はどういう状況なんだろう
135デフォルトの名無しさん:2011/12/11(日) 00:13:24.16
2バイト文字入力で化けるソフトがあって、その入力支援が出来ません
ってことかな

表示がバグるだけで内部データは問題ないんじゃね
1360x81:2011/12/11(日) 00:20:33.70
ADOと使って変換すればいけるの?
137デフォルトの名無しさん:2011/12/11(日) 00:30:15.04
>>133
>>134
すみません!完全に私の記述ミス&勘違いです!!
エクセルファイルの各内容を変数に取得して、
社内システムにフォーカスを移して入力を試みています。

半角文字列や数字は問題なく入力できるのですが、
全角文字列(日本語)をSendkeysで送っても文字化けしてしまうのです…

文字化けしないようにするにはSendMessageを使う必要があるって聞きましたが、
使い方がよく分かりません。お手数掛けてすみませんが、ご教授お願いします。
138デフォルトの名無しさん:2011/12/11(日) 00:31:36.91
>>135
え、そうなんですか?
月曜日に確認してみます!
ありがとうございます!!
139デフォルトの名無しさん:2011/12/11(日) 00:46:38.45
>>137
全角文字とSendKyesの組み合わせだと、
入力したい全角文字列をクリップボートにコピーしてから、SendKeys で Ctro+V のみを送るって方法がある
140デフォルトの名無しさん:2011/12/11(日) 00:54:48.00
>>139
ありがとうございます。
でも、 ^V って何故だか動作しませんでした…
141デフォルトの名無しさん:2011/12/11(日) 00:56:06.62
>>139
なるほど

みんな苦労してるんだなあ
うちもツギハギのWEBアプリで四苦八苦してるよ
十何年もかけて機能の拡張やバージョンアップを繰り返してるから画面のデザインとか操作体系がめちゃくちゃになってる
支店が全国に一万店以上あるからうっかり大幅に変更すると再教育のコストもかかるしどうにもならなくなってきてる
142デフォルトの名無しさん:2011/12/11(日) 01:15:47.91
うーん、確かにメモ帳だと SendKeys "^v" で貼り付けできるのにIEだとできないね
何度も試してるとできることもあるけど、再現条件がわからん
Sleepで待ち時間を入れてもDoEventsをはさんでも同じ
半角だと貼れるのに全角は貼れない
わけがわからん
143デフォルトの名無しさん:2011/12/11(日) 01:19:34.66
VBAでDOSコマンド書いてそこから介入
144デフォルトの名無しさん:2011/12/11(日) 01:45:06.76
できた
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
145デフォルトの名無しさん:2011/12/11(日) 07:23:03.30
っていうか相手がIEだったら(>>124
SendKeysなんか使わずにDOM操作した方がよくない?
例えば>>133のコードを拝借すると、SendKeysの2行をこんな風にする

objIE.Document.getElementById("srchtxt").Value = "日本語で入力します。"
objIE.Document.getElementById("srchbtn").Click

対象がすでに表示中のIEだと捕まえるのがちょっと面倒だけどね
146145: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がないのでコードは不正確かもしれません)
148124:2011/12/11(日) 09:16:05.26
>>142-146
お返事が遅くなりすみません。
社内システムはIEではありません。
.exeファイルです。

…VBSのSendkeysとか想像もしてませんでした。
DataObjectでクリップボードに格納して、VBSのSendkeysを試してみます。
いずれにせよ、月曜日じゃないと確認できませんが。。。

何度もアドバイス下さり、本当にありがとうございます!
また、結果などをご報告いたします。
149デフォルトの名無しさん:2011/12/11(日) 10:35:28.06
>>147

ブックの"Sheet1"という名前のシートに操作をするなら

For i = 1 To ActiveWorkbook.Sheets.Count
If ActiveWorkbook.Sheets(i).Name = "Sheet1" Then
操作
End If
Next

にしたらいかがでせうか
150149:2011/12/11(日) 10:36:30.35
レスを良く見てなかったんで
取り消してくらはい
151デフォルトの名無しさん:2011/12/11(日) 11:31:08.05
>>147
>という例を見かけますが、この場合 ActiveSheet が Sheet1 という保証はあるのでしょうか。

当然そんな保証はない。

「シート名は可変です。」と書いてあるが、ではソノシート名はいつどこで指定するのか?

あらかじめ指定しておくと言うなら、

Dim SheetName As String

Private Sub Setup( )
 SheetName = "Sheet1"
End Sub

Private Sub Worksheet_Calculate( )
 Worksheeets(SheetName).操作( )
End Sub

でいい。
Sheet1 がないケースなどがあるなら、適切なエラー処理が必要。
152デフォルトの名無しさん:2011/12/11(日) 11:34:28.91
あと、本来名前でいろいろ参照するのはお勧めしない。
>>151 の例なら、

Dim TargetSheet As Worksheet

Private Sub Setup( )
 Set TargetSheet = Worksheets("Sheet1")
End Sub

Private Sub Worksheet_Calculate( )
 TargetSeet.操作( )
End Sub

の方が (個人的には) よりいいと思う。
153デフォルトの名無しさん:2011/12/11(日) 11:40:53.64
>>147
Worksheet_Calculateイベントはアクティブシートがどこにあっても発生する可能性があります
シートモジュールの中で自分自身に対して何か処理をしたい場合はシート名を書かなければ良いだけです

[Sheet1]
Private Sub Worksheet_Calculate()
  操作()  ' ←これだけ
End Sub
154デフォルトの名無しさん:2011/12/11(日) 12:27:23.26
シート番号指してシート名取得してその名前が欲しいシート名と一致ならば処理すれば?
変なエラーが起こらない。

For I = 1 To Worksheets.Count
If Worksheets(I).Name = "Hoge" then
'やりたいことやる
endif
Next
155デフォルトの名無しさん:2011/12/11(日) 12:31:01.24
>>147
すんまそん、アンカ忘れてた。
今からカリ首吊ってくる


シート番号指してシート名取得してその名前が欲しいシート名と一致ならば処理すれば?
変なエラーが起こらない。

For I = 1 To Worksheets.Count
If Worksheets(I).Name = "Hoge" then
'やりたいことやる
endif
Next
156デフォルトの名無しさん:2011/12/11(日) 15:20:43.60
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
157デフォルトの名無しさん:2011/12/11(日) 15:59:31.16
>>156
環境が無いんで確認できないけど、
ThisWorkbook.SaveがWorkbook_BeforeSaveを誘発してるでしょ。
自分で聞いてやるしかないと思うよ。
Msgbox("保存しますか?",vbYesNo)
Yesなら
Application.DisplayAlerts = False
ThisWorkbook.Save
Application.DisplayAlerts = True
メッセージは、Ctrl+S時に表示しちゃまずいから、
BeforeCloseで保存確認しちゃった方がいいかもね。

まぁ結局はWorkbook_openで
DisplayHeadings = True '行列番号表示
しちゃう方が簡単だと思うんだ。
158デフォルトの名無しさん:2011/12/11(日) 16:09:24.49
>>156
Saveの直前にイベント抑止してみるとか

Application.EnableEvents = False
ThisWorkbook.Save 'セーブ。できてない?
Application.EnableEvents = True

ただ、保存されたものは常に行番号なしになるのでopen時には再度行番号有効化してやるとかの考慮は必要になる
あと、実際に保存された直後、
.DisplayHeadlings = True
の行でおそらく編集扱いになるので、ただ閉じようとしても必ず
保存しますか?
と聞かれてしまうのは仕方ないように思える
159デフォルトの名無しさん:2011/12/11(日) 16:13:35.98
157>>
返信ありがとう!

上司からのオーダーなもんで出来るだけ対応したいんだけどねぇ。
Ctrl+Sでやりたいから、必ずしもウィンドウを閉じる時ばかりじゃないもんで。
俺もこれを聞く前に閉じるときにセーブ前に非表示→開くときに表示というふうに
したんだけどそれだとダメらしい

出来ればCtrl+Sとかでも対応できるようBeforSaveでやりたいが……
自前の保存マクロでやるしかないかな……
160デフォルトの名無しさん:2011/12/11(日) 16:21:54.14
>>158
>.DisplayHeadlings = True
>の行でおそらく編集扱いになるので
ThisWorkbook.saved=Trueでどう?
161デフォルトの名無しさん:2011/12/11(日) 16:23:43.56
>>158
こっちもありがとう!

イベントの抑制・・・そういうのもあるのですね。参考にしてみる。
開くときに表示ON自体は_OpenでしてやればOKですね。実際それはもう仕込んであるので。

しかし、なるほど、結局、表示消すのが編集扱いになってるから何ども聞かれるのか。
そりゃそうだわな……
162デフォルトの名無しさん:2011/12/11(日) 17:45:20.24
>>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をいれてます。
163デフォルトの名無しさん:2011/12/11(日) 20:16:58.40
>>162
EXCEL2000ならあったから入れてみた。
http://ideone.com/tn9oN
出来てるとは思うけど、
割と脆弱なロジックなので、限られた範囲での使用に留めるべき。
仕事であれば別にボタンを用意するかな。
164デフォルトの名無しさん:2011/12/11(日) 22:57:32.48
あ、vbNoの処理間違ってた。
Saved=Trueが必要かな
165147: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 と書きたいが。
166デフォルトの名無しさん:2011/12/12(月) 00:26:16.12
>>165
俺はそんな時 Me を良く使うお
Set SelfSheet = Me
167デフォルトの名無しさん:2011/12/12(月) 00:31:30.30
すいません、質問が
VBAを使って、
Aというセルに数値を入れた時に、BというセルにそのAに入れた数値によって様々な値を出力する
というのを作りたいのですが、どうすればいいのでしょうか
168デフォルトの名無しさん:2011/12/12(月) 01:24:37.73
>>167
セルBにセルAを参照する数式を記述する
169デフォルトの名無しさん:2011/12/12(月) 01:24:46.11
質問です

mnock = 1: hno = 1の
:ってどういういみなんですか?

代入を一行に書いたわけではないんですよね・・・
170デフォルトの名無しさん:2011/12/12(月) 01:56:23.33
改行の代わり
171デフォルトの名無しさん:2011/12/12(月) 01:59:19.61
>>170
そうなのか・・・特殊記号かとおもってしまいました
ありがとう
172デフォルトの名無しさん:2011/12/12(月) 09:47:18.15

範囲指定をして何か処理(ソートとか)した後、その選択範囲が選択されたままになってしまいますが、それを解除する命令
とかってありますか?
何処かのセルを選択すればそれが解除されはするんですが、それとは別に言ったような選択を解除するようなものがあるのか
?と思いまして。
173デフォルトの名無しさん:2011/12/12(月) 10:21:17.05
未選択状態見たこと無いから無いんじゃない?
174デフォルトの名無しさん:2011/12/12(月) 10:23:20.77
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つの状態にしたいという事です。

よろしくお願いします。
176デフォルトの名無しさん:2011/12/12(月) 12:02:31.09
わーくしーとあふたーあっぷでーと()

A1〜10に入力があったら他排除

えんどサブ
177175:2011/12/12(月) 12:35:42.16
>>176
すみませんが、貴方の言う「A1〜10に入力があったら他排除」が分からないと質問をしているのです。
回答する気がないのであれば、中途半端なレスはいりませんよ、176さんも暇じゃないでしょうから。
178デフォルトの名無しさん:2011/12/12(月) 12:43:30.40
179デフォルトの名無しさん:2011/12/12(月) 13:07:20.85
>>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
180175:2011/12/12(月) 13:12:20.64
>>179
態度を改めます。
掲示板の使い方も覚えます。
コードありがとうございました。
181デフォルトの名無しさん:2011/12/12(月) 13:16:48.65
ああごめん、フックが解んないかと思ってたわ
182デフォルトの名無しさん:2011/12/12(月) 14:02:21.15
>>163
サンクス。かなり参考にさせてもらった。
でもブックを閉じた時、保存ではいを押しても保存出来ないっぽい。2007の差でもあるのか

ちなみに皆さん、マクロ配布するときどうしてます?
エキスポートでcls出してインポートで使わせようと思ってもthis bookに書かなきゃうまくうごかなかった。そもそもVBAわざわざ開かせるのも微妙で。

183デフォルトの名無しさん:2011/12/12(月) 14:16:59.61
>>172
Application.CutCopyMode = False じゃないのか?

>>182
プログラムの入ってるブックとデータの入ってるブックは別にして
配布はプログラム用のEXCELブックを丸ごと配布する
184デフォルトの名無しさん:2011/12/12(月) 14:24:08.14
オブジャクト指向ってなんですか?
185デフォルトの名無しさん:2011/12/12(月) 14:33:16.67
オブジェクト指向は、継承とポリモルフィズムです
smalltalkという言語が有名
186184:2011/12/12(月) 14:39:05.33
わたしが聞いてるのは「オブジャクト指向」のほうなんですが
187175:2011/12/12(月) 15:34:06.89
>>179
度々すみません。
*の排他入力?は出来たのですが、
文字列の中央揃えなどの設定が消えてしまいます。
188デフォルトの名無しさん:2011/12/12(月) 15:41:17.73
書いてあるコードググれよ

宿題なら自分でやりな

俺が聞く時に雰囲気悪くなったらどーすんだ!
189デフォルトの名無しさん:2011/12/12(月) 15:54:57.59
それを気にするほどのやわな神経なんてないだろ
190デフォルトの名無しさん:2011/12/12(月) 17:16:44.25
VBAでシート関数はApplication.Sheetfunction.[関数]と書けばどんなものもつかえる?
191デフォルトの名無しさん:2011/12/12(月) 18:27:00.97
>>187 >>175

>>2
>★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
>   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
>   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ

と書いてあるんだが 読んだのか?
192デフォルトの名無しさん:2011/12/12(月) 18:35:15.73
>>191
当たりまえです
>>187を聞いてるのに関係ない話で誤魔化さないでください
わかりもしない、答える気もない屑が掲示板を荒らすのは本当に不愉快です
193デフォルトの名無しさん:2011/12/12(月) 18:36:47.91
オレ ジエン ここまで ぜんぶ
194デフォルトの名無しさん:2011/12/12(月) 18:41:50.97
>>192
偽者乙
195デフォルトの名無しさん:2011/12/12(月) 18:43:55.77
俺の自演って言ってるじゃないですカー!
196デフォルトの名無しさん:2011/12/12(月) 19:39:03.96
中央でそろえるとか、マクロの記録があるんだからそれ使えばいいじゃない
そのコードを今までのに追記するだけなんだし。

ここでやり取りしてる時間の方が無駄でしょ
197デフォルトの名無しさん:2011/12/12(月) 19:51:40.07
>>190
使えないものもあるよ。そういう時はEvaluateを使うみたいだけど。
198124:2011/12/12(月) 20:29:23.23
今日、会社で色々試しました。
解決策は意外な盲点にありました。

私はSendkeysはApplicationクラスのものを利用していましたが、
(こっちの方が安定性が高いらしいので)
普通のSendkeysを使用したら文字化けしませんでした。
それからメニュー等を操る時は、大文字入力だと失敗することが多いですね。

いずれにせよ、親身にアドバイスを下さった皆さん、
本当にありがとうございました。
199デフォルトの名無しさん:2011/12/12(月) 20:38:26.96
そういや「Sendkeysステートメント(メソッド)」って書いてたもんな
なんでメソッド?と微妙にひっかかっていたがそういうことか
200175 ◆txEbeGmJyg :2011/12/12(月) 20:47:44.09
>>191
すみません。
他にExcelのVBAスレが見当たらなかったもので、勝手は承知で質問してしまいました。

>>196
失礼ですが、このスレの回答側の人はその程度のレベルなんですか?

>>179
さきほど、.Clearの所を= ""にしたら、できました。
あえて、勉強のために.Clearを使って書いてくれたのかな?
201デフォルトの名無しさん:2011/12/12(月) 21:09:47.60
質問者が恐らく理解出来るだろう内容で回答してるよう見えるけど
202175 ◆txEbeGmJyg :2011/12/12(月) 23:31:06.38
>>201
私が言っているのは>179さんに対してではなくて、>196さんの発言に対してです。

>179さんのコードは綺麗だと思います。
.Clearメソッドを使った意図が、私に学習させるためなのかなと思っただけです。
なので、>179さんには感謝はすれど文句はありません。
203175 ◆txEbeGmJyg :2011/12/12(月) 23:46:11.89
度々すみません。

>>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さんか分かる方いたら教えてください。
どうかよろしくお願いします。
204175 ◆txEbeGmJyg :2011/12/12(月) 23:48:55.32
またまたすみません。

Dim strRowPosA as String
Dim strRowPosN as String
strRowPosA = A
'
'ここで、strRowPosAを数値にして、strRowPosNに入れたいということです。
'その変換方法がないかなと。
'
If c = strRowPosN And r <= 10 Then

205デフォルトの名無しさん:2011/12/12(月) 23:50:01.50
うーーーーーぜーーーーーーーーーーー
206175 ◆txEbeGmJyg :2011/12/12(月) 23:50:34.30
だぁ・・・。
スレ伸ばしてすみません。

誤)Dim strRowPosN as String
正)Dim strRowPosN as Integer
207デフォルトの名無しさん:2011/12/13(火) 00:11:04.02
スレチ押し通すなっての。
既に聞く態度じゃないとと取られてんだし、誰も真面目に答えないよ?
208175 ◆txEbeGmJyg :2011/12/13(火) 00:20:56.52
>>207
失礼ですが、どこがスレチなんでしょうか?
>>2の>★5と指摘されたので、調べつつ少しなりとも自分でやっているんですけど。
聞く態度じゃないというのも具体的に分かりませんが、改めて私のできる範囲で丁寧な
言葉でレスしているのですが。

ちなみに、誰も答えないとおっしゃられていますが、それは貴方の推測ですよね。
事実、もしそうであれば>>178でレスが止まっているはずですが、>>179氏はちゃんと指摘
とレスをしてくれましたよ。

質問者の立場で何ですが、一言あなたに言わせていただくと、あなたは回答できないので
はないですか?
基本2chて自分が嫌だと思ったらスルー推奨ですよね。


それで結果的にスマートではないと思うのですが、26進数変換の関数を作って対処(仮)しました。
もしもっと、いい方法を知っている方いらっしゃいましたら、教えていただけると助かります。

209デフォルトの名無しさん:2011/12/13(火) 00:23:31.37
210デフォルトの名無しさん:2011/12/13(火) 00:26:48.21
211デフォルトの名無しさん:2011/12/13(火) 00:37:20.63
212デフォルトの名無しさん:2011/12/13(火) 00:41:06.61
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


で型が一致しないとでるのですがどうすればよいでしょうか
214デフォルトの名無しさん:2011/12/13(火) 00:42:11.55
ちょっと煽られただけですぐ感情的に反論するとか、どんだけ子供なんだよ
気に入らないレスは無視しろ
正論でも印象悪い
書き間違いが多すぎる
書き込む前に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
215デフォルトの名無しさん:2011/12/13(火) 00:44:37.64
>>213
○ Dim n As Integer
× Dim n As String

授業はちゃんと聞こうね
216175 ◆txEbeGmJyg :2011/12/13(火) 00:49:58.79
>>214
すみません。
指摘感謝です。
>179さんかな?
コードありがとうございました!
217デフォルトの名無しさん:2011/12/13(火) 00:55:07.20
202
>>196ですら君は及ばないレベルだと自覚出来ない時点でもうね
218デフォルトの名無しさん:2011/12/13(火) 00:56:20.86
>>215
ありがとうございました^^
219147: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文字以上で説明してくださいませんか?
221デフォルトの名無しさん:2011/12/13(火) 13:54:02.76
>>220
>十分には理解していない人
どこのどいつだ?
Deutschでもよければ400字くらいで?
222220:2011/12/13(火) 14:52:35.87
>>221
ここのオレだ。
I'd rather prefer English than Deutsch.
223デフォルトの名無しさん:2011/12/13(火) 16:22:00.16
I'd rather prefer English wife than Deutsch wife.
224デフォルトの名無しさん:2011/12/13(火) 18:22:12.32
VBAでいくつか文字列が入ったセル(その時によりセルの数が違う)があって
そのうち昇順で並べて一番最後の文字列だけを取り出す方法はどうしたらいいですか?
225224:2011/12/13(火) 18:22:47.09
セルちゃうわ、シート名だった。
シートの数は、ファイルによりいつくあるかはわからないの。
226デフォルトの名無しさん:2011/12/13(火) 18:42:32.06
>>224
Sub 最後のシト()
  s = ""
  For Each ws In Worksheets
    If ws.Name > s Then s = ws.Name
  Next
  Debug.Print s
End Sub
227147:2011/12/13(火) 19:31:28.61
>>220
俺もオブジェクト指向とか理解していないけど、
継承できなのにはかなりまいった。
228デフォルトの名無しさん:2011/12/13(火) 19:33:23.34
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デフォルトの名無しさん:2011/12/13(火) 23:04:26.04
>>226
お前>>176
それとも>>213
>最後のシトとかいらっとくるからやめろ。
230デフォルトの名無しさん:2011/12/13(火) 23:21:13.61
>>229

226

213
のボケをかますとは思えない

つーか一々煩いからお前が黙ってろ
231デフォルトの名無しさん:2011/12/14(水) 00:23:42.59
>>220

オブジェクトを部品として利用することは出来るが
既存のオブジェクト(クラス)を継承して新たな部品を作ることは出来ない
232デフォルトの名無しさん:2011/12/14(水) 00:37:17.98
>>230
ごめんなさーいw
233デフォルトの名無しさん:2011/12/14(水) 09:33:54.08
シートで行を削除するのにマクロの記録だと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 とすると構文エラーになってしまいます
行を変数にするのはどのようにしたら良いんでしょう?
234デフォルトの名無しさん:2011/12/14(水) 09:42:02.74
Rows(i:endrow).Delete Shift:=xlUp

Rows(i & ":" & endrow).Delete Shift:=xlUp
235デフォルトの名無しさん:2011/12/14(水) 09:52:48.73
>>234

ありがとうございます
236デフォルトの名無しさん:2011/12/14(水) 18:54:02.39
>>235

ついでに言うと、Rowsに対するDeleteは常にxlUpだからShift:=xlUpは不要
237デフォルトの名無しさん:2011/12/14(水) 21:04:31.60
>>236
言われてみたら確かにそうですね w
238デフォルトの名無しさん:2011/12/14(水) 21:33:37.60
削除は下から消さないと・・・
239デフォルトの名無しさん:2011/12/14(水) 22:21:48.02
>>238
分割された領域なら下からとか右からで削除しないと面倒だけど、
連続の領域をまとめて消すんなら別にどうでも良いんじゃね?
240デフォルトの名無しさん:2011/12/14(水) 22:59:06.37
アドバイスお願いします。

数字、名前のペアが複数あって、数字をキーにすると名前が取り出せて、
名前をキーにすると数字が取り出せる連想配列のようなものを作りたいのですが、
VBAではどのようにすると効率的でしょうか?
それぞれ、一意的にペアが決まっています。
241デフォルトの名無しさん:2011/12/14(水) 23:06:34.94
>>240
Scripting.Dictionary オブジェクトを2つ用意して、
一方は数字をキー、もう一方は名前をキーと使い分ければいい
242240:2011/12/15(木) 22:30:21.63
>>241
ありがとうございます。試してみます。
243デフォルトの名無しさん:2011/12/16(金) 00:14:21.90
どちらで聞いたらいいのか分からなかったのでこちらで聞きますが
セルの値を数値処理する場合vbsから操作するのとvbaから操作するのだとどちらが計算早いですか?
244デフォルトの名無しさん:2011/12/16(金) 00:15:16.83
vbs
245デフォルトの名無しさん:2011/12/16(金) 00:19:32.00
Excelとのやり取りが殆ど無い場合でも、
腐っても型付言語であるVBAの方が速いと思う。
やり取りが多い場合はインプロセスとアウトプロセスの
越えられない壁があるからVBSに勝ち目無し。
246デフォルトの名無しさん:2011/12/16(金) 00:32:28.93
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つ選び出す、というアルゴリズムです
248デフォルトの名無しさん:2011/12/16(金) 08:13:33.97
単純にやるなら乱数3つ
問いの内容ならxCy個の中から乱数1つ
1なら(123)、2なら(124)……て形で割り振るアルゴリズムを通してゲット
重複や順列の内容で幅を変えればいい
249デフォルトの名無しさん:2011/12/16(金) 15:55:35.00
http://www.eurus.dti.ne.jp/yoneyama/Excel/vba/vba_rnd.html
ここ参考にすればいいんじゃねーの
250デフォルトの名無しさん:2011/12/16(金) 17:02:45.72
vbaって動的の多次元配列ってできねえの?
251デフォルトの名無しさん:2011/12/16(金) 17:03:30.70
型はstringで
252デフォルトの名無しさん:2011/12/16(金) 17:06:42.33
なんでそういうサイトを上げるんかねぇ。
恥かかせるためか?
253デフォルトの名無しさん:2011/12/16(金) 17:07:54.02
>>250
やってみりゃ分かるだろ?
254デフォルトの名無しさん:2011/12/16(金) 17:08:28.00
dim hoge(,) as string
これだとエラーなんだけど
255デフォルトの名無しさん:2011/12/16(金) 17:09:48.29
dim hoge[][] as string
これもエラーだった
256デフォルトの名無しさん:2011/12/16(金) 18:10:19.05
二次元で要素数が不定の動的配列はできないんじゃないの?
検索するとできるって書いてあるページもあるけど、サンプルをコピペするとエラー出るし
VBとVBAを勘違いしてんじゃないかと思う

要素数固定で宣言して、片方の次元だけReDimする方式の動的配列なら可能だけど
257デフォルトの名無しさん:2011/12/16(金) 19:23:51.82
>>250
Dim hoge() As String

ReDim hoge(10, 5, 3)
hoge(0, 0, 0) = "3次元"
Debug.Print hoge(0, 0, 0)
258デフォルトの名無しさん:2011/12/16(金) 20:49:43.90
>>257
思ってたのとちょっと違いますけどこれとpreserveで代用できそうだな
ありがとうございます
259デフォルトの名無しさん:2011/12/17(土) 00:44:13.36
WindowsAPIを使用したいときは、いちいち定義しないとダメなんでしょうか?
現場では資料もなくネットも使えない環境なので手打ちをキツイです。
260デフォルトの名無しさん:2011/12/17(土) 00:50:47.84
>>259
いちいち定義しないとダメですが、WinAPIなら百科事典が発売されているのでそれを持ち込むという手も
あとはmsdnのオンラインヘルプ(CD-ROM版)を用意して、CのソースをVBAに書き換えるマクロとか用意すれば
なんとかなるでしょう
261デフォルトの名無しさん:2011/12/17(土) 01:22:48.76
vbaでこんな感じのリクエストを飛ばすのってどうやるのですか?

GET / HTTP/1.1
Accept-Language: ja
Accept-Encoding: gzip
User-Agent: hoge (1.1.1)
Host: wwww.aaa.bb
262デフォルトの名無しさん:2011/12/17(土) 01:34:28.67
GET /hogehoge.cgi HTTP/1.1
Accept-Language: ja
Accept-Encoding: gzip
User-Agent: hoge (1.1.1)
Host: wwww.aaa.bb

送るとこかいてませんでした
263デフォルトの名無しさん:2011/12/17(土) 03:32:05.24
>>261
WinInet関連のAPIを使う
HttpAddRequestHeadersしてHttpSendRequestかな?

WinHTTPライブラリ(WinInetの後継らしい)てのもあるが詳細はしらない

これ以上はスレチになるんで
ググるか APIのすれで聞いておくれ
264デフォルトの名無しさん:2011/12/17(土) 04:19:21.00
>>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ソース)取得
265デフォルトの名無しさん:2011/12/17(土) 09:44:20.71
Dim WS As Worksheet
Set WS = Worksheets("記録")
Worksheets(WS).Activate ←

で、矢印の部分で型が一致しないって出るんですけど、String型でないと駄目ッてこと
ですか?
266デフォルトの名無しさん:2011/12/17(土) 09:47:26.21
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
って書けば良い
268267:2011/12/17(土) 09:54:36.29
安価ミスった
「265のやり方」じゃなくて「266のやり方」でした
269265:2011/12/17(土) 09:55:52.47
なるほど!

ありがとうございます
270デフォルトの名無しさん:2011/12/17(土) 16:18:35.70
>>264
できました!
ありがとうございます
271デフォルトの名無しさん:2011/12/17(土) 18:21:08.96
constって使う必要あるの?
変数に値持たせてそれ変えなければいいだけじゃないの
272デフォルトの名無しさん:2011/12/17(土) 18:35:36.34
>>271
プロシジャ毎にPrivate変数に一々代入するのって面倒じゃない?
273デフォルトの名無しさん:2011/12/17(土) 18:48:53.68
Constの場合は確実に固定値だと判断が出来る。
普通の変数だと、その点が曖昧にならざるを得ないから、
後でソースを見返す時に面倒。
274デフォルトの名無しさん:2011/12/17(土) 19:14:43.41
>>272
ところでモジュール間でも定数は自由に使えますかにゃ?

標準モジュールとフォームモジュールを使ってた場合、
どちらかのモジュールの一番上に書いておけば、他方のモジュールをその時点で未使用でも、その他方の上のほうに書いてある定数は使用可能?
275274訂正:2011/12/17(土) 19:16:32.05
>>272
ところでモジュール間でも定数は自由に使えますかにゃ?

標準モジュールとフォームモジュールを使ってた場合、
どちらかのモジュールの一番上に書いておけば、他方のモジュールから実行が始まったとき、
書いてるほうのモジュールがその時点で未使用でも、その他方のモジュールから別のモジュールの上のほうに書いてある定数は使用可能?
276デフォルトの名無しさん:2011/12/17(土) 19:36:50.61
ちょっと試せばすぐにわかるのに
277デフォルトの名無しさん:2011/12/17(土) 19:37:56.98
モジュールはマクロ開始時点で全て初期化される。
278デフォルトの名無しさん:2011/12/17(土) 19:39:29.49
>>276
あなたのVBA力と回答力を試しているんですが
279デフォルトの名無しさん:2011/12/17(土) 19:43:07.60
VBA力とか言ってる時点でみんなより自分が格下なのに気付けよ
280デフォルトの名無しさん:2011/12/17(土) 20:11:42.31
わからないなら無理にレスしてくれなくていいよ?
281デフォルトの名無しさん:2011/12/17(土) 21:08:41.34
VBAで、数値から文字列、文字列から数値への変換の方法はいろいろあるみたいだけど
どの方法が一番標準ですか?

自分は前者はCStr、後者はVal、でそれぞれやってますが、これって変?
282デフォルトの名無しさん:2011/12/17(土) 21:25:43.32
基本は自動型変換で良くね?
後、Val関数は何気に色々と面白い仕様だから注意した方が良いよ。
283デフォルトの名無しさん:2011/12/17(土) 22:04:12.83
>>282
自動型変換とは何ですか?
面白い仕様とはどういうことですか?
あにゃたの発言のほうが意味がいろいろ取れて神経を使います。
284デフォルトの名無しさん:2011/12/17(土) 22:58:53.98
別に標準とかないでしょ
いろいろな方法があるのにはそれなりに理由があるんだから
その時によって最適な方法を選べば良い
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/
286デフォルトの名無しさん:2011/12/18(日) 00:52:58.28
VBAで自作ライブラリ作ってる人とか初めて見た・・・すごいな
287デフォルトの名無しさん:2011/12/18(日) 01:00:33.26
>>285
なぜ標準的な機能がすでに存在してるのに
わざわざ自作ライブラリまで作るんですか?
つこてる豆が違うんですか?
288デフォルトの名無しさん:2011/12/18(日) 01:13:53.11
その\\\は何なの
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環境では
使いまわすようにしてる
291デフォルトの名無しさん:2011/12/18(日) 02:45:14.73
1時間かけてコーディングたものをデバッグしたら、最後のコードが.saved=true:.closeで、次開いたらコードが全て消えていました!
途中保存はしていませんでした、どうすればいいですか!!!


292デフォルトの名無しさん:2011/12/18(日) 02:53:35.82
293デフォルトの名無しさん:2011/12/18(日) 02:58:10.81
デスクトップクリックして Alt + F4 押して エンター押せば解決だ!
294デフォルトの名無しさん:2011/12/18(日) 03:23:28.84
Winキーを押してすばやくUを2回押すとバックアップ取得できるよ
295デフォルトの名無しさん:2011/12/18(日) 04:24:50.37
>>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
297296:2011/12/18(日) 05:07:21.63
>>296ですが、エラー1004が出てしまいます・・・

アドバイスいただけないでしょうか?
298デフォルトの名無しさん:2011/12/18(日) 05:24:31.13
>>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
299デフォルトの名無しさん:2011/12/18(日) 05:26:00.71
>>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
300デフォルトの名無しさん:2011/12/18(日) 05:28:57.05
>>296
Copyの使い方がおかしい

Cells(a, "Y").Copy = Cells(a, "AA")

↓修正

Cells(a, "Y").Copy Cells(a, "AA")

または

Cells(a, "AA") = Cells(a, "Y")
301デフォルトの名無しさん:2011/12/18(日) 08:50:31.31
>>285
数値から文字列への変換って意味ではそれ単なる暗黙の型変換だね
302デフォルトの名無しさん:2011/12/18(日) 11:21:49.50
これはなぜエラーが出るの?

Sub Test()
ActiveSheet.ActiveCell = 1
End Sub
303デフォルトの名無しさん:2011/12/18(日) 11:49:50.34
ActiveCellはActiveSheetのプロパティではないから
304302:2011/12/18(日) 12:22:44.96
>>303
でもActiveCellはsheet一般のプロパティじゃないの?
そしてActiveSheetはsheet一般に属するんじゃないの?
以上から、ActiveCellはActiveSheetのプロパティになるんですけど。
305デフォルトの名無しさん:2011/12/18(日) 12:36:07.79
>>302
http://officetanaka.net/excel/vba/tips/tips34.htm

これを見る限り、「ActiveCellはsheet一般のプロパティ」じゃないっぽい
(ちなみに俺は>>303じゃないよ)
306デフォルトの名無しさん:2011/12/18(日) 12:41:09.09
オブジェクトブラウザで確認しろ、ってことだな。
もしくは、一旦Sheet型に代入してからアクセスするとか。
307デフォルトの名無しさん:2011/12/18(日) 14:27:30.83
変数を初期化する時に数値型なら0を入れるのが普通ですよね(まぁ特定のセルの値をそれに使うこともあるでしょうけど)

日付型の時って初期化はどうするんですか?
Dim hi_from As Date

hi_from = ""
としたら怒られちゃった^^;
308296:2011/12/18(日) 14:27:36.53
>>298-300

おかげさまで解決しました。 ご丁寧にありがとうございましたー
309デフォルトの名無しさん:2011/12/18(日) 14:33:48.23
>>307
>としたら怒られちゃった^^;

何のために初期化したいのか知らんけど、0 でも入れときゃいいんじゃね。
310デフォルトの名無しさん:2011/12/18(日) 14:37:58.97
>>309
thx
311デフォルトの名無しさん:2011/12/18(日) 14:52:54.06
>>307
この野郎!
おまえ何をやっとるんだ(怒)!!

みたいに怒られたのか?
それって誰によ?
312デフォルトの名無しさん:2011/12/18(日) 14:57:58.13
>>304
>でもActiveCellはsheet一般のプロパティじゃないの?
違う
ApplicationまたはWindowのプロパティ

>そしてActiveSheetはsheet一般に属するんじゃないの?
違う
Application、WindowまたはWorkbookのプロパティ

>以上から、ActiveCellはActiveSheetのプロパティになるんですけど。
ならないからエラー出るんだよ
313デフォルトの名無しさん:2011/12/18(日) 15:00:13.09
>>307
っていうかDimした時点で初期化されてるよ
314312:2011/12/18(日) 15:04:30.79
あーすまん
ActiveSheetが返すのはWorksheetオブジェクトね
315デフォルトの名無しさん:2011/12/18(日) 15:05:10.06
>>304
Excelのオブジェクトは階層構造になっている

Application - WorkBook(Application毎に複数) - WorkSheet(WorkBook毎に複数)

ActiveCell は最上位の Application オブジェクトのプロパティなので、Sheet オブジェクトから直接参照することはできない
やるならたぶん

ActiveSheet.Application.ActiveCell

となるはず
316デフォルトの名無しさん:2011/12/18(日) 15:22:26.85
なんで MSDN とか見ないのか…

http://msdn.microsoft.com/en-us/library/ff834673.aspx

The following expressions all return the active cell, and are all equivalent.

ActiveCell
Application.ActiveCell
ActiveWindow.ActiveCell
Application.ActiveWindow.ActiveCell
317デフォルトの名無しさん:2011/12/18(日) 16:00:58.06
じゃあActivecellの前には普通の人が使うような単語は書いちゃいけないのか?
XXXXX.Activecell みたいな形はない、と覚えておいてOK?

そしてこれらの法則は、Activebookや、Activesheetにも当てはまる?
つまり、Workbooks(2).Activesheet みたいな形はない?
318デフォルトの名無しさん:2011/12/18(日) 16:16:36.14
>XXXXX.Activecell みたいな形はない、と覚えておいてOK?
ダメ
Application.ActiveCell
ActiveWindow.ActiveCell
>>312で「ApplicationまたはWindowのプロパティ」って書いたよね?
>>315とか>>316にも書いてあるよね?

>そしてこれらの法則は、Activebookや、Activesheetにも当てはまる?
法則とかの話じゃないし

>つまり、Workbooks(2).Activesheet みたいな形はない?
ある
>>312で「Application、WindowまたはWorkbookのプロパティ」って書いたよね?
319デフォルトの名無しさん:2011/12/18(日) 16:31:28.44
>>317
> XXXXX.Activecell みたいな形はない、と覚えておいてOK?

Type YYYYY
 ActiveCell As Integer
End Type

Dim XXXXX As YYYYY

みたいなケースは (やるかどうかは別にして) ありえるから、ダメ。
320デフォルトの名無しさん:2011/12/18(日) 16:34:27.34
>>317
>じゃあActivecellの前には普通の人が使うような単語は書いちゃいけないのか?
ActiveCellプロパティを持つオブジェクトを書く
書かなければApplicationとみなされる

あと、とりあえず>>319は無視していい
321デフォルトの名無しさん:2011/12/18(日) 16:51:48.87
Application
ActiveWindow
Application.ActiveWindow

この違いはなんなのでしょう?
誰か違いのわかる男(あるいは女)はいますか?
322デフォルトの名無しさん:2011/12/18(日) 17:41:31.56
字数が異なります
323321:2011/12/18(日) 17:50:13.70
ふざけるな
324デフォルトの名無しさん:2011/12/18(日) 17:58:43.06
>>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つは常に同一になるはず
325デフォルトの名無しさん:2011/12/18(日) 18:32:16.70
2つのオブジェクトが同一かどうか調べる方法ってあるのかな?
たとえば

Set ObjA = ActiveCell
Set ObjB = Application.ActiveWindow.ActiveCell
If ObjA = ObjB Then …

みたいな感じで
326321: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
328デフォルトの名無しさん:2011/12/18(日) 19:06:04.93
"つこてる豆が違います" の検索結果が見つかりませんでした。
つ こ てる 魔 眼 が 違います の検索結果を表示しています。

Bingワロタw
329デフォルトの名無しさん:2011/12/18(日) 20:41:28.74
なぞなぞ
Debug.Print ActiveCell Is ActiveCell
の結果はFalse。さて理由は?
330デフォルトの名無しさん:2011/12/18(日) 20:52:33.37
>>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
331327: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の比較も"違う"という結果になります。
332デフォルトの名無しさん:2011/12/18(日) 21:29:46.45
>>329
ひょっとして、
ActiveCellが返すRangeオブジェクトは現在の選択座標をもとに都度新規に作成されるとかそういう話?
333デフォルトの名無しさん:2011/12/18(日) 21:34:17.84
それを言うなら
Range("A1") Is Range("A1")
もFalseだね
334デフォルトの名無しさん:2011/12/18(日) 21:39:41.65
>>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
335デフォルトの名無しさん:2011/12/18(日) 22:45:17.52
ヒント
Set objA = Worksheets(1)
Set objB = Worksheets(1)
Debug.Print objA Is objB
これはTRUE
336デフォルトの名無しさん:2011/12/18(日) 23:16:30.48
うわあ・・・
337デフォルトの名無しさん:2011/12/18(日) 23:22:59.09
別のプロシージャに配列渡してその値変えたら元も変わる?
338デフォルトの名無しさん:2011/12/18(日) 23:25:51.03
ちょっと試せばすぐにわかるのに
339334:2011/12/18(日) 23:27:21.13
>>335
これは
シートオフジェクトは最初からあるからだったりするのか?
VBEでみるとシートオフジェクトが見えるし
340334:2011/12/18(日) 23:30:23.28
シートオフジェクト ってなんだよ(笑)
シートオブジェクト だった
341デフォルトの名無しさん:2011/12/18(日) 23:33:39.87
VBAからVBEのユーザーフォームデザイン編集画面でツールボックスを右クリックして「その他のコントロール」を選択した時にでるダイアログの
「利用可能なコントロール」を制御する事は可能ですか?
制御は出来なくても利用可能か調べたりチェックされているかどうか調べる方法でも良いです
342デフォルトの名無しさん:2011/12/19(月) 00:01:49.44
>>338
あなたのVBA力と回答力を試しているんですが
343デフォルトの名無しさん:2011/12/19(月) 02:24:24.73
VBAでIEのHTML表示領域の幅と高さを調べたいのですが
どうすればよいでしょうか?
HTMLDocument の HeightやWidthですと
IEのウインドウ幅と高さの取得になってしまいます。
344デフォルトの名無しさん:2011/12/19(月) 02:30:36.62
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"と出てツリーが作成できません
345デフォルトの名無しさん:2011/12/19(月) 02:46:08.20
同じkeyが指定されてるんじゃね
346デフォルトの名無しさん:2011/12/19(月) 03:14:42.05
keyは親子の関係なく 一意でないと いけなかったと思ったけどそうなってる?
347デフォルトの名無しさん:2011/12/19(月) 03:20:57.96
>>345-346
ご指摘通りでした
配列の内容を見直しましたところ同じKEYの物がありました
ありがとうございます
348デフォルトの名無しさん:2011/12/19(月) 03:34:19.11
>>343
scrollHeight, scrollWidth
349デフォルトの名無しさん:2011/12/19(月) 04:23:13.62
>>343
表示領域とは?

>>348 以外に
ClientWidth ClientHeight
もあるが
350デフォルトの名無しさん:2011/12/19(月) 09:29:22.69
>>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)
と同じ。
351デフォルトの名無しさん:2011/12/19(月) 16:15:11.69
どういう時にインスタンスが複製されるのかよくわからんちん
352デフォルトの名無しさん:2011/12/19(月) 20:07:31.39
>>351の言う複製の意味がよくわからんちん
353デフォルトの名無しさん:2011/12/19(月) 23:12:18.80
public変数使わない方が良い理由が分からん
354デフォルトの名無しさん:2011/12/19(月) 23:20:55.81
>>339-340
>シートオフジェクトは最初からあるからだったりするのか?

多分そう。

Cell オブジェクトなんてものがあれば、Cells("A1") Is Cells("A1") が
True になるかもしれないけど、VBA には、Cell オブジェクトはなくて、
(*仮に単一のセルだとしても) 常にRange オブジェクトになってしまう。

Range オブジェクトは、当然範囲の情報を持つ必要があるので、
Obj = ActiveCell とやる度に、各々別の Range オブジェクトが「生成」される。

と言うのが、>>329 の答えだと思う。
355デフォルトの名無しさん:2011/12/19(月) 23:21:41.47
>>353
>public変数使わない方が良い理由が分からん

必要ない奴に見せたがることはないだろ。
356デフォルトの名無しさん:2011/12/19(月) 23:23:37.89
ユーザーフォーム間で変数やり取りとかするときにどうしてもpublic使いたくなる
それでもやっぱりpublicには抵抗がある
357デフォルトの名無しさん:2011/12/19(月) 23:32:17.87
パブリックプロパティならいいんじゃない
358デフォルトの名無しさん:2011/12/20(火) 01:07:18.25
>>353
プログラムの規模が大きくなった時にバグの元になりやすいっていう経験則だよ
今はまだピンと来なくても、先人の言うことは聞いておいた方がいい
359デフォルトの名無しさん:2011/12/20(火) 07:37:37.21
逆にPublic変数を使った方がいいっていうシチュエーションはあるのかな
360デフォルトの名無しさん:2011/12/20(火) 07:50:40.39
Public変数

メリット:小規模プログラムで受け渡しI/Fを考えなくて良い

デメリット:クラス間の結合度が問題になる(再利用しにくくなる)

位?

ところでVBAって
ユーザー定義型変数の参照渡しをプロシジャ引数で渡せたっけ?
もちろんPublicで型宣言しておいて。
なんだか言語仕様上ダメだった記憶がある。

変数クラスを定義してそのクラスのインスタンスをローカルで定義して
参照渡ししないとダメだった記憶もある。

なので、ユーザーフォームクラスとの受け渡しはPublic使った様な記憶
がある。
361デフォルトの名無しさん:2011/12/20(火) 11:09:24.62
>>360
矢切りの渡しでなら渡せる
362デフォルトの名無しさん:2011/12/20(火) 13:33:28.48
矢切の渡しってたまに聞くけどどういう意味なの?
調べてもそれっぽいのでてこないけど
363デフォルトの名無しさん:2011/12/20(火) 15:58:55.11
ListViewのSortOrderって昇順と降順しかない?
1,5,10,50,100
とあるとしても
1
10
100
5
50
となってしまいます
これを
1
5
10
50
100
のようにできないですか?
364デフォルトの名無しさん:2011/12/20(火) 19:23:33.25
>>362
だよな。それが心のこりだわ。
365デフォルトの名無しさん:2011/12/20(火) 19:43:09.87
Functionプロシージャ内でSubプロシージャって呼び出せますか?
自分でやったらダメでしたが、何か方法があれば教えてください。
366デフォルトの名無しさん:2011/12/20(火) 20:27:23.48
普通に呼べるが
367デフォルトの名無しさん:2011/12/20(火) 21:16:35.69
>>366
具体的には、シートで「=Function名(引数値)」って書いたんですが
Function中のSubが実行されないのが疑問になっています。普通に呼べますか?
368デフォルトの名無しさん:2011/12/20(火) 21:36:46.56
呼べる。MsgBox入れてみればわかる。
369デフォルトの名無しさん:2011/12/20(火) 21:45:52.54
あ、MsgBoxは動きました。有難う御座います。
自分がしたいのは、ワークシートのA1をクリアする様なSubを
Function中から呼び出す様にして、そのワークシートで
=Function名(引数)
とA1以外のセルで書いて、シートのA1をクリアすることです。
370デフォルトの名無しさん:2011/12/20(火) 21:51:56.35
求むESPer
371デフォルトの名無しさん:2011/12/20(火) 21:58:53.06
372デフォルトの名無しさん:2011/12/20(火) 22:19:19.93
>>371
おお、有難う御座います!そうか、できないのかぁ。セルの総和とかで
クリアするかどうかをFunctionで判定して消去、ってやりたかったなぁ。
373デフォルトの名無しさん:2011/12/20(火) 23:17:07.48
関数でシート操作をしたいんだろうけど
更新処理をフックにするくらいだろうなあ
374デフォルトの名無しさん:2011/12/21(水) 03:41:16.16
>>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で渡すことはできません
ってコンパイルエラーになった

できないのは値渡しと矢切りの渡しだな
375360:2011/12/21(水) 07:31:46.89
>>374

申し訳ないですが、言葉がごっそり抜けてました。

-----------------------------------------------------

(誤)
ところでVBAって
ユーザー定義型変数の参照渡しをプロシジャ引数で渡せたっけ?

(正)
ところでVBAって
標準モジュールでGlobal定義されたユーザー定義型変数の参照渡しを
標準モジュールからクラスモジュールのプロシジャに
プロシジャ引数で渡せたっけ?

-----------------------------------------------------

同一クラス内や標準モジュール内で渡せるのは知ってます(実際にできているので)。
標準モジュールからクラスモジュールのプロシジャに渡そうかなと思って書いたら、
VBAから怒られた。

解決方法は、
クラスモジュールにユーザー定義型変数だけPublic定義したクラスを定義して
そのクラスのインスタンスを標準モジュールに定義してからそのObjectを参照渡しする。

だけど、面倒なので、サクッと渡せないかなぁ、とおもっだだけです。
376デフォルトの名無しさん:2011/12/21(水) 07:33:57.50
>>375
Friendでいけたような記憶が
377360:2011/12/21(水) 07:34:45.04
あと、

矢切りの渡しって
「global宣言されたユーザー定義型変数を標準モジュールからクラスモジュールのプロシジャに参照渡しする」
の意味でしょうか?
隠語を良くしらないので(不勉強済みませんが)。
378360:2011/12/21(水) 07:37:20.28
>>376
Friendも試したけどダメだった様な記憶があります。
VBだと可能らしい(VBは使ったことないですが)。

というので混乱した覚えがあります。
379デフォルトの名無しさん:2011/12/21(水) 08:19:02.97
>>377
昔、矢切の渡しってヒット曲があっただけのおっさんジョークだからあまり真面目に受け取るなよ… w
380360:2011/12/21(水) 08:23:29.73
りょうかい。
まぁ、ワシも40過ぎのおっさんですけどねw
381デフォルトの名無しさん:2011/12/21(水) 16:50:38.27
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
質問あげ
383デフォルトの名無しさん:2011/12/21(水) 20:42:08.31
そのOSパチモンだよ
384381:2011/12/21(水) 21:14:08.81
うわどういう間違いしてんだorz
OSはXPです……
385381:2011/12/21(水) 21:15:50.46
自ら晒しageしてしまった…
386デフォルトの名無しさん:2011/12/21(水) 22:05:49.76
アドンズからリムーブしてみては?
387デフォルトの名無しさん:2011/12/21(水) 22:17:31.77
>>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だから、それ以前のバージョンではどうかしらんが、問題なさそうだ
具体的にどういうエラーが出てたのか気になる
388360:2011/12/21(水) 23:13:55.10
どうもです。

私は2003で駄目だったんですが、
VBA6.Xという意味では同じですかね?
ただ、やったのが2年位前だったんで?です。

ユーザー定義型のサイズが数10KBクラスなので
その辺が怪しいのかも?

ありがとうございました。
389360:2011/12/21(水) 23:21:38.00
あ・・・思い出した

String型がメンバに含まれてました。
サイズを指定してないので動的変数ということになるので
その辺も影響しているかもです。
それと、ユーザー定義型のメンバに他のユーザー定義型を含んでます。


エラーメッセージは・・・・忘れてしまいましたが、
何となく理由が分かった様な気がします。
ありがとうございました。
390381:2011/12/22(木) 09:50:46.01
>>386
いろいろやってみましたが、リムーブの仕方がわかりません…
諦めて手動でやってもらう手順にするしかないかな…
391デフォルトの名無しさん:2011/12/22(木) 12:38:16.17
VBAと相性の良い言語って何がある?
392デフォルトの名無しさん:2011/12/22(木) 12:53:13.38
相性ってどういうこと?
どの言語でも組み合わせて使うという発想はあんまりないと思う
目的で使い分けるのが普通じゃないのかな
393デフォルトの名無しさん:2011/12/22(木) 13:26:58.68
Excelとって意味なら.NETかな
394デフォルトの名無しさん:2011/12/22(木) 14:16:46.86
VBSとか
395デフォルトの名無しさん:2011/12/22(木) 14:24:48.00
ActivePerl+WIN32::OLE
396デフォルトの名無しさん:2011/12/22(木) 14:55:45.37
webとデータのやり取りをするって意味です
397デフォルトの名無しさん:2011/12/22(木) 15:14:31.06
もしかして探してるのはアドインとかライブラリ?
398デフォルトの名無しさん:2011/12/22(木) 20:49:09.81
VBAが言語である事を知らないのでは
399デフォルトの名無しさん:2011/12/22(木) 20:54:01.96
入出力にExcelのワークシートを使って、演算処理は高速なCでやりたいとか
400デフォルトの名無しさん:2011/12/22(木) 21:39:15.79
>>399
> 演算処理は高速なCでやりたいとか

そんなこと思いつく奴の質問とは思えないが…
401デフォルトの名無しさん:2011/12/22(木) 23:02:43.63
3ステップで学ぶExcelVBA入門終わったんだが、次にオススメの課題有りの参考書オススメ無いですか?
402デフォルトの名無しさん:2011/12/22(木) 23:05:35.35
横から失礼します。
>>399
>入出力にExcelのワークシートを使って、演算処理は高速なCでやりたいとか
ちなみにこれの実現方法としては、例えばどんなのがあるんですか?
403デフォルトの名無しさん:2011/12/22(木) 23:37:59.06
404デフォルトの名無しさん:2011/12/23(金) 10:03:27.62
FromにTimerを貼り付けるには?
405デフォルトの名無しさん:2011/12/23(金) 10:42:30.15
>>404
>Fromに

それは難しそうだ、その From とやらを作っている会社に問い合わせるべき。
406デフォルトの名無しさん:2011/12/23(金) 11:20:34.71
[タイマーコントロール] クラスモジュール
Tips15: VBAでも出来る [ タイマーコントロール ] クラスモジュール (Ver 3.0)
http://www.h3.dion.ne.jp/~sakatsu/Excel_Tips15.htm

Fromってなんやねん w
Formだろ
407デフォルトの名無しさん:2011/12/23(金) 11:28:49.53
Excel.Application.Visible = False
ブック作成

★ループ★
シート追加
ペースト
★ループ★

マクロ動作中に他の作業(ブラウザ使う)とかができない・・・(正確には画面がチカチカする)
完全にバックグラウンドで動作させるのは無理なのかな?
408404:2011/12/23(金) 13:36:54.66
>>405
アホ

>>406
ありがとうございます!
やっぱり標準機能ではないのですね
でも工夫すればできるということなんですね
409デフォルトの名無しさん:2011/12/23(金) 15:58:49.73
タイマーコントロールってVBAで出来たんだっけ
.netは標準装備だったけど
410デフォルトの名無しさん:2011/12/23(金) 19:21:34.60
APIのSetTimerとか使った自前実装っぽい。
411デフォルトの名無しさん:2011/12/23(金) 21:16:35.17
なんでググらないんだろうな
タイマーの実現方法調べるのに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
>>412
http://home.att.ne.jp/zeta/gen/excel/c04p28.htm
↑を読めば分かると思うけど、Activateの反対はDeactivate

そして、Load、Unload、Show、Hideはメソッドで
Activate、Deactivate、Initialize、Terminateはイベント
414デフォルトの名無しさん:2011/12/23(金) 22:35:00.40
>>387
こういう似非オブジェクト指向が面倒だからVBAではPublicばっか使ってるわ
vba程度で大規模なもんつくらねーし
415413:2011/12/23(金) 22:35:43.53
>>413はちょっと書き方に配慮が足りなかった。
(メソッドとイベントの対応が分かりにくい書き方になってた)

LoadするとInitializeイベントが発生して、
Showでイベントが発生する。
HideするとDeactivateイベントが発生して、
UnloadでTerminateイベントが発生する。

LoadしないでShowすると自動的にLoadされてShowするし、
HideしないでUnloadしても自動的にHideされてUnloadする。
416413:2011/12/23(金) 22:37:50.21
度々スマン
なぜか抜けてた
誤:Showでイベントが発生する。
正:ShowでActivateイベントが発生する。
417デフォルトの名無しさん:2011/12/23(金) 22:40:19.38
>>407
できるっしょ
418デフォルトの名無しさん:2011/12/24(土) 04:42:11.86
特定のセルにコントロールを移したときに
そのセルに文字を入力したいのですがどうすればいいですか?
419デフォルトの名無しさん:2011/12/24(土) 04:58:05.63
>>418
SelectionChangeイベント
420418:2011/12/24(土) 05:01:13.86
>>419
ありがとうございます
421デフォルトの名無しさん:2011/12/24(土) 05:56:28.60
>>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
>>417
うまいっしょ?
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閉じたら残らんけど閉じるまで残ってるのが嫌なの
428デフォルトの名無しさん:2011/12/24(土) 20:03:07.59
>>422
LoadはShowするまえに初期化とかするために必要なんで、Showで代用はできんぞ

Load,Unloadはもともと既定のインスタンスを生成する命令で、インスタンスの概念がなかった時代の名残だからな

>>427
本来ならすべての参照が切れたら、適切なタイミングで消されるはずなんだが
このへんはカーベージコレクタの動作とか絡んでるからなぁ

既定のインスタンス使うならLoadは代用がないだろうし、Unloadもすべきかもしれん
既定のインスタンス使わないならLoadは不要だろう
UnloadはNothing代入とセットで使うなら良いんじゃね
429デフォルトの名無しさん:2011/12/25(日) 10:34:22.39
ガベージコレクションは無いよ
430デフォルトの名無しさん:2011/12/25(日) 12:26:15.52
あるメンバーサイトにログインして、目的のデータ取得してセルに表示するやり方分かる人いる?
431デフォルトの名無しさん:2011/12/25(日) 12:37:49.52
お前はVBAと相性のいい言語でも探してろ
432デフォルトの名無しさん:2011/12/25(日) 22:35:42.79
ここでいいのか知らないが
VBEのコード記入する画面の文字の色とか背景色って変えれる?
433デフォルトの名無しさん:2011/12/25(日) 22:47:15.64
調べれば3秒で分かるだろ
434デフォルトの名無しさん:2011/12/25(日) 23:01:51.31
3秒では無理だった
どうやったら3秒で調べられるん?
435デフォルトの名無しさん:2011/12/26(月) 00:41:43.80
どうやればいいと思う?
436デフォルトの名無しさん:2011/12/26(月) 07:48:56.35
答えがわかってて、それを表示するだけなら3秒
調べるのは無理
437デフォルトの名無しさん:2011/12/26(月) 07:51:52.86
色の変更はオプション→エディタの設定
438デフォルトの名無しさん:2011/12/26(月) 12:40:40.84
>>363
これ分かる方いませんか?
ListViewのノードが数でソートすると数の大小で並び替えができるか、です
439デフォルトの名無しさん:2011/12/26(月) 12:51:41.31
>>438
自分はわからん
別列作って文字列などで桁そろえてソートすれば解決するような気もする。
440デフォルトの名無しさん:2011/12/26(月) 13:51:29.37
1→0001
50→0050
みたいにしてあとで0取ればいいんじゃね?
441デフォルトの名無しさん:2011/12/26(月) 15:08:52.08
環境 WindowsXP SP3、excel2003です。

処理が終わったブックを保存する時に、マクロは含めずに
シートのみ保存するマクロってどうすればいいでしょうか?
別名保存で出来るかと思ったのですが、マクロファイルを外す
ような項目が見あたらなくて、わからなくなってしまいました。
442デフォルトの名無しさん:2011/12/26(月) 15:15:38.30
この辺参考にすればいいんじゃね
http://www.officetanaka.net/excel/vba/vbe/index.htm
443デフォルトの名無しさん:2011/12/26(月) 21:57:58.10
>>441
VBAマクロ入りのをアドインでセーブ。
そのアドインをExcel に登録すればマクロ無しで行けることになる。

バージョン管理ツールで管理しやすくなるし、pj内で共用しやすくなる
444デフォルトの名無しさん:2011/12/26(月) 22:10:13.08
>>441
単純にシートを新しいブックに移動またはコピーしてそれを保存するってのはどうかな?
445デフォルトの名無しさん:2011/12/27(火) 08:48:23.35
>>442-444
今回は444さんの方法で出来ましたが、
アドインは思いつきませんでした。

ありがとうございます。
446デフォルトの名無しさん:2011/12/27(火) 19:08:40.83
アドインがいいと思うけどなぁ
シートコピーは1セル256文字?制限あるし。
数文字程度の欠けだと誰も気付かないまま被害が拡大して…
447デフォルトの名無しさん:2011/12/27(火) 23:16:49.93
入力されているセル範囲の最終行が知りたくて
Dim R As Range
R=ActiveSheet.UsedRange
って、やってRから 最終業を取り出そうとしたんだけど、「オブジェクト云々」とエラーが出ます。
なんか間違ってる?
448デフォルトの名無しさん:2011/12/27(火) 23:35:09.40
うん間違ってる
449デフォルトの名無しさん:2011/12/27(火) 23:44:59.95
Set R=ActiveSheet.UsedRange
450デフォルトの名無しさん:2011/12/27(火) 23:48:15.48
何が間違ってるってその姿勢だよね。
エラーメッセージを読む気すらないっていう。
451デフォルトの名無しさん:2011/12/28(水) 02:15:18.09
ユーザーフォームのリストビューで
カラムをクリックしたときにクリックしたカラムの2行目のテキストを取得するにはどうしたら良いでしょうか
452デフォルトの名無しさん:2011/12/28(水) 06:18:20.46
SETの使い分けが分からん
代入する時は基本的に付けるもの?
453デフォルトの名無しさん:2011/12/28(水) 07:07:36.48
objectの参照のときにだけつける
454デフォルトの名無しさん:2011/12/28(水) 07:37:45.25
ヘルプ嫁
455デフォルトの名無しさん:2011/12/28(水) 07:47:51.73
ずぐだんずんぶんずんゲームやるときにつける
456147:2011/12/28(水) 08:26:45.66
俺も分からん。
For Each文や、関数での授受時にSetが要るのか要らんのかさぱーり理解できん。

For Each Set obj in collection とか、
Set objResult = funcMine(Set objArg) とか。
457デフォルトの名無しさん:2011/12/28(水) 09:47:58.52
=も代入じゃん(比較もするけど)
区別する必要って何?
458デフォルトの名無しさん:2011/12/28(水) 11:58:37.21
>>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に表示されません。
初歩的で大変すみません。よろしくお願いします。
460デフォルトの名無しさん:2011/12/28(水) 15:52:12.75
何がしたいのかわからん
日本語の初歩からやり直せ
461デフォルトの名無しさん:2011/12/28(水) 17:40:40.99
>>459
多分動いてるんじゃね?
マクロ実行押さないと何も動かない。
event で動かしたいならsheetモジュールの予約されたプロシジャに書けば?
462デフォルトの名無しさん:2011/12/28(水) 17:43:15.26
>>451
これ分かる方いませんか?
463デフォルトの名無しさん:2011/12/28(水) 18:01:44.22
459です。すみません。割愛しすぎました。
cells(3,3)の部分に、たとえば任意で4や5といった数字を入れて
エンターキーを押すと自然に作動してほしいということです。
実行ボタンを押さずにということです。ただ単にそこのセルに数字を打ち込んで
エンターを押すだけで作動という意味です。

失礼します。
464デフォルトの名無しさん:2011/12/28(水) 18:05:35.49
>>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


にいれたのですができませんでした…
466デフォルトの名無しさん:2011/12/28(水) 18:39:28.18
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
467デフォルトの名無しさん:2011/12/28(水) 21:26:12.73
>>462
そもそも俺のエクセルのユーザフォームにはリストビューなんてないんだが
何をつかってるんだ
468デフォルトの名無しさん:2011/12/28(水) 22:08:27.26
Microsoft list view control 6.0です
469デフォルトの名無しさん:2011/12/28(水) 22:11:43.56
MsgBox りすとびゅー.SelectedItem.SubItems(2)
470a:2011/12/28(水) 22:15:38.89
>>469
SubIrems(1)かも
471デフォルトの名無しさん:2011/12/28(水) 22:31:10.27
行と列が逆だったか?

Private Sub りすとびゅー_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
MsgBox りすとびゅー.ListItems(2).SubItems(ColumnHeader.Index - 1)
End Sub
472デフォルトの名無しさん:2011/12/28(水) 23:13:24.34
>>471
できました!
ありがとうございます
473デフォルトの名無しさん:2011/12/29(木) 00:21:59.00
UserFormをModelessで二つ以上開いてるときにエラーでたら強制終了するのは仕様?
474デフォルトの名無しさん:2011/12/29(木) 10:45:54.58
あるセルに入力規則でドロップダウンリストの設定がしてあるのですが、
それをボタンを押せば、入力規則の設定を消すマクロを組みたいのですが、
clearではだあめなようで、どうすればいい?
475デフォルトの名無しさん:2011/12/29(木) 10:58:02.14
>>474
Validation
476デフォルトの名無しさん:2011/12/29(木) 11:43:53.83
トリミングするために CropTopなどに値を整数を入れるのですが
Debug.Print CropTop を実行すると 値が変更されてしまいます。


CropTop = 80
Debug.Print CropTop = 79.998

この現象を回避したいのですが
どうしたらよいでしょうか?
477デフォルトの名無しさん:2011/12/29(木) 12:14:23.53
>>476
何か問題でも?
478デフォルトの名無しさん:2011/12/29(木) 12:21:59.85
もそっとくわしくおねがいしまふ
479デフォルトの名無しさん:2011/12/29(木) 12:28:39.81
.Delete
480デフォルトの名無しさん:2011/12/29(木) 12:32:12.17
>>47 さんへでふ。 もそっとくわしくおねがいしまふ
481デフォルトの名無しさん:2011/12/29(木) 12:32:46.14
>>475さんへです
482デフォルトの名無しさん:2011/12/29(木) 12:40:41.34
>>481
.Delete
483デフォルトの名無しさん:2011/12/29(木) 14:30:45.27
>>466
本当にすみません。マクロを作るときは
マクロを選択して、名前を作って作成というボタンを押すんですよね?
それに466さんが張り付けてくれましたコードをそのまま入れましたら
できませんでした。。。


すみません。よろしくお願いします。
484デフォルトの名無しさん:2011/12/29(木) 15:49:57.18
>>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



非常に簡単なんですが、シートに書き込むことができません。どうすれば
書き込めますか?
フォームを作って、クリックボタンを一つ作っています。
486デフォルトの名無しさん:2011/12/29(木) 17:30:08.52
>>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


の部分にエラーが出てしまいます;
488デフォルトの名無しさん:2011/12/29(木) 19:24:38.06
>>483
標準モジュールに作ってない?
WorkSheetの関数として実装するんだよ?
489デフォルトの名無しさん:2011/12/29(木) 19:25:13.73
>>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
490デフォルトの名無しさん:2011/12/29(木) 20:13:23.66
エラーメッセージを読むことを覚えよう
491デフォルトの名無しさん:2011/12/29(木) 20:19:06.38
Cell(a, b).Value = c

Cell じゃなくて
Cells だろ?
492デフォルトの名無しさん:2011/12/29(木) 20:25:51.15
エラーメッセージなんて読んでも意味わかんねーし
つべこべ言わずに答えを教えろやカス
お前らそれくらいしか取り柄がないんだろ?
493デフォルトの名無しさん:2011/12/29(木) 20:40:38.71
>>492はにせものです
494デフォルトの名無しさん:2011/12/29(木) 20:44:04.22
(でも本音です)
495デフォルトの名無しさん:2011/12/29(木) 21:04:15.31
行列の掛け算同士って
for構文を使うのだと思いますがどうすればよいのでしょうか?
試行錯誤するのですが非常に複雑です。。。
496デフォルトの名無しさん:2011/12/29(木) 21:06:45.45
>>492
> エラーメッセージなんて読んでも意味わかんねーし

エラー箇所でF1押してヘルプを読むのは役に立つと思うけどな
497デフォルトの名無しさん:2011/12/29(木) 21:14:23.88
>>495
何をやりたいのかわからんが
Worksheetfunction.MMult
じゃ駄目なのか
498デフォルトの名無しさん:2011/12/29(木) 23:15:20.75
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)
499デフォルトの名無しさん:2011/12/29(木) 23:16:42.15
>>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

調べたらこれが出てきましたがまったくわかりません。。。
502デフォルトの名無しさん:2011/12/30(金) 08:39:20.75
>>501
worksheetfunctionで結果がでるならそれでいいじゃない
なんか問題あるの?

もしも 万が一 宿題なら自分でやろうぜ
あと
>>2 ★5 な
503デフォルトの名無しさん:2011/12/30(金) 08:42:37.47
行列の積の計算手順と、最低限度のプログラミングが理解できていれば、
悩むことではないと思うのだが。
504デフォルトの名無しさん:2011/12/30(金) 08:57:12.87
505デフォルトの名無しさん:2011/12/30(金) 09:39:02.37
>>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
507デフォルトの名無しさん:2011/12/30(金) 09:46:42.32
それはたいへんですね。ごしゅーしょーさまです。
508デフォルトの名無しさん:2011/12/30(金) 09:49:00.68
>>504

そのリンク先が>>503と何の関係が有るのかは分からないけど、
今の教育現場が酷いことになってるのは分かった。
509デフォルトの名無しさん:2011/12/30(金) 09:55:32.45
>>506
構文でたらめじゃねーか
でも並べかえれば動きそうな気がするし
さて、おちょくられているのかな
510デフォルトの名無しさん:2011/12/30(金) 10:03:24.56
>>506
sh.activate追加で
511デフォルトの名無しさん:2011/12/30(金) 10:20:57.78
>>504
単位を省略しなければどちらも正解

○ 6本/人 × 8人=48本
○ 8人 × 6本/人=48本
? 6本 × 8人=48?
? 8人 × 6本=48?
512デフォルトの名無しさん:2011/12/30(金) 10:30:47.97
きっとその先生はCPU のbit数を意識して、演算結果が飽和しないように式を組む癖を叩き込みたいんだと思いますん。
513デフォルトの名無しさん:2011/12/30(金) 10:50:54.62
ふつーCPUの演算では飽和しません
514デフォルトの名無しさん:2011/12/30(金) 11:05:36.54
セル番地を指定するのにrangeとcellsが混在しているとみっともないでしょうか
515デフォルトの名無しさん:2011/12/30(金) 11:26:10.43
ユーザーフォームにラベルとテキストボックスを配置しました。
フォントは同じでサイズも同じですが
高さがズレて表示されます。

見た目の高さを揃えるにはどうしたらよいですか。
よろしくお願い申し上げます。
516デフォルトの名無しさん:2011/12/30(金) 11:31:12.49
>>514
そもそもcellsはrangeを返すプロパティ
これを踏まえてどう思うか
517デフォルトの名無しさん:2011/12/30(金) 11:39:08.66
>>516
偉大な>>514様は、例えば左上のセルを Cells(1,1)と書くのとRange("A1")と書くことの違いが分かっておられないと思う。
その説明じゃなんのことは分かりやすく伝えてないから、説明になってないと思うぞ。
もう少し分かりやすく説明して差し上げたら?
518デフォルトの名無しさん:2011/12/30(金) 11:39:41.44
>>509
この構文のどのへんがだめなんでしょうか
よろしかったら教えてください
519デフォルトの名無しさん:2011/12/30(金) 11:51:51.00
>>518
条件付き書式でいいんと思うんだがCase "1"とSelect Case c.Valueが逆だろ?
Case "1"よりはCase 1だと思うが
520デフォルトの名無しさん:2011/12/30(金) 11:53:14.65
それにたった一つの分岐ならSelect Case使うまでもねーな。
Ifで充分。
521デフォルトの名無しさん:2011/12/30(金) 11:58:18.99
>>519
逆と言われて、こうしたりして

Select Case c.Value
c.Interior.ColorIndex = 7
Case "1"
End Select
522デフォルトの名無しさん:2011/12/30(金) 12:02:35.62
そうだな。
まぁ色々と並べ替えてやってみんしゃい。
それにしてもAA:ARのすべてのセルを調べるのもなんだかねぇ。
せめてUsdRangeとの共有セルにした方がいいと思うね。
523デフォルトの名無しさん:2011/12/30(金) 12:52:16.18
もしかして、Excel2007以降だと104万行全部調べる羽目になるの?
524デフォルトの名無しさん:2011/12/30(金) 14:30:32.28
104万8576行*18列*シート数だね
おわりゃしねえ
525デフォルトの名無しさん:2011/12/30(金) 15:30:07.14
3シートでやってみた。たしかにそうだ (^-^*)
526デフォルトの名無しさん:2011/12/30(金) 22:09:50.25
急いでます。

=PRODUCT(A1:B1)
=PRODUCT(A2:B2)

と同様に一気に計算する方法ってどうやるんですか?
527デフォルトの名無しさん:2011/12/30(金) 22:22:07.30
>>526
とりあえず落ち着きんっさい
528デフォルトの名無しさん:2011/12/30(金) 22:26:13.26
Excelだと、スロットゲームとか作れそうだけど、
どこかにサンプルないかな?
お勉強にしたい。
529デフォルトの名無しさん:2011/12/30(金) 22:44:33.57
● 2005年5月23日号 file NO.004 イカサマ・スロットマシンを作れ
http://pc.nikkeibp.co.jp/npc/download/excel_taskforce.html
530デフォルトの名無しさん:2011/12/30(金) 22:47:37.64
テーブルからの検索でなるべく早い方法ってなんでしょうか。データ量によりいろいろ方法あると思いますが。
特に列二つか三つに一致するデータを検索する使い方が多いので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列で一致するような使い方が出来なくて。
531デフォルトの名無しさん:2011/12/30(金) 23:18:26.87
Accessとか使った方がいいんじゃない
532デフォルトの名無しさん:2011/12/30(金) 23:19:05.88
検索した上で何がしたいのかによる
533デフォルトの名無しさん:2011/12/30(金) 23:28:11.74
>>530
検索キーの構造が単純なら、キーを結合した上でVLOOKUPするとか。
この場合だと、IDとNameをそれらで絶対に使われない文字を挟んで繋いでやれば
単一キーとして利用できる。
534デフォルトの名無しさん:2011/12/31(土) 00:00:19.43
WinXP Excel2000で作っていたときは問題なく動作をしていたのですが
Win7 Excel2010で実行すると
エラー番号1004'Range'メソッドは失敗しました'_Global'オブジェクト
とでました
問題の箇所は
UserForm2.Show vbModeless
ここです
コード自体は間違っていないと思うのですが環境の変化によって何が変わりエラーがでたのでしょうか
535デフォルトの名無しさん:2011/12/31(土) 00:08:41.33
どっかでみたコピペだな
536デフォルトの名無しさん:2011/12/31(土) 01:54:14.77
コピペじゃなくて真剣に悩んでます
537530:2011/12/31(土) 02:16:34.54
ありがとう
>>533
ワークシート関数で作業列で結合してそれでVLOOKUP使ってるのを見た事
ありますがそういう事ですね。

>>532
この質問では何がという特定の目的はありませんでした。ほかの検索方法
があれば知りたいなと思って。

>>531
アクセスっぽい事をエクセルでやりたいのです。どの会社行ってもエクセル
は必ずあるけどアクセスはあんまり見ないですし。
538デフォルトの名無しさん:2011/12/31(土) 02:50:44.07
ただ検索して知りたいだけなら、VBA使わずに手動でオートフィルタだが。
VBAでオートフィルタって手もあるけど。だからどういうことをやりたいのか聞いた。
539デフォルトの名無しさん:2011/12/31(土) 03:33:04.00
エクセル97のおんぽろ会社PCで400行×20列くらいのデータ抽出を
数式のコピペだけでやって10秒ほど?で出来てるけどそれより早いなら解からん
540デフォルトの名無しさん:2011/12/31(土) 09:24:49.34
>>537
AccessなしでもAccessデータベースを扱うことは可能
他にもタダで使えるデータベースはあるから使い途によっては選択肢に入れてもいいかもね
でもいろいろ敷居が高いかな
541デフォルトの名無しさん:2011/12/31(土) 10:23:56.08
>>540
ようするに会社のパソコンで必ず使える物ならいいのでエクセルで無理やり頑張るより無料のデータベース
勉強する方が良いかもしれないですね。
542デフォルトの名無しさん:2011/12/31(土) 11:04:55.91
現状の配列方式で5000〜1万件ってそんな時間かかるものなん
条件合致したら、ループ抜けるんだよね?処理は1回だけ
543デフォルトの名無しさん:2011/12/31(土) 11:57:37.43
エクセルの表に対してADO&SQLつかえば?
544デフォルトの名無しさん:2011/12/31(土) 11:58:53.89
遅いよ
545デフォルトの名無しさん:2011/12/31(土) 12:00:28.32
>>544
うん、わかった
546530:2011/12/31(土) 13:48:33.96
>>542
ダミーデータ1万行まで入れて一番下に入れた文字を検索してみたら0.015秒でした。
十分早いですね。
検索回数増えないようにロジック考えればこの方法で十分なんですね。


オートフィルタとか使わずに検索を一度に何十回とか繰り返してたのでそもそもそのへん
を考え直すべきなんですね。
547デフォルトの名無しさん:2011/12/31(土) 20:54:03.70
下記はどう使い分けるのが適切でしょうか?

vbCR
vbLF
vbCRLF
vbNEWLINE
548デフォルトの名無しさん:2011/12/31(土) 21:58:56.52
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

例えば
一番上と下のラインを以外の横の罫線を点線にしたい場合って
どうすればいいのでしょうか?
一応マクロの記録でやると何十行もの内容が出てる来たので
それは避けたいのですが
551デフォルトの名無しさん:2012/01/01(日) 03:19:29.13
全部書いてから横罫線だけ上書きするとか

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などといった数字が入り…といった感じです。


よろしくお願いします。
553デフォルトの名無しさん:2012/01/02(月) 11:23:58.46
馬鹿には無理
554デフォルトの名無しさん:2012/01/02(月) 11:27:47.75
試せばわかる

for i=1 to 2
for k=1 to 2
debug.print a(i, k)
next k
next i
555デフォルトの名無しさん:2012/01/02(月) 11:35:11.16
>>552
整理してそれかい
小学校からやり直せ
556デフォルトの名無しさん:2012/01/02(月) 11:40:20.99
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
557デフォルトの名無しさん:2012/01/02(月) 11:43:00.70
iとkなのが気持ち悪いんだが
558デフォルトの名無しさん:2012/01/02(月) 14:35:23.95
>>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ということなんでしょうか?
560デフォルトの名無しさん:2012/01/02(月) 15:42:01.97
>>559
そういうこと
>>501は、行列の要素を1個ずつ計算しZ(i, j)に格納している
561558: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()に代入して処理完了
562デフォルトの名無しさん:2012/01/02(月) 16:15:52.66
>>2 ★2 ★3 ★4
563デフォルトの名無しさん:2012/01/02(月) 16:21:30.23
>>552
> a(1,1)の部分には1が入り、a(2,2)の部分には2,また上の例には
> 対応していませんが、a(1,2)には3や4などといった数字が入り…といった感じです。

どうしてそうなると考えたのか?
564デフォルトの名無しさん:2012/01/02(月) 16:35:00.75
>>563
確かに行列積の計算方法そのものはわかってるとすると>>552が理解できれば>>501も理解できるのかもね。
565デフォルトの名無しさん:2012/01/02(月) 17:49:32.42
VBA以外触ったこと無いから分からないのですがクラスとはどういう時に使うものですか?
566デフォルトの名無しさん:2012/01/02(月) 18:50:19.08
中二病の発作を起こした時に作ってみるもの。
クラスにするまでも無かったと我に返ってコードを投げ捨てることも多い。
567デフォルトの名無しさん:2012/01/02(月) 19:28:21.82
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を見たところ全てのデータが含まれていました
上記のコードは正しくヘッダーがセットされていますか?
568デフォルトの名無しさん:2012/01/02(月) 19:29:07.19
最終行のhttp.SendはXMLhttp.Sendの間違いです
569デフォルトの名無しさん:2012/01/02(月) 19:53:32.95
もはやExcelと何の関係もないな…
570デフォルトの名無しさん:2012/01/02(月) 20:11:48.40
>>567
スレチ

If-Modified-Sinceは差分取得するもんじゃない
指定したLastTime以降更新されてなければ "304 Not Modified"が返る

と言う事で ここでは これ以上聞いてもスルーする
571デフォルトの名無しさん:2012/01/02(月) 20:38:19.33
>>567の件はぜんぜん分からないからスレチでなくとも俺は答えられないけど、
ちょっと便乗で質問。
ExcelのVBAでWebブラウザ制御するのって自動巡回扱いになるの?
この前仕事で某官庁のHPから統計データを引っ張るためにマクロ組んだら
上司にそれは自動巡回だからやっちゃだめって怒られた
(某官庁のHPには自動巡回ソフトの使用はご遠慮くださいって書いてあった)

IEをCreateObjectしてURLを自動的に生成(対象データの年度の部分を動的に変えるだけ)
して
表示されたらExecWBでSelectAll、Copy、して
クリップボードから.PasteSpecial でワークシートに貼り付けただけなんだけど、
そういうのも自動巡回ソフトに当たるんだろうか?
こんなの手作業をマクロに書き換えただけじゃんねぇ?
572デフォルトの名無しさん:2012/01/02(月) 20:48:30.88
手動じゃないなら自動でしょ
573デフォルトの名無しさん:2012/01/02(月) 20:53:04.69
>>572
いや、そういう意味じゃなくて自動巡回ソフトってサーバーに負担かけるからだめなんでしょ?
手作業でできることをマクロ化したところでサーバーにかかる負担なんて変わらないよねってこと
(一応、念のために適当にウェイトかまして速くならないようにはしてた。)
574デフォルトの名無しさん:2012/01/02(月) 21:07:27.85
わからんでもないが、それは配慮。
遠慮してくれってんだから、だめでしょ、やっぱり。
575デフォルトの名無しさん:2012/01/02(月) 21:19:46.08
手作業をマクロ化って自動化そのものじゃんねぇ?
576デフォルトの名無しさん:2012/01/02(月) 21:26:20.81
ねぇねぇ、思いつきだけど言って良い?




自動ポルノ。
577デフォルトの名無しさん:2012/01/02(月) 21:35:58.88
>>573
そう思うのならその某官庁とやらに説明して許可もらえばいいじゃん
そうでもしないと上司を納得させられないんじゃないの?

こんな所でグダグダ言ってても意味ないよ
スレ違いどころの話じゃないし
578デフォルトの名無しさん:2012/01/02(月) 21:45:23.60
うーん、結局釈然としないのは、
自動巡回ってもっと高度なことやってるもんなんじゃないか
っていう疑問が残るからなんだよね。

グーグルとかヤフーのクローラって(Robot.txtで排除できるらしいけど)
もっと直接HTMLのソースとか解析して根こそぎ情報取得するんでしょ?

そういうのがここでいう「自動巡回」なんじゃないかっていう気がしてるんですよ。
こちとらそんな高度なことできないから
普通にブラウザ開いて表示したページをコピペしてただけですから。

まぁ、上司に禁止されたからもうそのマクロは使えないんですけど、
もう少し上記の件に関する技術的なことを教えてもらえたら
って思って質問したんです。
(そういう方向の話になるとスレチっぽいんで答えてもらえないかもしれないけど)


579デフォルトの名無しさん:2012/01/02(月) 21:54:59.88
スレチっぽいって?
>>2読んでね
580デフォルトの名無しさん:2012/01/02(月) 22:51:45.08
>>578
LibraHackの件みたいな事もあるからね
581デフォルトの名無しさん:2012/01/02(月) 23:00:52.70
Static変数ってStatic変数を使う全てのプロシージャで宣言する必要ある?
582デフォルトの名無しさん:2012/01/02(月) 23:03:58.52
試せよ
583581:2012/01/02(月) 23:09:41.91
>>582
おまえのVBA力を試してるんだよ。
584デフォルトの名無しさん:2012/01/02(月) 23:11:39.79
VBA力とか言ってる時点で自分が格下なのに気付けよ
585デフォルトの名無しさん:2012/01/02(月) 23:14:46.33
>>584
だからおまえはみんなに嫌われるんだよ
586デフォルトの名無しさん:2012/01/02(月) 23:16:18.47
関係ない話で誤魔化さないでください
わかりもしない、答える気もない屑が掲示板を荒らすのは本当に不愉快です
587デフォルトの名無しさん:2012/01/02(月) 23:38:34.73
Publicを使わないでユーザーモジュール標準モジュールからアクセスでき
モジュールが終了しても記憶しておく変数を宣言することは可能ですか?
セルを使用する以外でお願いします
588デフォルトの名無しさん:2012/01/02(月) 23:44:08.08
public使えよ
589587:2012/01/02(月) 23:51:54.46
Publicを使わないでと言っておるんだよ
590デフォルトの名無しさん:2012/01/02(月) 23:57:06.02
>>560、561
大変ありがとうございます。理解できました。
しかし、したの例のように試してみると、たとえばz(1,1)の部分に
数字を入れることができなかったです。。。

Sub test()
Dim z() As Double
z(1, 1) = 1
Cells(1, 2).Value = z(1, 1)
End Sub

591デフォルトの名無しさん:2012/01/02(月) 23:58:00.87
>>589
どうせ別人だろうけど
temp.txtとか作ってそこに値いれとけばいいんじゃね
592デフォルトの名無しさん:2012/01/02(月) 23:59:44.13
>>587
Textファイルに書き出せばセルもパブリック変数も使わないで済む

こういう頓知解答がNGなら不可能
593デフォルトの名無しさん:2012/01/02(月) 23:59:48.64
ホント酷いな
594デフォルトの名無しさん:2012/01/03(火) 00:13:55.85
>>590

Z()を宣言しただけじゃZが2次元配列とは限らないから
Z(1,1)に値は入れられない。

はじめから
Dim Z(1,1) As Double
みたいに2次元配列で宣言するか
Redim Z(1,1)で配列の再宣言するかしなきゃ駄目
(あとはVariantで宣言する方法なんてのもあるけど割愛する)

とにかくこういうのは基本的な事なんで、
ここで聞く前にまず自分で調べるべき話。
595デフォルトの名無しさん:2012/01/03(火) 00:19:40.84
自分で調べるようになって欲しいと思ってるならそこまで甘やかすなよ
596デフォルトの名無しさん:2012/01/03(火) 01:37:06.79
>>587
Static変数をプロシジャの引数として参照渡しする。
変数クラスを定義してそのインスタンスを参照渡しする。

矢切の渡し。
597デフォルトの名無しさん:2012/01/03(火) 01:38:59.07
あ。。( ̄▽ ̄;)。

まちごた。
忘れてくれ。
598デフォルトの名無しさん:2012/01/03(火) 02:54:00.11
だからクラスってなんだよ
599デフォルトの名無しさん:2012/01/03(火) 10:12:58.79
>>598
>>566

簡単に言うと、必要なければ使ってはいけないものだ。
600デフォルトの名無しさん:2012/01/03(火) 11:04:24.57
>>590
www.eurus.dti.ne.jp/yoneyama/Excel/vba/vba_array.html
601デフォルトの名無しさん:2012/01/03(火) 11:34:21.90
>>587
セルに保存とかわらんが、BuiltinDocumentPropertiesとかUserFormのTagはときどき利用する。
602デフォルトの名無しさん:2012/01/03(火) 14:04:34.56
フォームモジュールにはあまり処理を書かない方がいいですか?
引用しようと思っても呼び出せないので
603デフォルトの名無しさん:2012/01/03(火) 14:17:23.88
他モジュールのSubを呼び出すのに、
Call Module2.TestProcess
のようにモジュール名をつけないとダメですか?
604デフォルトの名無しさん:2012/01/03(火) 14:24:11.79
みなさんのVBA力はその程度ですか?
605デフォルトの名無しさん:2012/01/03(火) 14:25:29.47
見ず知らずの人に無償で提供できる範囲はこの程度
606デフォルトの名無しさん:2012/01/03(火) 14:42:14.27
>>604
おまえのレス力は最低レベルだ。「レス力検定」でレス力を磨きなさい。
607デフォルトの名無しさん:2012/01/03(火) 15:41:39.69
わかりもしない、答える気もない屑は黙っていてください
608デフォルトの名無しさん:2012/01/03(火) 16:01:25.32
ここは、質問するのが自由なら
答えるのも自由だし、横やり入れるのも自由、そういう場ですよ

そういう場に自ら来ておいて、「回答以外はするな」はお門違い
ボウヤ、何勘違いしちゃってるの?ってな感じだ

横やりが嫌なら横やり禁止のとこ行け
609デフォルトの名無しさん:2012/01/03(火) 16:06:39.58
ここは、横やり入れるのも自由なら
縦やり入れるのも自由だし、「回答以外はするな」も自由、そういう場ですよ

そういう場に自ら来ておいて、>>608の書き込みはお門違い
610デフォルトの名無しさん:2012/01/03(火) 16:31:29.29
オマエモナー
611デフォルトの名無しさん:2012/01/03(火) 16:55:54.97
悔し紛れにオウム返しするも、的を射て無くて完全に負け犬の遠吠え状態w
612デフォルトの名無しさん:2012/01/03(火) 16:57:00.48
答える能力のない自分を顧みずに上から目線ですか
哀れな屑ですね
613デフォルトの名無しさん:2012/01/03(火) 17:03:53.01
遠吠え谺す
614デフォルトの名無しさん:2012/01/03(火) 17:23:29.76
ユウナレスカ検定一級ですがなにか
615デフォルトの名無しさん:2012/01/03(火) 18:29:34.79
ねえマジで
この程度の質問にも答えられないの?
大した事ないっていうか…お前ら…
好きなエクセルでもこんなレベルって
きっと他の分野じゃ本当に無能なんだろうな
616デフォルトの名無しさん:2012/01/03(火) 18:46:20.35
>>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以外のシートに作る必要があるのでしょうか?


何卒よろしくお願いします。
618デフォルトの名無しさん:2012/01/03(火) 20:23:11.61
×Nexti
○Next i
619デフォルトの名無しさん:2012/01/03(火) 20:29:03.06
早急なご返事大変ありがとうございます。
できました。
しかし、これは再生ボタンを押さないと表示されないです…
自動的に数字が変わる方法はご存じでしょうか?
よろしくお願いします。
620デフォルトの名無しさん:2012/01/03(火) 20:36:32.52
セルが変更された場合のイベントを補足して処理する
Worksheet_Change
とかで検索
621デフォルトの名無しさん:2012/01/03(火) 20:57:23.13
できました。本当にありがとうございました。失礼します。
622デフォルトの名無しさん:2012/01/03(火) 21:51:20.18
>>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型にしちゃっても良かったと思う。
623デフォルトの名無しさん:2012/01/03(火) 21:59:05.03
ハリキッテルネ!
624デフォルトの名無しさん:2012/01/03(火) 22:00:21.24
オマエモネ!
625デフォルトの名無しさん:2012/01/03(火) 22:11:50.50
ソクレス・・・スレカンシゴクロウサマデス!
626デフォルトの名無しさん:2012/01/03(火) 22:14:06.89
いや、たまたま新着レスがあったから
適当に書き込んだだけなんだけどw
627デフォルトの名無しさん:2012/01/03(火) 22:54:22.81
>>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とすることは可能なのでしょうか?
628デフォルトの名無しさん:2012/01/03(火) 23:06:28.37
その例では、20はリテラル値なんだから
a = UBound(x, 1)

a = 20
にすれば良いだけじゃん

20の部分が変数になったとしても、同じく
a = 変数
で事足りる

固定のリテラル値にしろ変数にしろ、前段階の処理でどこまで数字を
入れたかが解ってるんだから、配列から取得する必要など何も無い
629デフォルトの名無しさん:2012/01/03(火) 23:36:02.44
>>616
そこに気づいたか
だがもう一歩だ
630622: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とすることは可能なのでしょうか?

というのも何の事だかさっぱり意味が分からない。
できたらもう一度、意味が通じるように質問しなおしてほしい。
631デフォルトの名無しさん:2012/01/03(火) 23:46:56.36
ありがとうございます。
今、行列の計算のプログラムを作っています。
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
632デフォルトの名無しさん:2012/01/03(火) 23:47:48.94
'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つに分けて書き込みます。
何卒よろしくお願いします。
633デフォルトの名無しさん:2012/01/03(火) 23:52:11.31
>>630
すみません。もう一度理由を述べます。
なぜxboundで100ではなく20がほしかったのかというと、
自分が今から作ろうとするFEM法を使った方法でやると、
行列の数が40行くらいになってしまう可能性があるからです。
しかもその行列の数は、節点数によって変わってくるため(この辺は専門的ですみません;)
行列の数が予測できないため、最初にx(100,100)と置きました。
さすがに、100行列まではいかないだろうということで、です。

今回は試しに、20行列を作ってみたので、ひょっとすれば
xboundで20が出るのかな(つまり数字が入っているところまで)
と思いましたが駄目でした。

634デフォルトの名無しさん:2012/01/04(水) 00:07:00.57
当たり前だろ
635デフォルトの名無しさん:2012/01/04(水) 00:08:52.43
>>633
それは無理。
行列の数がわからないのであればRedimすればいい。
636デフォルトの名無しさん:2012/01/04(水) 00:16:13.38
>>633
あなたは>>501
637デフォルトの名無しさん:2012/01/04(水) 00:18:21.02
>>633
x(n, nn) に期待通り取り込まれているのは確認できているか
638デフォルトの名無しさん:2012/01/04(水) 00:19:00.82
もはや"xbound"とか勝手な事書いてるけど、
"UBound"ってのはあくまでも配列の上限を返す関数であって
その配列の中でどこまで実際に値が入ってるかを調べるものじゃないから
そういう使い方は出来ない。

っつーか貴方、ここ最近行列云々で質問続けてる人だったのね?
VBAのこと事前に学習してないでしょ?

試行錯誤は決して悪いことじゃないけど、
中途半端な知識でプログラミングして失敗するよりも
一度きちんと学習してからプログラミングしたほうが良いと思うよ。
どっち道失敗はするだろうけど、今みたいなどうでも良い間違いは減ると思う。
本を買うなりWeb上の解説サイトを読むなり、多少基礎知識つけてから出直したほうが
ゴールに早くたどり着けるはずだよ。
こっちだってこんなどうでも良いこと質問されるのも正直迷惑だし。
639デフォルトの名無しさん:2012/01/04(水) 00:23:42.80
>>637
今確認しました。期待通りではなかったです…
なぜか、yはすべての成分が121の3行5列で、
xはすべての成分が20の4行3列でした。
640デフォルトの名無しさん:2012/01/04(水) 00:31:33.33
>>639
For〜Nextが理解できていない
641デフォルトの名無しさん:2012/01/04(水) 00:37:38.67
すみません。。たしかにfornextの部分頭の中でやっておかしいですね。。。
もう昨日の夜の12時からまったくの不眠不休でほかの研究作業もやりながらなので
ぜんぜん思考回路が回っていません。

寝て、もう一度再プログラムしてみます。失礼しました。


642デフォルトの名無しさん:2012/01/04(水) 00:39:14.20
もうすこし自分で考えてきてから質問してね
ここの人たちだって貴重な時間を割いてアドバイスしてくれてるのよ
643デフォルトの名無しさん:2012/01/04(水) 09:05:14.29
答えたくて答えてるだけだろ
思いっきりスレチだから
答えてる方も荒らしだから
644デフォルトの名無しさん:2012/01/04(水) 10:18:47.09
Range("A100").Formula = "=countif(A1:A80,""<=2"")"
<=2の部分をA90の値にしたいのですがどう書けばいいんでしょうか
645デフォルトの名無しさん:2012/01/04(水) 10:34:11.32
"=countif(A1:A80,""" & Range("A90").Value & """)"
646644:2012/01/04(水) 10:41:57.67
ありがとうございます!
647デフォルトの名無しさん:2012/01/04(水) 10:44:32.37
おはようございます。>>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

になってしまいました;
648デフォルトの名無しさん:2012/01/04(水) 10:45:33.63
コードは以下です。
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

649デフォルトの名無しさん:2012/01/04(水) 10:47:50.04
'ここでAをセルに代入
For i = 6 To 8
For j = 6 To 8
Cells(i + 10, j + 1).Value = A(i - 5, j - 5)
Next j
Next i

End Sub


http://www.econ.nagoya-cu.ac.jp/~kamiyama/siryou/minv.html
このページを参考にしました
650デフォルトの名無しさん:2012/01/04(水) 12:58:01.29
"=countif(A1:A80,""" & Range("A90").Value & """)"
これでセルの値を指定することができたのですが
<=を入れるとエラーになってしまいます
あとRCを使ったやり方で<=をつけるにはどうしたらいいですか?
651デフォルトの名無しさん:2012/01/04(水) 13:30:28.28
ここはVBAのスレです

VBAでの式入力方法ならまだしも
それ以前の式の作り方についてはスレ違い
652デフォルトの名無しさん:2012/01/04(水) 14:26:11.02
>>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
のようにいくらでもネスト構造がありえるのに

なぜダブルクオーテーション " は、内部のは二つ重ねるルールにしたのですか?
欠点は、三重以上に重ねられなくなってしまってないですか?
二つ重ねるルールの利点を挙げてください。
654653:2012/01/04(水) 14:39:41.54
疑問の一つに、

=countif(A1:A80,"<=2")
の前後を"で囲むと
"=countif(A1:A80,""<=2"")"
になるなら、

"=countif(A1:A80,""<=2"")"
の前後をさらに"で囲むとどうなるの?
655653:2012/01/04(水) 14:40:31.63
オフィス田中の人は、このダブルクオーテーションのネストについて
なにか研究成果を発表はしてないのですか?
656デフォルトの名無しさん:2012/01/04(水) 14:54:58.92
単純すぎて研究するほどのことでもあるまいに

文字列の囲い記号(開始記号と終了記号)が「"」の場合
囲い記号としてではなく文字として「"」を表したくても
途中に"を入れるとそれが「文字 "」なのか「囲い終了記号」なのか判別できない

そこで、囲い開始記号以降の「"」は、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"""")"""」をさらに"で書くと、どうなるかね?
662デフォルトの名無しさん:2012/01/04(水) 15:30:48.26
>>660
俺は

VB言語では文字リテラルの囲いは「"〜"」
VB言語では「文字 "」のエスケープシーケンスは「"」

という説明を本で読んで、それをちょっと詳しく解説しただけで
このルールを発案した人じゃないから、べつにそう大げさに褒められるほどのものじゃないが
663デフォルトの名無しさん:2012/01/04(水) 16:17:05.03
早く 冬休み終わらないかなーー
スレチ話しがウザイ
664デフォルトの名無しさん:2012/01/04(水) 16:28:28.39
ちょっとしたスレチ話にムキになって突っかかっていくような幼稚な奴も
冬休みが終れば消えますかね?
665デフォルトの名無しさん:2012/01/04(水) 16:31:25.24
残念、永遠に冬休みでした
666デフォルトの名無しさん:2012/01/04(水) 16:49:58.19
スレチを指摘する人はいるけど
適切なスレに誘導する人はあまりいないね。
そのほうがウザイスレチ話が減って有益だと思うんだけどな。

スレチ話ですまん。
667デフォルトの名無しさん:2012/01/04(水) 17:32:31.98
ここ以外でVBAを扱ってるスレはないからね
668デフォルトの名無しさん:2012/01/04(水) 17:48:08.95
そうでもないけどね
669デフォルトの名無しさん:2012/01/04(水) 18:32:42.17
>>647 をお願いします。。。
670デフォルトの名無しさん:2012/01/04(水) 19:20:53.96
>>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
671デフォルトの名無しさん:2012/01/04(水) 20:33:36.18
>>670
もう来るなよ
672デフォルトの名無しさん:2012/01/04(水) 21:57:59.60
>>671
>>669に言えよ w
673デフォルトの名無しさん:2012/01/04(水) 23:36:33.96
間違ってはいない
674デフォルトの名無しさん:2012/01/04(水) 23:38:23.54
そう言えば、前スレで話題になったサンプルコレクションの本、第3版出たのね。

パラパラ見たけど、印刷文字薄くて見にくくなってた。でも、2010での動作可否が載ってるのはいいなと思た。

参考までに…
675デフォルトの名無しさん:2012/01/05(木) 14:07:22.28
Dこーてーしょんは、ユーザー自作メニューを汎用コードで作る時に地獄をみるのだ
676デフォルトの名無しさん:2012/01/05(木) 22:22:32.41
ボタンとかラベルとか動的に作成するとこはできますか?
出来る場合、動的に作成した物へのアクセスはどうすれば良いですか?
677デフォルトの名無しさん:2012/01/05(木) 23:04:23.48
私の辞書に調べるという文字はない
678デフォルトの名無しさん:2012/01/05(木) 23:19:10.07
>>676
VBAは知らんが、普通のOOPなら、できて当然だな
ボタンなりラベルなりのオブジェクトを作ってビューに配置
してやればいいだけだもんな
アクセスも自分で作ったオブジェクトだからわかるし
679デフォルトの名無しさん:2012/01/06(金) 00:03:31.02
>>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(ボタンのインデックス)

たぶん
680デフォルトの名無しさん:2012/01/06(金) 00:03:40.27
VBA知らん奴が何しに来たの?ん?質問かい?
681デフォルトの名無しさん:2012/01/06(金) 00:12:11.56
VBA(VBも?)の場合、オブジェクト変数に代入する場合、
変数名の前にSetをつけなければならない理由はなんなのでしょうか?

そういう言語仕様だからというだけでしょうか?
それとも、同じオブジェクト変数に代入する場合でも、Setを伴う場合と
伴わない場合の2ケースあるのでしょうか?
682デフォルトの名無しさん:2012/01/06(金) 00:49:42.22
引数が9つある関数って他人が見たらどう思う?
683デフォルトの名無しさん:2012/01/06(金) 00:59:14.44
それなりの理由があれば問題無いな。
Excelのメソッドも、省略可能とはいえ引数がやたら多いのが結構あるし。
684デフォルトの名無しさん:2012/01/06(金) 01:05:06.22
>>681
もともと初期の vb にはオブジェクトの概念がなく、後付けでオブジェクトを導入したとき、
既存仕様を維持してオブジェクトをサポートするために、特別な Set キーワードを導入した
とかそんな話だった気がする

Dim a
Dim b
Set a = Range("b2")
b = Range("b2")

変数 a には Range オブジェクトが格納される
変数 b には Range オブジェクトのデフォルトプロパティが格納される
685デフォルトの名無しさん:2012/01/06(金) 01:16:11.71
>>684
変数にオブジェクトは格納されないよ〜
686デフォルトの名無しさん:2012/01/06(金) 01:16:15.37
>>684
なるほど、SetありもSetなしも文法上は許容されるのですね
であれば、Setキーワードの意味はありますね

この例でいうと、デフォルトプロパティは何を指しているのでしょうか?
687684:2012/01/06(金) 01:55:17.69
>>685
すみません、オブジェクトの参照ですね

>>686
厳密にはかなり面倒で、
Range には _Default という隠しプロパティがあってそれがデフォルトプロパティになるらしい
_Default には引数(RowIndex, ColumnIndex)を与えることができて、
引数ありだと Item(引数)の評価結果、引数なしの場合は Value の評価結果を返すらしい

まあ、通常は Value と覚えておけばよいかと
688デフォルトの名無しさん:2012/01/06(金) 02:27:20.28
Setは参照の代入だが、Setは省略できないぞ
Letっていう値を代入する命令があって、これは省略できる(というか書いてる事がほとんどない)
文法的には省略されてるのはLet
689デフォルトの名無しさん:2012/01/06(金) 02:30:27.74
>>688
つまり、>>684

Dim a
Dim b
Set a = Range("b2")
b = Range("b2")

のb = 〜の行は、

Let b = Range("b2")

と解釈されて、そのとき代入されるのが_Defaultプロパティということ?
690デフォルトの名無しさん:2012/01/06(金) 03:07:22.43
>>689
うん
691デフォルトの名無しさん:2012/01/06(金) 03:11:34.65
Letなんてキーワード見たの何年ぶりだろ
昔の教科書には必ず書いてあったけど最近の入門書は最初からスルーしてるよな

試してみたらこれはエラーになった

Let a = Range("A1")._Default
692デフォルトの名無しさん:2012/01/06(金) 07:21:26.80
>>691
Let a = Range("A1").[_Default]
693デフォルトの名無しさん:2012/01/06(金) 07:30:27.21
LETとかN-BASICですら使ったことがないなw
694デフォルトの名無しさん:2012/01/06(金) 09:57:24.70
やたら丁寧なコードを書くやつがよくLet使ってたな。
長く書くのが趣味だったんだな。
695デフォルトの名無しさん:2012/01/06(金) 19:40:30.41
>>681
>>457じゃないよね?
696デフォルトの名無しさん:2012/01/06(金) 20:07:54.28
凄くどうでもいいです……
697681!=467:2012/01/06(金) 22:35:09.33
>>695
ちがいます
698681!=457:2012/01/06(金) 22:35:30.94
>>697
あミスったw
699681!=457:2012/01/06(金) 22:36:55.85
>>690
どうもありがとうございました。
了解しましたm(_ _)m
700デフォルトの名無しさん:2012/01/07(土) 02:53:29.64
質問です。
http://beebee2see.appspot.com/i/azuYl9K_BQw.jpg
このように、選択してある[C]の列だけを別の場所(あらかじめ決めているCという枠)へ移したい場合はどうすればいいのでしょうか?
コピーは出来なかったのです。
701デフォルトの名無しさん:2012/01/07(土) 07:40:10.04
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と思ったけど、

うまくできないね。
「切り取り」して「貼り付け」だと、フィルタで隠れた行まで移動してしまう。
「コピー」して「貼り付け」だと、フィルタしたものだけがコピーされるのに。

自分もこんな発見をして勉強になったよ。
力にはなれなかったけど、うまくいく方法が見つかるといいね。
704デフォルトの名無しさん:2012/01/07(土) 09:51:31.30
>>702
すいませんでした。
2.3.4.9の選択されている行です。
705デフォルトの名無しさん:2012/01/07(土) 12:53:42.20
22 名前:名無し募集中。。。[] 投稿日:2012/01/06(金) 23:40:34.39 0
AKB=金正恩

この意味わかるか
AKBという捏造ブームの裏に何があるか見えるか?


706デフォルトの名無しさん:2012/01/07(土) 12:56:07.04
>>700
選択範囲は Application.Selection で取得できるけど、
選択範囲が複数になる場合、Application.Selection.Areas に各選択範囲(Rangeオブジェクト)のコレクションが格納される

面倒だけど、最初に Areas の値を保存しておいて、ループ処理で各 Range 毎に処理するとかになるんじゃないかなあ
707デフォルトの名無しさん:2012/01/07(土) 13:16:59.99
>>700
とりあえず手動で今の状態からコピーしたいなら複数行の選択じゃなくセル範囲の選択でコピーしたら
貼り付け先には飛ばした行を詰めて貼り付けできるけど。
708デフォルトの名無しさん:2012/01/07(土) 15:02:44.54
>>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の方が楽だけどそうでもないなら関数の方が早い。
709デフォルトの名無しさん:2012/01/07(土) 15:28:48.21
>>704
やっぱりよく分からない
複数選択範囲(行単位)の移動(カット&ペースト)が行いたいが、通常では複数選択範囲のカットができない、というだけ話なら
移動先を ActiveSheet.Range("100:100") と仮定した場合、

Application.Selection.Copy(ActiveSheet.Range("100:100"))
Application.Selection.Delete()

のようにコピー+削除でいけると思うけど、そういう話ではないの?
710デフォルトの名無しさん:2012/01/07(土) 18:08:58.21
>>703.>>706->>709
レスありがとうございます!
>>700の者です!
初心者かつ、語彙力がなく、説明不足ですいません。
わからなかった言葉もぐぐってみます!

>>709さんの回答が一番近いと思うのですが、
私はカットではなく、[A.B.C]とグループ分けをしたうちの[C]だけを別のページをコピーペーストしたいです。

簡単にいうと、複数選択のコピーの方法が知りたいです。

http://beebee2see.appspot.com/i/azuY3Iu-BQw.jpg

この画面でいうと、3.5.6.7.12.15行目をコピーしたいです。
右クリックでコピーを選択すると
http://beebee2see.appspot.com/i/azuYvILBBQw.jpg
このような画面が出ます。

一つ一つ貼っていくには膨大な量なので時間が足りません。

皆さんが教えて下さった数式(?)関数(?)を今から試してみようと思います!
それらが出来たらまたここに来て見ます。

何度もすいません、もう少しお付き合い下さい…
ありがとうございます。
711デフォルトの名無しさん:2012/01/07(土) 18:43:31.57
>>710
>>709の例は複数選択可能で、2行目のDeleteしなければただのコピー
現在のシートの選択行(複数選択あり)をたとえば シート(Sheet3)の10行目にコピーしたいなら

Application.Selection.Copy (ActiveWorkbook.Worksheets("Sheet3").Range("10:10"))

みたいなマクロだけでいけると思うけど
712デフォルトの名無しさん:2012/01/07(土) 18:57:02.57
>>710
> この画面でいうと、3.5.6.7.12.15行目をコピーしたいです。
> 右クリックでコピーを選択すると
> http://beebee2see.appspot.com/i/azuYvILBBQw.jpg
> このような画面が出ます。
>

たぶん行の選択の仕方が間違っている
ちゃんと選択すれば、そんな警告はでないしコピーできる
713デフォルトの名無しさん:2012/01/07(土) 19:03:54.59
>>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]だけをコピーし
別のページにペーストしたいです。
わかりづらくてすいません。
今からレス返します。ありがとうございました。
716デフォルトの名無しさん:2012/01/07(土) 19:14:22.35
>>711
なるほど!
そのマクロ(?)をペーストしたいセルに打ち込めば出来るんでしょうか?
今してみたら何も起きませんした…
717デフォルトの名無しさん:2012/01/07(土) 19:15:13.48
>>712
選択の仕方が間違えていますか!そうかもしれません。
今は、コントロールキーを長押ししながら選択しています
718デフォルトの名無しさん:2012/01/07(土) 19:18:12.73
>>713
ありがとうございました!!!!!コピー&ペーストできました!!!!、
本当にありがとうございました!
こんな皆様の高度な知識の中基本も知らない私が頼りに頼ってしまいすいませんでした……
本当に助かりました!
ありがとうございました!!!!!
719デフォルトの名無しさん:2012/01/07(土) 19:19:45.13
複数選択の手動は大変ですがオートフィルの昇順がよくわからないので、今回は手動でいきます。
本当にありがとうございました!
720デフォルトの名無しさん:2012/01/07(土) 19:25:26.20
>>719
こっちで質問したほうがよかったね
http://toro.2ch.net/test/read.cgi/bsoft/1319632190/
721デフォルトの名無しさん:2012/01/07(土) 19:25:40.93
>>719
オートフィルじゃなくてオートフィルタだよ
A列選択しといて ツールバーのデータ(D) -> フィルタ(F) -> オートフィルタで
A列の項目を選択してコピーできるようになる
722デフォルトの名無しさん:2012/01/07(土) 19:28:14.13
と思ったたら、もうしてた
723デフォルトの名無しさん:2012/01/08(日) 01:33:43.29
どうでもいいけどプリントスリーンってがあるよ
724デフォルトの名無しさん:2012/01/08(日) 01:44:13.00
vbaでパケットキャプチャって出来る?
725デフォルトの名無しさん:2012/01/08(日) 07:34:05.68
どっかでカーネルドライバが必要になるから、単体だと無理な気が。
726デフォルトの名無しさん:2012/01/08(日) 09:50:28.06
そうやってカーネルで遊ぶんだよ。
たしか、井上も推奨してたな。




カーネル遊び
727デフォルトの名無しさん:2012/01/08(日) 19:15:54.10
震災前

     /::::::::::::::::::::::::::::::;;::ノ ヽ;::\
    /::::::::;;;;;;;;;,,,;;...-‐''"~    ヽ:;::l
     |:::::::::::|    岡田 異音    |ミ|
     |:::::::/     ,,,  ヽ,、   '|ミ|  
     '|:::::::l    '''""   ゙゙゙゙`   |ミ|
       |:::::|.  ,,r ‐、   ,, - 、  |/
     ,/⌒|  ノ ・ _), (. ・ `つ|
     | (   "''''"    |"'''''"  | 
      ヽ,,.        ヽ    |
       |       ^-^_,, -、   |   
         |    _,, --‐''~    ) |  マニフェストもう守れない。どうしよう・・・・ 
         'ヽ  (   ,r''''''‐-‐′ / 


震災後

     |:::::::::/            |ミ|
     |::::::::|   ,,,,,    ,,,,,   |ミ|
     |彡|.  '''"""''   ''"""'' |/
     /⌒|  -=・=‐,   =・=-  |
     | (    "''''"   | "''''"  |  
     .ヽ,,         ヽ    .|  キリッ
        |       ^-^    |
   .     |     ‐-===-   |   大震災が起こったのだからマニフェストの破綻も致し方ありません
         ,\.    "'''''''"   / 
朝鮮民主党
     おわり
728デフォルトの名無しさん:2012/01/10(火) 01:54:46.47
ビジネスsoft板でVBAのスレ探してたんだけど、なかった。
プログラマ板だったのね。VBAやれる人はプログラマでいいんだ。
HTMLとCSSはできてもプログラマじゃないって言われたことあるけど。
729デフォルトの名無しさん:2012/01/10(火) 02:55:30.12
VBAやれる人がプログラマと呼べるとは限らない。
プログラマが触る対象がたまたまVBAだったならマ版にスレが立つだけで。
730デフォルトの名無しさん:2012/01/10(火) 08:00:22.21
ちょっと何いってっかわかんないっすね
731デフォルトの名無しさん:2012/01/10(火) 14:41:45.23
パスワードかけるのを標準モジュールだけとかできる?
732デフォルトの名無しさん:2012/01/10(火) 17:09:08.89
あれはプロジェクト単位でしょ
733デフォルトの名無しさん:2012/01/10(火) 22:42:54.05
A列の一番最後にデータが入力されている箇所を取得したい場合
下記で良いと思いますが

Range("A60000").End(xlUp).Row

上記以外の方法つまりRange("A60000")の記載がソースとして綺麗ではないので
もし他のやりかたとかあれば教えてください
734デフォルトの名無しさん:2012/01/10(火) 22:50:42.61
>>733
cells(rows.count,1).end(xlup).row
735デフォルトの名無しさん:2012/01/10(火) 23:30:01.65
皆どれくらい勉強してVBAを使いこなせるようになった?
736デフォルトの名無しさん:2012/01/10(火) 23:36:00.15
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も完璧にマスターしたりしてる?
738デフォルトの名無しさん:2012/01/11(水) 06:38:45.74
>>735
処理重くてもなんでもいいからこれ自動化したいと思った事をそれなりにできるようになる
ぐらいなら1日1時間で3ヶ月目ぐらいには出来てた。

後からの修正がやりやすいようにクラスを使うようになったのは1年過ぎてから。

現在は、4年過ぎた今でも、ちょっと凝った事する時はネットに繋がったPCで調べれないと
ちょっと困る。
VBAでゲームとか作ってる人のレベルには永久に到達しないと自覚してる。
739デフォルトの名無しさん:2012/01/11(水) 07:33:35.99
ゲームが作れるのと、Excelの機能を活かせているかは全然別問題。
どちからというと縄張りの違いだな。
ユーザーから提供されたシートが、Excel関数活かしまくりで驚かされることも多々あるし。
740デフォルトの名無しさん:2012/01/11(水) 12:30:34.70
関数を駆使してるようじゃ素人。
Excel扱うならほとんど関数は不要。
741デフォルトの名無しさん:2012/01/11(水) 16:52:14.30
いるよな。ワークシート関数にあるの知らないで自作関数でバグ出すやつ
742デフォルトの名無しさん:2012/01/11(水) 17:21:24.04
worksheet関数のコードって知ることできない?
743デフォルトの名無しさん:2012/01/11(水) 17:44:07.83
埋め込み関数もVBAも両方使えば良いだろ。
VBAコードにするまでもない場合あるし、
VBAとハイブリッドでつこてもいいじゃろし。
744デフォルトの名無しさん:2012/01/11(水) 18:25:16.48
カレントドライブを変更する方法教えてください

Sub testdirectory()
Dim fld As String
fld = "c:\temp"

If Left(CurDir, 1) <> Left(fld, 1) Then
??????????
End If
End Sub

↑の???です。
chdirはフォルダは変更してもドライブが変更しないってあるんで、ドライブを変える方法を知りたいです
745デフォルトの名無しさん:2012/01/11(水) 18:38:07.98
chdriveは違うの?
746デフォルトの名無しさん:2012/01/11(水) 18:58:48.97
それです^^;ありがとう
747デフォルトの名無しさん:2012/01/11(水) 19:09:25.88
とあるwebサイトのHTMLテキストを取得してそれをエクセルに反映させたいのです
方法を誰かおすえて
748デフォルトの名無しさん:2012/01/11(水) 19:20:46.34
>>747
それだけだと何とも言えん
Webクエリでも使っとけ
749デフォルトの名無しさん:2012/01/11(水) 19:43:29.63
>>748
ソースを取得したいのです
750デフォルトの名無しさん:2012/01/11(水) 19:47:40.97
>>749
>>261-264あたり
751デフォルトの名無しさん:2012/01/11(水) 19:48:51.00
>>749
そーっすか。
752デフォルトの名無しさん:2012/01/11(水) 19:58:51.34
>>534
これ分かる方いませんか?
ツリービューを使っていますが
イメージリストコントロールver6
ツリービューコントロールver6
両方チェックいれています
ちなみにソースコード内全て検索しましたがRangeは使っていません
753752:2012/01/11(水) 20:03:21.58
頭冷やしたら解決しました
754デフォルトの名無しさん:2012/01/11(水) 20:11:29.98
functionである範囲を入力としてとる関数を作っています。
その範囲内の単一のセルが書き換わったとき、そのセル位置を取得方法を教えてください。
2003です。
755デフォルトの名無しさん:2012/01/11(水) 20:27:21.73
文章がよくわからんがWorksheet_Changeイベント使ったらどうですか
756デフォルトの名無しさん:2012/01/11(水) 20:45:34.14
Dim K-ON! As Nyan
757デフォルトの名無しさん:2012/01/11(水) 22:09:24.89
As Nyan が言いたいだけなんじゃないかと
758デフォルトの名無しさん:2012/01/11(水) 22:14:26.15
Dim Anal As Hole
759デフォルトの名無しさん:2012/01/11(水) 22:30:25.15
>>755
sum関数みたいな範囲指定なんですが、
変更した数値に対して処理を付加したいんです。
直前のセルの値をstaticで保持しておいてもいいのですが、
全数を比較処理して、変更箇所を見つけるプロセスは処理コストかかるので、
簡単にできないかと。

760デフォルトの名無しさん:2012/01/12(木) 00:11:10.87
>>759
Worksheet_Change
761デフォルトの名無しさん:2012/01/12(木) 08:57:38.12
>>759
ユーザー定義関数?
だとしたらそのアプローチが間違ってるよ
処理を付加とかわかんないから詳しく
762デフォルトの名無しさん:2012/01/12(木) 16:11:18.52


2chやニコニコ動画に民主党から反日工作費が流れていることが知られるようになってきた。
民主党が用意した資金で工作員が2chを荒らしていることもだんだんと知られるようになってきた
763デフォルトの名無しさん:2012/01/12(木) 19:56:33.69
>>759
あいかわららず何がしたいか全然わからいけど例えばこんなこと?

B1に下記のように式が入力してあって
=SUMもどき関数(A1:A2)

直前の操作(変更)がA1かA2なのかによって
B1に表示される結果を変えたいということかな。
だったら無理だと思う。

764デフォルトの名無しさん:2012/01/13(金) 02:56:51.89
スレ違いなら誘導していただけるとありがたいです。

環境の都合上、vbaで作らなければいけないのですが、
別アプリケーションの指定したピクセルの色で判断し、
キー入力をエミュレーションしたいです。

別のアプリケーションの色の取得はどうすれば出来るでしょうか?
765デフォルトの名無しさん:2012/01/13(金) 04:55:15.99
>>763
それなら出来る。
面倒くさかったけど作ったことがある
766デフォルトの名無しさん:2012/01/13(金) 08:31:16.77
マクロ有効ブックAのvbaで別のマクロ有効ブックBを開き、ブックBはWorkbook_Openイベントで自分自身を編集します。
編集後にそのブックBを手動で別のフォルダに保存したいのですが、
『名前をつけて保存』のダイアログボックスはブックBの元の読み込みフォルダを開いてしまいます。
これを自分の好きなフォルダを開くようにマクロから設定できないでしょうか?
767766:2012/01/13(金) 09:23:12.96
ちなみに、ブックBのマクロ内で
ChDir "C:\"
としてもダメでした。

ChDir "C:\"
S = GetSaveAsFilename()
ThisWorkbook.SaveAs S

とかならC:を開いて保存できますが、
保存するかどうかは任意なので
できれば手動で『名前をつけて保存』を選び、
そのときに指定したフォルダでダイアログボックスを開くようにしたいのです。
768766: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

もし違ったら新しいマクロの記録を使ってダイアログボックスで保存した後、記録の終了→マクロを開いて編集して下さい
770766:2012/01/13(金) 12:49:53.26
どうもありがとうございます
都合により、来週水曜日まで
そのマクロにさわれないので来週試します。
本当にありがとうです
771デフォルトの名無しさん:2012/01/13(金) 21:36:08.80
>>764
Win32APIで別アプリのウィンドウハンドルを取得
これでわからなかったら、正直に「できません」と言ってあきらめろ
772デフォルトの名無しさん:2012/01/13(金) 23:59:40.19
野田改造内閣に早速疑惑浮上

@aritayoshifu 有田芳生
捜査当局が内偵を続けている農水疑惑。詳細な怪文書まで出回っている。3億円の
行方はどこに?

@minorucchu ジャーナリスト 田中稔
野田改造内閣を揺るがす、農水省3億円スキャンダルの怪文書。二人の議員名が浮上。
34分前 webから
https://twitter.com/#!/minorucchu/status/157687110562881537

鹿野と筒井らしい
自公は問責も視野に調査開始だって
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


こんなの書いてみたのですがダメでした

774デフォルトの名無しさん:2012/01/14(土) 01:36:06.05
>>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
有難う御座います!
無事出来ました。
本当に助かりました。
776デフォルトの名無しさん:2012/01/14(土) 11:31:16.38
指定されたフォルダー内のファイル名を作成日時の
降順に並べ替えるにはどうすればいいでしょうか?
ファイル名の一覧を取得して、別の配列に作成日時を
比較しながら挿入して行く方法しか思いつかないのですが、
もっと簡単な方法はありますか?
777デフォルトの名無しさん:2012/01/14(土) 11:44:00.25
dir /b /a-d /od の実行結果を取り込む。
778デフォルトの名無しさん:2012/01/14(土) 11:52:12.23
>>774
> FreeFileとか宣言してない変数

変数じゃないし。

まあ、ADODB.Stream 使うなら関係ないけど。
779デフォルトの名無しさん:2012/01/14(土) 11:57:19.44
dir /b /a-d /od- だったw
780デフォルトの名無しさん:2012/01/14(土) 15:07:46.00
>>779
/tc
781デフォルトの名無しさん:2012/01/14(土) 15:48:47.05
ファイルディスクリプタを返す関数か
782デフォルトの名無しさん:2012/01/14(土) 15:53:31.63
>>773
>>774
>>778

AODで
UTF-8のtxt作る場合にはBOMがくっつくから
不要ならばバイナリで扱って掃除しないと困るよん。


と、焼酎飲みながらカキコ
783デフォルトの名無しさん:2012/01/14(土) 16:45:49.71

反日ネット工作員
朝日新聞社→社員約300人
民主党とその取り巻きの資金が入った反日工作会社→数社約450人

朝日新聞の社員は捕まった49歳の編集者を含め新聞記事を書く合間に2chを荒らしている程度とみられているが
民主党が用意した反日工作会社はほぼ24時間体制で工作を行っている
工作範囲は民主党が予め工作費を流している2ch、ニコニコ動画を中心にyoutube、個人のブログなどである。

784デフォルトの名無しさん:2012/01/14(土) 18:01:51.55
785784:2012/01/14(土) 18:05:05.75
エクセルマクロで十分そうな物をSEに頼むか普通。
786デフォルトの名無しさん:2012/01/14(土) 19:37:32.74
>>782

>15:53:31.63
>15:53:31.63
>15:53:31.63
787デフォルトの名無しさん:2012/01/15(日) 12:42:32.23
>771
ありがとうございます。無事書けました。
プリントスクリーンして〜 とかトンチンカンなことを考えてました。
788デフォルトの名無しさん:2012/01/15(日) 22:11:07.35
http://codepad.org/tyOKeGsr

のような構造体配列があって年度別に成績を格納するところまではできたんですが、
総合計を出すために nen = 9999 のところにどうやって加算するのかでつまずいて
ます。
みなさんのお知恵をぜひお借り出来れば m(_ _)m
789デフォルトの名無しさん:2012/01/15(日) 22:56:18.31
>>788
それだけじゃわからん
790デフォルトの名無しさん:2012/01/15(日) 23:03:13.96
> 最後に総合成績のためのidxを設ける

普通に
Public 合計 As nendobetu_seiseki
って宣言して、それに足しこんでいけば良いんじゃね?

nen は、無駄になるけど気にしない。

そもそも、nen を持つ必要はないと思うし。
791788: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のところに足しこみたいということです。
792788:2012/01/15(日) 23:13:43.40
>>790
そういえば、確かに無理やり配列の中でやらなくてもいいですね^^;
分かりました。
ありがとうです
793デフォルトの名無しさん:2012/01/15(日) 23:55:42.31
民主党には朝鮮人など外国人のなりすまし、スパイが約90名在籍している
野田内閣は過半数が帰化人

野田はどうだろうか
韓国人から賄賂を貰い、韓国人の集いに出席している野田は

首になった蓮○はシャブで逮捕歴のある人間と仲が良いな。蓮○自身はやってんの?
い-6-1
テレビが言えない民主党のスポンサー=韓国北朝鮮
あとはもうわかるよな

794デフォルトの名無しさん:2012/01/17(火) 00:20:33.95
XP Excel2003です
複数のPCでブックの共有をしてるのですが、Excel以外にも
アプリを起動しているので常に前面にExcelがあるわけではないです。

この状態でAのPCで共有ブックをマクロを実行して更新したことをBのPCで
気づけるようにしたいのですが良い方法はないでしょうか?
msgboxを試してみたのですが実行したPCでしか表示されませんでした。
795デフォルトの名無しさん:2012/01/17(火) 00:44:47.83
>>794
VBAにこういうのを埋め込む
ttp://oshiete.goo.ne.jp/qa/2172332.html
796デフォルトの名無しさん:2012/01/17(火) 17:25:31.76
ちょっと質問。
実行時にウインドウを閉じてバックグラウンドで動作させるプログラムを組みました。
内容は、webクエリを実行してコピー→別シートに貼り付けというのが大まかな流れ。
それで、手持ちのノートPCなら動作中は他のプログラムを問題なく使える。
だけど、デスクトップで実行すると画面がチカチカしてクリックがうまくいかなかったり
フォームに文字を入力できなかったりします。
動かすパソコンによって動作の違いってあるのでしょうか?
パソコンはともにwin7 64bitでoffice2010です。
797デフォルトの名無しさん:2012/01/18(水) 00:19:40.90
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型?の場合は何か特殊な処理必要なのでしょうか?
798デフォルトの名無しさん:2012/01/18(水) 01:14:03.52
hiddenはテキストボックスじゃないし、そもそもブラウザ画面に表示されないし
hiddenなフォームフィールドに貼り付けとかどうやってできるのか俺には解らない

ホントにVBAの問題かちゃんと切り分けてから質問してくれ
どうせJavaScriptかなんかで上書きされてるってオチだろう
799デフォルトの名無しさん:2012/01/18(水) 01:23:01.92
>>797
hiddenの値を書き換えたいならIEを外からコントロールするんじゃなくて、submitまでの処理を自前でやった方が簡単
たとえばGoogleの検索はqという名前のテキストボックスに検索ワードを書き込むけど、
URLの末尾に「q=文字列」と追加しても同じ結果が得られる
hiddenで隠されたパラメータも同じ方法で自由な値を送信することが可能


ttp://www.google.co.jp/search?q=文字列&num=20

numというのは表示される件数。設定画面で変更してcookieに保存されたパラメータがhiddenで送信されている
800797: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でできるかも確認してみます。
801デフォルトの名無しさん:2012/01/18(水) 11:30:47.40
>>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で値を入れるべきところは前者のような気がするんだけど
802デフォルトの名無しさん:2012/01/18(水) 11:33:35.05
>>800
間違いなくJavascriptで入力内容をチェックしてるね
(ちなみにJavascriptとJAVAは名前は似てるけど完全に別物だからきちんと区別してね)
803797:2012/01/18(水) 15:05:07.95
>>801
ありがとうございます。
そこの使い方がわからなかったんです。

前者に20111225と値を入れたいのですが・・・

VBAで変数から入れようとしたら、 「name=」も「id=」もないので

objIE.Document.getElementById("−−−−").Value = 変数 

でどう使えばいいのかわからなかったとこです。
804デフォルトの名無しさん:2012/01/18(水) 15:29:00.19
>>803
VBSのサンプルだけどここが参考になると思う

7.10 フォームの操作3/フォーム名やコントロール名が無い場合
http://www.happy2-island.com/vbs/cafe02/capter00710.shtml

ちなみに onchangeはたぶん動作しないと思うが
javascriptが動かないとまずいときは値を入れた後そのテキストボックスに対して
.OnChange
とかしてみるといいいかも
例:objIE.document.forms(0).Item(5).OnChange
805デフォルトの名無しさん:2012/01/18(水) 17:35:23.98
型が一致しません。と出ます
原因を教えてください。

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
806デフォルトの名無しさん:2012/01/18(水) 17:59:44.63
>>805
Worksheets("02").Cells(t, y).Borders.LineStyle = xlContinuous
807デフォルトの名無しさん:2012/01/18(水) 18:25:30.15
>>806
それでやってみましたがやっぱりエラーが出ます
808デフォルトの名無しさん:2012/01/18(水) 18:25:53.32
>>804
多謝!
目的の操作ができました。
809デフォルトの名無しさん:2012/01/18(水) 18:48:18.95
>>805
ステップ実行でどこでエラーか調べてみて
810デフォルトの名無しさん:2012/01/18(水) 18:53:01.55
>>807
tとyの型宣言はどうなってる
811デフォルトの名無しさん:2012/01/18(水) 19:31:13.60
>>809
ここまで黄色の帯がかかります
If Worksheets("01").Cells(t, y).Value > 10 Then

>>810
Dim t As Integer
Dim y As Integer

よろしくお願いします
812デフォルトの名無しさん:2012/01/18(水) 19:38:08.33
>>811
エラーでとまったときのtとyの値は?
そのセルに入力されている値は?
813805:2012/01/18(水) 19:52:01.57
>>812
セルの値が#DIV/0!になっていたのが原因だったようです
お騒がせしました
814デフォルトの名無しさん:2012/01/18(水) 19:56:59.65
参照エラーね・・・・。




参照は小粒でピリリと辛いって言うからねぇ
815デフォルトの名無しさん:2012/01/18(水) 20:01:18.80
あ・・・0除算だから参照エラーって言わないのかな?



如何ざんしょう?・・・・ナンツッテ
816デフォルトの名無しさん:2012/01/19(木) 17:43:20.40
エクセルのシートで、使用されている行、および列の数ってどうやって抜き出すのが良いんでしょうか?
http://excelvba.pc-users.net/fol7/7_3.html
http://www.happy2-island.com/excelsmile/smile03/capter00702.shtml
一応調べてはみたのですが、
プログラムを組む時に基準に出来るような、正確に中身を測れる方法ではないのでしょうか?
正確に使われているセルを調べる方法が無いなら、データを保存するだけのシートを
分けて作って、普段見えないようにしておき。
見る時は、別シートの参照値だけを記述したシートを見るなんて運用になるんでしょうか?
817デフォルトの名無しさん:2012/01/19(木) 18:34:19.73
>>816
もっとわかりすくお願いします
818デフォルトの名無しさん:2012/01/19(木) 19:08:45.09
>>817
UsedRangeは空白の列や行が二つ以上続くと使われたセルの値を正確に返せない。
Endプロパティだと、列と行を一つずつ調べなければならない
そして列や行の端に値が有るのか無いのかの区別も別途ロジックを用意しなければならない

と言う認識なんだけど。
適当に作ったシートの中身をここら辺のプログラムで読み取るのって
汎用性が有る記述方法が見つからなかったんですが。

そもそもシートの記述の時点で、ユーザーフォームからしか書き込めなくするとか、
1シートに表を1つしか作れないようにするとかって制限をかける方が無難なんでしょうか?


DBに近いような物をシートに作る時はどのようにしてますか?
819デフォルトの名無しさん:2012/01/19(木) 20:01:14.28
2007以降ならテーブル
820デフォルトの名無しさん:2012/01/19(木) 20:54:57.78
ごめん 816と818を何度読み返してみても、
何がしたいのか、何に困っているのか理解できなっかた。
821デフォルトの名無しさん:2012/01/19(木) 22:23:54.84
>>820
プログラムの設計書をVBAで自動生成しようとしてる。
電文の設計書と、それに対応した処理をするモジュールの設計書を作るとして。
両方自動生成するつもりなんだけど、テーブル二つを一つのシートに書くと、
検索のプログラムをシートの書き方毎に作らなきゃならないし面倒そう。

1 シート毎にテーブル一つにする。
2 ファイル名=モジュールのIDとし、特定の列のN番目からデータを取り自動生成すると楽っぽい
3 動的型でも使えるっぽいので、引数でどっちかを指定すれば、エクセルファイルの幅の設定もファイルの種類毎に変えられるっぽい

こんな感じの印象を持っている。
まぁ上のは例を挙げただけなんだが。

プログラムで何かをする時に、元データとして使うシート自体の書き方制限して特定の形にしておくと便利っぽいが
ネットで調べる限りそんな記述が出て来ないんだけど、言葉にしないだけで結構みんなセルに特定の規則作って使ってるよね??

と、出来る限り分かりやすく書き直してみたんだけどOK?
822デフォルトの名無しさん:2012/01/19(木) 22:39:40.26
>>821
そのレスも自動生成なのかい?
実用レベルには程遠いね
823デフォルトの名無しさん:2012/01/19(木) 23:12:10.03
>>822
もういいやw

説明するのも面倒だし、学校の先生から説明されるような物じゃ無いと何も理解できないとかww
金貰って書いてるわけじゃ無し、理解できない奴は無視しておけば良いやw

しかも実用にほど遠いってww
ひな形の作成ぐらいにしかなって無いだろうよ説明的にww
824デフォルトの名無しさん:2012/01/20(金) 01:14:31.59
そりゃお前は中身解ってるから理解できるだろうけどさー
一つ言える事は、ExcelをDBとして使う事は愚の骨頂。できるけど。
どうしてもやるなら入力専用シートなりフォームを作って
データシートをテーブルに見立ててSQL
下手にLookUpとか使うと>>813みたいに思わぬ所で参照エラー地獄
これで解らないなら敢えてExcelで作る必要無し
Accessとかなんか得意なのが有ればそっちのが良いんじゃね?

PGなんてのは一つ一つやりたい事実装してけば最後には出来るもんなんだよ
いっぺんにあれこれやろうとするから解らなくなる
すっ飛ばすのは数こなして慣れてからだよ
825デフォルトの名無しさん:2012/01/20(金) 01:26:24.94
というかセルの型指定できるだろ
入力制限もかけられる
動的に生成したいなら、マクロの記録使ってセル設定すれば
ソースが出来るから後はそれを使いまわせ
826デフォルトの名無しさん:2012/01/20(金) 01:48:27.05
>>824
DBに近いような物・・・
DB自体じゃないよ
PG作る時のクラスの命名規則とかいちいちDB作って登録するわけじゃないでしょ、
あくまで簡易な物

それにDBのテーブル自体もエクセルにしといた方が良いと思うが。
テーブルのデータじゃ無く、テーブルの構造な。
MVCアーキテクチャで作る時に、どのテーブルのどのデータ抜いてきたかとか分かると良いだろ。
で、参照値にしとけばって話で
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q127916537
こんなのも出来るし

まぁどちらにしろプログラムの作り方についての質問じゃ無く。
VBAで何かする時に、元になるシートが有るわけだが、好き勝手毎回適当に作るより、
規則性持たせた方が都合が良さそうだけど、どう思う>all
ぐらいな感じ
827デフォルトの名無しさん:2012/01/20(金) 04:02:02.22
>>816
ヒトにとって読み易い表フォーマットは往々にして機械走査しにくいが、どんな運用ルールを設けてもなし崩しにされてしまうので、結局ニンゲンさまに合わてプログラムするしかないと諦めてます。
828デフォルトの名無しさん:2012/01/20(金) 08:43:35.88
formのボタンを押すにはどうしたら?
プログラムから、ボタンを押すと実行されるサブルーチンをcallするのでなく、ボタンそのものを押す方法。
プログラムは、vbaで出来なければ、他のものでも良いです。
829デフォルトの名無しさん:2012/01/20(金) 09:27:13.58
日付関係で質問
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
830デフォルトの名無しさん:2012/01/20(金) 10:04:14.60
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はいくんですが・・・。
どうか、優しい方、教えてください。
832デフォルトの名無しさん:2012/01/20(金) 11:06:59.01
>>828
VB6と一緒
ここはあくまでExcelをマクロ言語操作することに関してのスレなので
例え環境としてVBAを使おうと、Excel操作以外はスレ違い

>>829
コピー先に日付書式が設定されていても、それはあくまで数値(シリアル値)が入力されたら
その書式に沿って表示せよという設定なだけで、文字列を入力すれば文字列のまま表示されるので
日付文字列を一旦CDateやDateValueでシリアル値に変換してから入力すれば良い

>>830
VB6と一緒
ここはあくまでExcelをマクロ言語操作することに関してのスレなので
例え環境としてVBAを使おうと、Excel操作以外はスレ違い

>>831
VB6と一緒
ここはあくまでExcelをマクロ言語操作することに関してのスレなので
例え環境としてVBAを使おうと、Excel操作以外はスレ違い
833デフォルトの名無しさん:2012/01/20(金) 16:57:30.64
>>826
何分かけて一レス書くのか知らないけど、それと同じ時間だけ何度も読んで、同じ時間だけかけて推敲してから送信してね。
834デフォルトの名無しさん:2012/01/20(金) 17:44:05.85
>>832
ありがとうございます。
でもセル範囲でデータを取っているため
Cdateが使えません……
835デフォルトの名無しさん:2012/01/20(金) 18:31:49.23
Dim セル As Range
For Each セル In セル範囲
836デフォルトの名無しさん:2012/01/20(金) 18:49:15.64
>>833
お前のレベルに合わせたら例3つぐらい出して、起承転結付けて最初と最後に結論かくような、
いかにも国語の教科書って書き方しないと伝わらないだろ
>>819の時点で分かる人には分かるって気が付かないか?
そもそも最初の文だけでも伝わる人には伝わる。

俺に重要なのはお前に伝わる書き方をする事ではない。
同じような考察に至った人が現在どういう使い方をしているのかが知りたいだけ。

自分が経験不足で何を言いたいか理解できなかったからってこっちのせいにするな。
ここはお前のようなかまってちゃんに、必ず伝わらないと文章書いちゃいけないなんてルールは無いんだぞ
837デフォルトの名無しさん:2012/01/20(金) 19:22:44.14
>>836
> そもそも最初の文だけでも伝わる人には伝わる。
> 同じような考察に至った人が現在どういう使い方をしているのかが知りたいだけ。
838デフォルトの名無しさん:2012/01/20(金) 19:23:39.67
あーごめん俺>>819だけどお前の話はさっぱりわからんわ
839デフォルトの名無しさん:2012/01/20(金) 19:33:38.62
>>837
誰にも伝わっていないか、それとも同じような考察に至った者がいないか(笑)
840デフォルトの名無しさん:2012/01/20(金) 19:37:50.75
ID無いとやり放題とw
使えない上司の定型文貼る奴はレベルが違いますね
841デフォルトの名無しさん:2012/01/21(土) 07:38:58.15
>>839
俺にはこう伝わったぞ
>プログラムで何かをする時に、元データ(略)の書き方制限して特定の形にしておくと便利っぽい
プログラムで完全に不定なデータ扱うなんて、考察にいたるとかいうまでもなく
無理だってわかりそうなもんだが、彼は今初めてそれに気づいたらしい

あと助詞と句読点の使い方がおかしいので、日本語が不自由な人だというのも伝わった
842デフォルトの名無しさん:2012/01/21(土) 07:49:31.87
同意
843デフォルトの名無しさん:2012/01/21(土) 07:50:15.28
たぶん頭も不自由なんだろう
844デフォルトの名無しさん:2012/01/21(土) 08:16:13.33
そもDBに近いようなものってとどのつまりDBじゃねーの
簡易だろうがなんだろうがDBはDBでしか無いじゃん
あとPG作る時のクラスの命名規則とかいちいちDB作って登録する事は普通に有るので
無いでしょ?と問われたらNOとしか言えませぬ。

まあ一つ言える事は、どんな規則作っても
一番偉い奴がガッチリ管理し続けない限りなし崩しになるから
そんなとこに無駄な労力を割く必要無し。
ルールをプリントアウトして目立つとこに貼っとけw
845デフォルトの名無しさん:2012/01/21(土) 08:30:50.69
なにはともあれ質問が漠然とし過ぎてて解んねーよ
仕事なら一緒になって真面目に考えるけどさ
もうちょっと具体例というか・・・あ、ここVBAスレだな。

仕様は自分で考えて、コーディングの段階になってからまた来てくれよ
846デフォルトの名無しさん:2012/01/21(土) 10:32:17.82
ソースコードジェネレータ、つーか、テンプレート、みたいなのを作りたいのか?
ひな形に読ませる設定一覧が表になってて、表のレイアウト込みで自動で読ませたい

こんなかんじ?
やめとけ、出来ない事はないと思うがレスのやり取り見てると作った本人でも使えないモノしか出来そーにない
847デフォルトの名無しさん:2012/01/21(土) 12:30:39.01
何でもかんでもExcelでやろうとする奴は例外なく馬鹿
848デフォルトの名無しさん:2012/01/21(土) 12:32:23.74
定型的コードを一意に作るならできる。
例えばc言語のテーブルみたいなのを想定したシートにパラメータつっこめばテーブルに加工するのは容易。
同じように定型的コードの要素をならべてシートに整理。VBAで処理したら、典型的コードの亜種がつくれます。


用途は、テストコードの量産とか。
849デフォルトの名無しさん:2012/01/21(土) 12:34:52.45
補足
典型的コードの構成部品はVBAコードに埋め込み。リファインはVBAを直接弄る。
850デフォルトの名無しさん:2012/01/21(土) 13:51:04.88
【プログラミング部】 PHPが100倍速で動くようになったぞー
http://awabi.2ch.net/test/read.cgi/poverty/1327050821/
851デフォルトの名無しさん:2012/01/21(土) 15:14:31.78
852デフォルトの名無しさん:2012/01/21(土) 22:04:14.91
>>844
エクセルの使い道って、プログラミング組めなくてmysqlとか使えない奴が使う
簡易なDB機能じゃなかろうか・・・
いちいち作るのが面倒ならエクセル使うと思うんだが

クラス名をDBに登録ってどんな規模ならやる羽目になるん?
853デフォルトの名無しさん:2012/01/21(土) 22:06:47.92
そうか、お前はプログラミング組めなくてmysqlとか使えない奴なんだな
854デフォルトの名無しさん:2012/01/21(土) 22:20:20.20
>>853
いちいち作るのが面倒ならエクセル使うと思うんだが
いちいち作るのが面倒ならエクセル使うと思うんだが
いちいち作るのが面倒ならエクセル使うと思うんだが
いちいち作るのが面倒ならエクセル使うと思うんだが

文章自体読めない奴が何をw
855デフォルトの名無しさん:2012/01/21(土) 22:41:24.94
ほう、ならプログラミングできてDBも使えるって言うのかい?
856デフォルトの名無しさん:2012/01/21(土) 22:41:35.78
データ=DB
という錯誤が、この話題ではまかり通っているように思える。
857デフォルトの名無しさん:2012/01/21(土) 23:39:22.32
> データ=DB
は実は錯誤でもなんでもなく正しいんだけどね
少なくともExcelにおいてはね

さすがにCSVデータのみを以てDBとするのは正しくないが
Excelは昨今のDBソフトには遠く及ばないものの、DBとして本質的な
最低限の機能は備えているので、Excelのシート上にデータを置けば
それはDBと呼んでも何の差し支えも無い

むしろDBに対して、本質的なところではなく
後発の固有DBフォーマットや固有DBソフトの付随的な機能や規格を挙げて
「この要素を満たしてなければBDとは言えない」とか言ってる奴の方に錯誤がある
BDソフトメーカーの高機能戦略に踊らされすぎて、本質的なDBというものが見えてない
858デフォルトの名無しさん:2012/01/22(日) 01:10:50.49
>>856-857
もちろんExcel表(上のデータ)は立派なDB足り得るぞ
だが、データ=DBが正しいなら、CSVデータも本質的に立派なDBだが?

すべてのデータがDBだというのはさすがに間違ってるだろうが
今回の話でのデータはまさしくDBといって差し支えないぞ

そのDBのデータをエクセルで扱うのに、フォーマット不定でできないかって言ってる

DBの本質とかDBソフトの本質とかスレ違いだしそっちは他所で議論してくれ
859デフォルトの名無しさん:2012/01/22(日) 04:51:55.62
ここはExcelのスレだが?
860デフォルトの名無しさん:2012/01/22(日) 05:10:01.15
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")という記述で必要分だけ文をコピペすると文が長くなりますよね…
861sss: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
862デフォルトの名無しさん:2012/01/22(日) 07:17:23.72
>>856
いやいや、さすがにそれはねーよ

・・・あったでござる >>857-858
863デフォルトの名無しさん:2012/01/22(日) 08:20:48.53
>>861
感動!.cellsや.columnsという記述でこんな簡単に制御できたのかwww
色々試したら希望通りの動作が確認できました。
これで記述のシェイプアップが捗りそうです!ありがとうございます!

ところで範囲が四角でククれない不定形の場合(Ctrl+左クリックで選ぶような)で
記述を簡略化する場合はどう書けばいいのでしょうか?

今考えついて動作確認できたのが、Array(A,B)配列を作って
For Each I In 範囲(数字).cellsとして数字=0からスタートし、
next iを越えたら数字=数字+1としてGoToで頭に戻るという記述なのですが
もっとスマートに書く方法はありますか?

864デフォルトの名無しさん:2012/01/22(日) 08:32:07.79
>>862
君は>>857最後の1行に該当する子なんだね。
865sss: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
866デフォルトの名無しさん:2012/01/22(日) 09:26:32.36
>>865
ですです、そういう内容の時に範囲の部分を[A,B,C]というように
手前でsetした変数としての記述はできないのかな、という疑問です。

というのは、手元の環境でDim A As Rangeの
set A = range("A1:C3")等と変数記述すると
For Eachのところでオブジェクトが必要と怒られるのですが
その解決方法がわからなかったので…
変数記述しなければ動作するのはこちらでも確認できましたが
867sss: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
868デフォルトの名無しさん:2012/01/22(日) 10:01:25.18
>>867
感動した。正にその記述です。
詰まるところArrayじゃなくてUnionを使えば良かったのですね。
VBA一ヶ月目の俺にはさっぱり意味が全然わからないけどwこれから勉強させて頂きます。
.cellsとUnionよくわからんけどすごい!びっくり!
とりあえずネカフェの12時間パックが切れそうなので一旦お暇して夜また来ます!

一番ネックだった部分が解決して本当に嬉しい!
お付き合い頂きありがとうございました。感謝。
869デフォルトの名無しさん:2012/01/22(日) 11:48:45.06
>>864
相手にするだけ無駄だろ
データを大量に詰め込めて検索できればDBなのにそれも理解してなそうだし
VB以前にVLOOKUPも知ってるか謎
870デフォルトの名無しさん:2012/01/22(日) 11:54:36.92
> データを大量に詰め込めて検索できればDB
トンデモすなあ
871デフォルトの名無しさん:2012/01/22(日) 12:10:46.65
> データを大量に詰め込めて検索できればDB
データベースというものを、大手の作るデータペースソフトとしてしか
見れてない奴からすると、トンデモ理論に見えるんだろうね。

データベースというものの本質を解っていれば、
実にシンプルかつ的確にデータベースというものを表現しているのだが。
872デフォルトの名無しさん:2012/01/22(日) 12:40:44.83
メモ帳もDB
873デフォルトの名無しさん:2012/01/22(日) 12:52:31.14
>>871
削除も、更新も不要なんだ、へぇ〜。

馬鹿すぎ。
874デフォルトの名無しさん:2012/01/22(日) 12:58:59.50
あなたのVBA力を試しているのですが
875デフォルトの名無しさん:2012/01/22(日) 13:08:09.76
>>874
お久しぶりです!
876デフォルトの名無しさん:2012/01/22(日) 13:10:48.90
データベースというものを、大手の作るデータペースソフトとしてしか見れてない奴なので
> さすがにCSVデータのみを以てDBとするのは正しくないが
というトンデモ理論が口をつくのだろう。
877デフォルトの名無しさん:2012/01/22(日) 13:52:01.22
削除や更新や検索は DBMSのお仕事であって
データベースそのものじゃないとおもうが
878デフォルトの名無しさん:2012/01/22(日) 13:55:22.65
悪態をつくことは出来るが反論できない負け犬が吠えてるw
879デフォルトの名無しさん:2012/01/22(日) 13:57:20.36
削除も、更新も不要なんだ、へぇ〜。

(こんな事も知らなかった俺って)馬鹿すぎ。

こうだなw
880デフォルトの名無しさん:2012/01/22(日) 14:20:41.87
>>877
君の言う「データベースそのもの」って言うのを明確にしてくれ。
何でもかんでもデータベースだと言うなら別に止めないけど。
881デフォルトの名無しさん:2012/01/22(日) 14:22:05.34
>>879
なら、詰め込むのも不要だよな。

馬鹿だね。(w
882877:2012/01/22(日) 14:30:17.06
>>880
ある目的にそったデータを集めたもの
883デフォルトの名無しさん:2012/01/22(日) 14:44:04.59
集めただけでいいの?

あと、その意見だと「データ=DB」は間違いだよね。
884877:2012/01/22(日) 14:55:39.32
集めたデータを提供するのがDBMSの仕事だって認識
885877:2012/01/22(日) 15:04:01.39
ちょっと訂正
×提供するのが
○管理し提供するのが
886デフォルトの名無しさん:2012/01/22(日) 16:05:05.70
>>884-885
じゃあデータだけ見ただけだと何も言えないということでいい?

つまり

「データ=DB」
「CSVデータも本質的に立派なDBだが?」
「データを大量に詰め込めて検索できればDB」

は、データの目的が書いてないので、DBと言い切るのはトンデモ理論ということでいいよね。
887デフォルトの名無しさん:2012/01/22(日) 16:11:31.87
888877:2012/01/22(日) 16:48:18.64
それらを どうしても"トンデモ理論にしたい"で  考えたらそうなるね
そのスタンスでいる限り平行線になるな どっちも
メンドイから抜けるわ

罵倒されるだろうけどあえて受けるよ
じゃ頑張ってね
889デフォルトの名無しさん:2012/01/22(日) 16:53:17.31
>>877
そもそも構うだけ無駄だった
まぁ言った通りの低能ぶりだったろ

結局辞書で調べろと言っても分からない奴には何を言っても無駄
890デフォルトの名無しさん:2012/01/22(日) 17:32:57.64
お前が辞書で調べろっていう
891デフォルトの名無しさん:2012/01/22(日) 17:48:25.04
http://e-words.jp/w/E38387E383BCE382BFE38399E383BCE382B9.html
複数ユーザーで使用するエクセルの表・・・
立派なデータベースですねw
892デフォルトの名無しさん:2012/01/22(日) 17:55:54.10
>>890
生徒のテストの点数をエクセルで管理してる全国の教職員に謝ったら?
893デフォルトの名無しさん:2012/01/22(日) 18:05:57.04
うわーえらーい、すごーい
894デフォルトの名無しさん:2012/01/22(日) 18:27:10.66
え、何?
お前の中では「エクセル表がデータベースかどうか」って話だったの?
さすが、レベルが違うわ〜
895デフォルトの名無しさん:2012/01/22(日) 18:40:52.85
引数付きのプロシージャーを呼び出す時って、
Callの時は引数を括弧でくくって、Call付けない時は括弧を付けない。
と言うことでOK?
896デフォルトの名無しさん:2012/01/22(日) 18:52:40.11
半分OK
897デフォルトの名無しさん:2012/01/22(日) 19:24:29.62
>>888
無理やり引き分けに持ち込んだ気になって、自己満か。
まあ、理論的に返せないから、彼にとっては一番いい解決法なんだろうな。
898デフォルトの名無しさん:2012/01/22(日) 19:47:59.28
>>897
複数のアプリケーションソフトまたはユーザによって共有されるデータの集合のこと。

複数のアプリケーションソフトによって共有されるデータの集合のこと。
複数のユーザによって共有されるデータの集合のこと。
この片方でも満たしていればデータベースと呼べるわけだが・・・

頭悪いの?広い意味では図書館すらデータベースなのにw
899デフォルトの名無しさん:2012/01/22(日) 19:52:20.31
VBA力と回答力を試しているんですが
900デフォルトの名無しさん:2012/01/22(日) 20:04:38.66
>>898
へぇ〜、ファイルサーバーで共有されているファイルは、全部データベースって呼べるんだ。
これまた、すごい珍説乙。

まだ >>888 で止めときゃいいのに、馬鹿だねぇ。(w
901デフォルトの名無しさん:2012/01/22(日) 20:13:32.56
>>900
馬鹿過ぎワロタw

>ファイルサーバーで共有されているファイルは
ファイルサーバーは

それと別人だから、お前と違って恥ずかしい勘違いしてるから仲間が居ない奴とは違うw
902デフォルトの名無しさん:2012/01/22(日) 20:30:26.88
>>901
落ち着いてレスしろよ、なに言ってるのかわからん。

本人にもわかっているのか、怪しいけど。(w
903デフォルトの名無しさん:2012/01/22(日) 20:36:41.00
>>902
日本人専用なの、チョンに合わせて書く事はできませぬw
904デフォルトの名無しさん:2012/01/22(日) 20:57:42.86
ああごめん、反論できなくなるとチョンとか言い出すんだったんだよな。

わかりやすいね。(w
905デフォルトの名無しさん:2012/01/22(日) 21:12:25.54
>>904
>>901が理解できるようになってから書き込んでねw
これだからチョンはw
906デフォルトの名無しさん:2012/01/22(日) 21:52:25.63
>>905
え゛っ、マジで >>901 がまともなレスだと思っているんだ…、すごいな。

>ファイルサーバーで共有されているファイルは
ファイルサーバーは
> それと別人だから、お前と違って恥ずかしい勘違いしてるから仲間が居ない奴とは違うw

誰か、翻訳してくれ。
907デフォルトの名無しさん:2012/01/22(日) 22:25:55.91
質問のある方、こいつらのワケワカメな話に付き合う必要ないから、どうぞ〜
908デフォルトの名無しさん:2012/01/22(日) 23:04:51.26
DBを解ってる奴が2人しかいないなんて・・・
909デフォルトの名無しさん:2012/01/22(日) 23:07:29.40
レコードの中にフィールドがあり、フィールドの中にデータが入っているのがデータベース
データベースの定義はたったこれだけ

検索だの抽出だのシステムかどうのとかいうのはまた別の話
910デフォルトの名無しさん:2012/01/22(日) 23:18:19.90
そもそもDBとDBMSの区別ができてないやつがいるな

一般論で言えばデータが集まってれば何でもデータベースだよ
一連のスレをざっと見て目に付いた単語を並べると、図書館、ファイルシステム、CSV、エクセルのシート、みんな正解
メモ帳はアプリだから違う。カテゴリー分けするなら、DBではなく、極めて原始的なDBMSの方に入る
それをどう使うか、効率、使いやすさ、規模ってのはまた全然別の話。検索だの削除だのもみんな運用側の話だわな
911デフォルトの名無しさん:2012/01/22(日) 23:48:41.18
昼過ぎはDB理解してる奴が一人も居ない件について
912デフォルトの名無しさん:2012/01/23(月) 00:03:20.57
エクセルのデータをIEにVBAで転記していますが、ボタンを押して、
データが正しいときと、間違っているときでは開かれるサイトが違います。

そこで処理が正しければ、EXCELのその行のA列に"OK"といれて
ダメなら"Error"とでも入れたいのですが、
そのIE上の処理が正しいかどうかを判別する方法ありますか?

例えば、ボタンを押した後に出てくるアドレスとかがEXCELに取得できれば
判別できるのかと考えていますが、そんな方法ありますか?

お願いします。
913デフォルトの名無しさん:2012/01/23(月) 00:33:42.81
>>906
>ファイルサーバーで共有されているファイルは
ファイルサーバーは

↑これは、「データの集合」から「データ」に勝手に解釈変えて何言ってるの?馬鹿なの死ぬの?

>まだ >>888 で止めときゃいいのに、馬鹿だねぇ。(w
それと別人だから、お前と違って恥ずかしい勘違いしてるから仲間が居ない奴とは違うw

これは勝手に同一人物認定してるんじゃね〜
ファイルサーバーがデータベースじゃないとか恥ずかしい勘違いしてる奴と違って、
論理破綻してね〜から同一人物の可能性がどれだけ少ないと思ってるんだ?この低能がw

馬鹿過ぎワロタw
↑これは、教えてもらえてるのに自分の知らない知識は間違ってる事にしたい君の全てのレスに対して

こんな感じ
914デフォルトの名無しさん:2012/01/23(月) 00:34:22.77
>>912
いくらでも出来るけどスレ違い

ここはマクロ言語で「Excelを操作する」ことに関してのスレで
他のアプリを操作したりデータを取ったり渡したりは管轄外
915デフォルトの名無しさん:2012/01/23(月) 00:50:37.76
議論ですらないから反論なんてあるわけないね
916デフォルトの名無しさん:2012/01/23(月) 01:47:33.88
アプリ起動時にユーザフォームだけ出す方法として
Application.Visible = Falseがありますが、
これだと2つ以上ブックを開いていたときも全部非表示になってしまい都合がわるいです。
非表示させたいブックを指定する方法はないでしょうか?
917デフォルトの名無しさん:2012/01/23(月) 02:14:02.47
ひとつのアプリ(Excel)で二つのブック開く場合は無理だろ
関連付け変えて、ブックを開くたびに新しいExcel開くようにしな
多少多めもメモリ食うが、昨今のどころかここ数年くらいのPCなら
Excelを10個や20個起ち上げたところでメモリ不足になんかならないし
タスクボタンもグループ化出来るからさほど邪魔にならないはず

つーかさ、ユーザーフォームだけ使いたいなら、わざわざExcel使わないで普通の開発環境使えば?
VBAと完全互換のVB6は有料な上にとっくに終了してるが、オクで1/10以下の価格で出回ってるし
互換性の高いActiveBasicとか、そこそこ互換性のあるVB.NET(VB2010)とかは無料で使えるし
HTA+VBScriptなんて手もあるし
918デフォルトの名無しさん:2012/01/23(月) 02:23:32.94
>>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

見当違いの回答だったらごめんね
920デフォルトの名無しさん:2012/01/23(月) 07:03:36.43
>>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

助けてください。
922デフォルトの名無しさん:2012/01/23(月) 09:53:04.14
>>921
ヒント:>>2

ここはマクロでExcelを操作する話以外はスレ違い
923デフォルトの名無しさん:2012/01/23(月) 10:30:44.83
>>899
コラ
それはオレが広めたセリフであり
オレだけが使うことを許されたセリフだ
もし使いたいならオレの了承を取ってからにしてくれ
924デフォルトの名無しさん:2012/01/23(月) 10:38:49.73
最初に使ったのは俺だぜ
使いたいならまずはお前が俺の承諾を取れ
925923:2012/01/23(月) 11:25:08.87
のびたのくせに生意気だ
926デフォルトの名無しさん:2012/01/23(月) 11:27:27.99
ところでVBAで配列をByValで渡すと、スタックに大量のデータが積まれるの?
それともデータ領域を複製してポインタを渡すだけ?
927デフォルトの名無しさん:2012/01/23(月) 20:03:56.47
>>923
使うのがお前だけって事は全く広まってなくね?
928デフォルトの名無しさん:2012/01/23(月) 22:00:59.47
>>926
データを複製してポインタを渡すだけ。
VARIANTとSAFEARRAYを使って実装されてるっぽいし。
929デフォルトの名無しさん:2012/01/23(月) 22:19:20.89
930デフォルトの名無しさん:2012/01/23(月) 22:23:00.95
931デフォルトの名無しさん:2012/01/23(月) 23:06:12.89
>>910, >>913
*.wav って、PCM データが集まってるよな。
それを共有したらデータベースって言うわけだよな。

すごいよ、お前ら。

さすがにあほすぎて太刀打ちできんわ。(w
932デフォルトの名無しさん:2012/01/23(月) 23:24:21.19
もう・・・ノーサイドにしましょうよ・・・。
933デフォルトの名無しさん:2012/01/23(月) 23:52:45.71
>>931
本当に残念な奴だなお前はw

データを特定の形で整理した
「データの集合」がまず有って、
それを複数のユーザーで使いまわす事が出来る状態になってれば
それはもう立派なデータベースだと・・・

PCMデータを一個ずつ抜き出して意味の有る物の単位になるのか?
いい加減謝れよ、てかその屁理屈考えるのにどのぐらいかけたの?w
934デフォルトの名無しさん:2012/01/24(火) 00:43:03.87
>>933
>データを特定の形で整理した

おや? >>898 には、一言も書いてないんだけど、そんな条件。
後出しじゃんけん乙。

ちなみに、PCM データは時系列に音の大きさを特定のビット数で並べると
言う形で整理されてるし、一個ずつ抜き出せばその時点の音の大きさと言う
意味のあるデータになる

もちろんファイルサーバーなり、P2P で複数のユーザーから使いまわすことが
でぎる状態にできるし。

て言うか、複数のユーザーとか何回もアホみたいに書いてるが、一人で使う
データベースと言うものの存在も知らないのか?

例) 自分の蔵書を自分が見るためだけにデータベース化してる奴など。

> どのぐらいかけたの?

「データの集合」と言う言葉から *.wav ぐらいはすぐ思いつくと思うが、
もしかして必死に考えないと思いつかないの? (w
935デフォルトの名無しさん:2012/01/24(火) 01:32:49.56
>>934
丸一日レスが無かったから顔真っ赤にして必死に考えてたんだと思ったよw

>データを特定の形で整理した
>>869で検索できればと言っているわけだがw
検索、再利用、何かの指針にできるここまで分かってれば特定の形で整理されて無いとDB足りえないと分かるよなw
後出しではなく、君が低能なだけだねww

それと君の言ってるwavの話なんてそもそもDBじゃないでしょww
アルファベットの定義があるから、アルファベットの意味不明の文字列がDBになるなんて
誰も言ってないわけだがwww

>「データの集合」と言う言葉から *.wav ぐらいはすぐ思いつくと思うが、
>もしかして必死に考えないと思いつかないの? (w

わざと間違った方向に考える為に知恵を絞ったんじゃないの?w
真性の低能だからそういうのがパッと思いついたの?w
936デフォルトの名無しさん:2012/01/24(火) 02:26:48.68
ブルドック.wavとチワワ.wavとドーベルマン.wavを集めたら
立派な鳴き声データベースですが?
937デフォルトの名無しさん:2012/01/24(火) 02:57:11.15
データベースの定義はたった一つだけ「データの集まり」であること

補足すると、データの種類は問わない、集めた個数も問わない
定義の中にデータの種類や個数を限定する言葉は一切出てきてないんだから当たり前だね
つまり、PCMデータを集めてもいいってこと

ではここで問題
PCMデータを集めたwavファイルはデータベースか?

ヒント データが集まってればそれはデータベースだよ
938デフォルトの名無しさん:2012/01/24(火) 03:05:59.71
wavファイル一個でデータベースとか暴論すぎだろw

おはよう
こんにちは
こんばんは
こんな感じで三つあればデータベースだが

おはよう
これ一個だけを

”お”・”は”・”よ”・”う”
こう分けられるからデータベースだとか酷過ぎるだろw

誰がこんなゴミデータ再利用するの?w

データ・ベース
http://dictionary.goo.ne.jp/leaf/jn2/198592/m0u/
ベースの意味を学習しなさいw

PCMデータの一覧とかならデータベース足りえるが・・・
wavで使われる一つ一つのPCMに意味なんかないだろ?w
ゴミの集合じゃデータベースとは言えないんだよ
意味のあるデータの集まりである必要がある
939デフォルトの名無しさん:2012/01/24(火) 03:12:29.63
Microsoft Accessでテーブルを作り、無意味な16bitのデータをどんどん入れていきました
入っているデータに意味がないのでこれはデータベースではありません

これは○か×か?
940デフォルトの名無しさん:2012/01/24(火) 03:16:44.61
上の問いで作成した、無意味なデータの入ったAccessのファイルを別の人に見せました
内容が何かは伝えていません
このファイルを見た人はこれをデータベースだと思うでしょうか、違うと思うでしょうか
941デフォルトの名無しさん:2012/01/24(火) 06:08:22.67
>>935
>丸一日レスが無かったから顔真っ赤にして必死に考えてたんだと思ったよw

すごいなぁ、昼間に働くとか学校に行くとかの概念がないんだ…

>>>869で検索できればと言っているわけだがw

はぁ? そのレスが君のレスで >>898 に関連しているとエスパーしろと? ばかじゃゃねーの?

> 検索、再利用、何かの指針にできるここまで分かってれば特定の形で整理されて無いとDB足りえないと分かるよなw
> 後出しではなく、君が低能なだけだねww

検索、再利用、指針? どんどん後出しされるねぇ。
自分が >>898 で「この片方でも満たしていればデータベースと呼べるわけだが・・・」って書いたことを忘れたのかなぁ? (w

>それと君の言ってるwavの話なんてそもそもDBじゃないでしょww

そりゃそうだよ、DBじゃない例出してるんだから。
でも、君の >>898 の定義は満たしてるだろ?

>アルファベットの定義があるから、アルファベットの意味不明の文字列がDBになるなんて
>誰も言ってないわけだがwww
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
>わざと間違った方向に考える為に知恵を絞ったんじゃないの?w

ひょっとして、自画自賛?

>真性の低能だからそういうのがパッと思いついたの?w

そういう、自己紹介はいいから。
942デフォルトの名無しさん:2012/01/24(火) 06:42:16.23
943デフォルトの名無しさん:2012/01/24(火) 06:57:01.65
ぷ。←ボウリングしてる人
944デフォルトの名無しさん:2012/01/24(火) 10:21:26.30
>>938
wavファイル一個でも、異なる複数の音声が入っていて、
それがユーザーにとって意味あるものでかつシークとかで
検索できるものであればDBと言えるんじゃない?

「おはよう」はこれ一個だけがユーザーにとって意味あるもので
あって、一文字づつ分けるひつようないし、
「おはようこんにちはぽぽぽぽーん」とかのデータから
単語を抜き取るルールがあればDBなんじゃないの
945デフォルトの名無しさん:2012/01/24(火) 10:45:19.90
どっちかってとそのインデックスがデータベースなのでは?
946デフォルトの名無しさん:2012/01/24(火) 13:42:31.73
ここでは例えとして、インデックスではなくて、
I/OをDBMSが担っているということにしてはダメ?
947デフォルトの名無しさん:2012/01/24(火) 15:30:28.17
そろそろVBAの話しろよ
948デフォルトの名無しさん:2012/01/24(火) 15:30:28.97
いつまでDBの話してんですか。ちょっとした質問でも すれ違いだと言って回答しないのに。
949デフォルトの名無しさん:2012/01/24(火) 16:10:55.54
俺データベース定義自慢は、こっちでどうぞ。

データベース
http://toro.2ch.net/db/
950デフォルトの名無しさん:2012/01/24(火) 18:47:52.27
>>941
>すごいなぁ、昼間に働くとか学校に行くとかの概念がないんだ…
すごいなぁ、真性のコミュ障が社会に出てると思われるとでも?w
それとも君のレスを見てコミュ障だと思われないとでも?w

検索、再利用、指針≒複数人数での使いまわしの必要条件
まぁ脳みそ腐ってる奴に言っても無駄なんだろうけどw
951デフォルトの名無しさん:2012/01/24(火) 21:34:50.36
上司「12345−6789=の答えを33333になるにはどうすればいいか考えてきて^^」

俺新入社員の営業職でエクセルを使うよりも商品知識を付けたいのにエクセルの関数の問題出された
おまえら助けろ下さいおなしゃっす
952デフォルトの名無しさん:2012/01/24(火) 21:36:16.60
あれ、スレ違いだったかな
エクセル総合にいってきます
953デフォルトの名無しさん:2012/01/24(火) 22:16:24.40
if a = 5556 than a = 33333
954デフォルトの名無しさん:2012/01/25(水) 08:45:10.92
シートを削除する際に

Sheets("シート名").Select
ActiveWindow.SelectedSheets.Delete

と普通にマクロの記録で書くと、
「選択したシートに、データが〜〜[削除]をクリックしてください]
というメッセージがでますが、それを出ないようにするか、
自動に[削除]をクリックすることはできますか?
955デフォルトの名無しさん:2012/01/25(水) 09:04:43.39
検索してから質問しろ
956デフォルトの名無しさん:2012/01/25(水) 10:39:28.30
>>954
Application.DisplayAlert = False

>>955
うぜぇバカヤロウは消えろ
957デフォルトの名無しさん:2012/01/25(水) 18:50:05.47
みんながちゃんと検索するようになったら俺の存在価値がなくなっちゃうだろ!


とか思ってるのかな〜
958デフォルトの名無しさん:2012/01/25(水) 21:42:43.57
質問です
RangeからCellsをFor Eachで取り出した時の順番は左上から右に向かうというのは保証されてるんでしょうか?
ヘルプかどこかに明記されていますか?
959デフォルトの名無しさん:2012/01/26(木) 01:57:07.03
>>958
MSDNだったかヘルプだか忘れたが、どこかで保証されないと書いてあるのを見た記憶があるが、実際は決まった順序だろ?
二次元配列に取り込めば、縦方向が先になるけど。
960デフォルトの名無しさん:2012/01/26(木) 06:50:28.76
>>958-959
Rangeの取り方しだいかもよ

単純な矩形の領域だと左上から横行って下に行くけど、
不定形の領域を指定するとそうじゃなくなった。

たとえば
For Each Cell in Application.Union(Range1,Range2)
だとRange1から先に処理するんで、
Range2の方がRange1より左上にあると全体としては左上からじゃなくなる。
961デフォルトの名無しさん:2012/01/26(木) 07:16:22.31
>>958
おれが見てるのは2010のヘルプだけど、
「For Each...Next ステートメント」の所にある
「コレクション」のリンクにある記載でどう?
962デフォルトの名無しさん:2012/01/26(木) 12:56:18.30
そもそもVBAのFor Eachって、順序保障してくれてるものなのか?
963デフォルトの名無しさん:2012/01/26(木) 16:53:19.52
メモリによるんじゃね
964デフォルトの名無しさん:2012/01/26(木) 22:03:39.50
>>950
反論できなくなったので、人格攻撃?

実にわかりやすい。(w
965デフォルトの名無しさん:2012/01/26(木) 23:14:40.58
コード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 のところで←インデックスが有効範囲にない
というエラーが出ます。
どのように直せば良いんでしょうか?
966デフォルトの名無しさん:2012/01/26(木) 23:54:18.01
>>965
それだと、"5541-W,5541-M"になってしまうな。
Array(sc & "-W", sc & "-M")
このように、Array関数の個々の引数になっている事が重要かと。
967デフォルトの名無しさん:2012/01/27(金) 00:02:58.70
>>966
深夜にお付き合いいただきありがとうございます
エラーも直りました。

968デフォルトの名無しさん:2012/01/27(金) 00:13:20.74
ADOで取得したデータ20万件を、65000行単位で複数シートにすべて出力したい場合
"CopyFromRecordset dbRes 65000"という風に書いてループさせているのですが、
2枚目以降の出力になると途端重くなります。
他に高速コピーできる手段はありますか?
969デフォルトの名無しさん:2012/01/27(金) 05:26:21.74
>>968
画面の書き換え、再計算、イベント、全部切ってる?
あとExcel2010に乗り換えれば分割する必要なくなるよ
970デフォルトの名無しさん:2012/01/27(金) 08:54:25.58
CopyFromRecordsetか忘れたけど、知る限りDBからの貼り付けではそれが一番高速。
その場合、貼り付け行数分ずつの取得になると思う。
答えになってないけど何やったか書いてくれないと答えようがないなぁ
971デフォルトの名無しさん:2012/01/27(金) 08:55:24.16
書いてあった!ゴメン!
972デフォルトの名無しさん:2012/01/27(金) 09:08:42.04
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
973デフォルトの名無しさん:2012/01/27(金) 10:55:11.73
マクロのブックを外部から開いてマクロを実行する時にコマンドライン引数の様に
引数を渡すのにVBSを使うやり方がありますが、WIN7(32bit)&EXCEL2010の組み合わせでも
可能でしょうか?
可能な場合その時に使うAPIの名前や構造はXP(32bit)と同じでしょうか?
もしくは、簡単にコマンドライン引数を受け取るやり方はありますでしょうか?

当方、XPとEXCEL2003しかなく現地作業をしなくてはいけないので情報を御願いします。
974デフォルトの名無しさん:2012/01/27(金) 14:20:56.18
>>972
できる。
適当にググって見つけたページ:
http://www.simple-sys.com/blog/vbamatome/vbamatome007/
975デフォルトの名無しさん:2012/01/27(金) 14:22:21.02
>>973
別のBookからパラメータ付きでそのマクロブックのマクロを実行するのでは駄目なの?
976デフォルトの名無しさん:2012/01/27(金) 17:16:34.20
>>975
レスありがとうございます。
別のマクロブックを用意して、そのブックで外部プログラムからのパラメータを受け取って、
目的のマクロを起動すると言うことでしょうか?
多分、私にはハードルが高そうな感じがします。

VBSに目的のマクロブックを起動するスクリプトを書いて、必要なパラメータを
渡すやり方は何度かやったことがあるので、この方法を採用しようと思ったのですが、
win7とexcel2010を扱ったことがないので質問しました。
977デフォルトの名無しさん:2012/01/27(金) 19:34:06.14
>>964
検索、再利用、指針≒複数人数での使いまわしの必要条件
議論ですらないから反論なんてあるわけないね

↑これ無視してる都合の良い脳みそだから人格攻撃位されるだろw
978デフォルトの名無しさん:2012/01/28(土) 00:58:23.24
>>977
>指針≒複数人数での使いまわしの必要条件

>>934
> て言うか、複数のユーザーとか何回もアホみたいに書いてるが、一人で使う
> データベースと言うものの存在も知らないのか?
> 例) 自分の蔵書を自分が見るためだけにデータベース化してる奴など。

わざわざ例まで書いてあるのに、アホ過ぎ。
979デフォルトの名無しさん:2012/01/28(土) 01:20:13.55
>>978
基本複数人数で使う物だけどなw
同じシステムで作るから、名前そのままにしただけだろ

で、他に何かいえる事有るの?てか、別に複数人で使わないでも言うってURLまで
貼ってこっちから示してるわけだがw
そんなんだからコミュ障言われるんだよ
980デフォルトの名無しさん
>>979
指摘されたら 「基本」とか、アホ過ぎて議論にもなってない。

> 別に複数人で使わないでも言うってURLまで
> 貼ってこっちから示してるわけだがw

示してるレス番書いてみな。