Excel VBA 質問スレ Part15

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
2デフォルトの名無しさん:2010/04/15(木) 01:11:01
>>1乙です
3デフォルトの名無しさん:2010/04/15(木) 07:05:02
rivate Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If 2 < X < 14 And 2 < Y < 14 Then
Label1.Visible = True
Else
Label1.Visible = False
End If
End Sub
ワークシート上に配置したコマンドボタン(縦、横共に大きさ15)
上にマウスがある場合はラベル1を表示。
ボタンの端にある場合は非表示にしたいのですがうまくいきません。
(わけあってユーザーフォームは使わずに作りたいのですが。。。←ユーザーフォーム上はmousemoveイベントがある)
透明なラベルを後ろに配置し、そこにマウスが乗った時に
ラベル1を非表示にすることはできましたが、
透明なラベルをクリックすると見栄えが悪いので上記の方法を取り組んでいます。
よろしくお願いいたします。
4デフォルトの名無しさん:2010/04/15(木) 08:38:37
このIF文実行できんの?
5デフォルトの名無しさん:2010/04/15(木) 08:57:49
で、どう動かないの?
イベントはあるんだっけ?
まぁあったとして、それじゃあマウスの移動速度依存だよ
.netなら入ってきた、出ていったイベント使えるけど。

だから他のコントロールと連携してマウスの動きを監視するとかしないと期待する結果とはならないです。

オレだったらそのイベント1秒後にAPIでマウス座標取るようにするかな、OnTimeで。
6デフォルトの名無しさん:2010/04/15(木) 12:35:35
>>3
× If 2 < X < 14 And 2 < Y < 14 Then
○ If 2 < X And X < 14 And 2 < Y And Y < 14 Then

>>4
できる。「2 < X < 14」は「(2 < X) < 14」だから、VBAの場合は常に真になる。
7デフォルトの名無しさん:2010/04/15(木) 12:48:45
わずか数ドットの範囲をチェックする方法だと、マウスを速く動かすとイベントがうまく発生しないよ
8デフォルトの名無しさん:2010/04/15(木) 12:50:20
commandbottunを複数用意し、clickイベントでそれぞれのcaptionを
A列の一番下の行の下に表示させたいと思っています
(日記で天気を入力するような感じです
晴れ曇り雨ボタンを作成して、それぞれを記入する感じです。
またこの先も追加される可能性があります)
こういった複数のボタンの動作をまとめることは可能ですか?
それとクリックイベントとダブルクリックイベントもまとめたいのですが、可能でしょうか
連続で押すとダブルクリックとみなされてしまいイベントが発生せず困っています

'この三行をCommandButton2.3以降もまとめたい
Private Sub CommandButton1_Click()
Call tenki(CommandButton1.Caption)
End Sub
'ダブルクリックも同様にまとめたい
Private Sub CommandButton1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Call tenki(CommandButton1.Caption)
End Sub
'書き込みルーチンです。
Sub tenki(tenkihensu As String)
Dim gyo As Long
gyo = Range("A500").End(xlUp).Row + 1
Cells(gyo, 1) = tenkihensu
End Sub
9デフォルトの名無しさん:2010/04/15(木) 13:45:50
>>8
VBAでは無理。ずらっと並べて書くしかない。VBだとまとめられるんだけどねえ。
10デフォルトの名無しさん:2010/04/15(木) 23:13:58
>>8
クラスモジュールを使ったらどう?

>クリックイベントとダブルクリックイベントもまとめたい
未対応です(クリックイベントのみです)

1)クラスモジュールを挿入(モジュール名 Class1)
 Private WithEvents myButton As MSForms.CommandButton
 Public Property Let SetButton(Button As MSForms.CommandButton)
   Set myButton = Button
 End Property
 Private Sub myButton_Click()
   Call tenki(myButton.Caption)
 End Sub

2)ThisWorkbookへ記述(CommandButton1〜CommandButton10まである場合)
 Private myButtonArray(1 To 10) As New Class1
 Private Sub Workbook_Open()
  Dim i As Integer
  Dim Sh As Worksheet
  Set Sh = Sheets("Sheet1")
  For i = 1 To 10
    myButtonArray(i).SetButton = Sh.Shapes("CommandButton" & i).DrawingObject.Object
  Next
 End Sub

※2)のコードは標準モジュールでもいいんだけど
 このコードが実行された時点でクラスモジュールのコードが
 CommandButtonと結びつき 有効(実体化)となります。

参考にしたサイト
ttp://oshiete.homes.jp/qa4601661.html
11デフォルトの名無しさん:2010/04/16(金) 01:40:41
最近Excel2000 VBAを勉強し始めました。
これまではCをやってきたので、その違いに戸惑っています。そこで教えてください。
1
見やすいソースになるように、TABを使って自分なりの整形するのですが、
次の行に移ると、勝手にレイアウトが変えられてしまいます。
普通のエディタのようにレイアウトを保持することは出来ないでしょうか?

2
TABが、半角スペース4つになってしまいます。TABを保持させるには、
どの設定を触れば良いでしょうか?

3
変数宣言をしないとコンパイルエラーを起こすように出来ないでしょうか?
1文字タイプミスしても変数として動作するため、ちょっと心配なんです。

4
予約語の先頭が大文字になってしまうのですが、これを止めることは出来ないでしょうか?

5
複数行をコメントアウトするのに、行選択してボタンを押すようですが、
/*
*/
のような記述はできないでしょうか?

6
セルを指し示すとき、Cells( y, x )で指示するようですが、
Cells( x, y )のようにすることは出来ないでしょうか?

以上です。宜しくお願いします。
12デフォルトの名無しさん:2010/04/16(金) 02:04:17
>>11
(1) できない
(2) 変えられない
(3) モジュールの先頭にOption Explicitと書く
(4) できない
(5) できない
(6) できない

座標がy, xになるのはExcelに限らず表計算ソフトのルールだから慣れるしかない。
それにy, xじゃなくてr, cと覚えた方がいい。
ソース関連は別のエディタで書いてコピペするぐらいしか根本的な解決方法がない。

VBAはあくまでもVBのサブセットだから制約がかなり多い。VBAである必要性がないのならVBを使った方がいい。
13デフォルトの名無しさん:2010/04/16(金) 02:10:40
前スレで出てたけど、予約後の先頭を大文字にしない方法は一応ある。
たとえばIfをifにしたい時はdim if [Enter]と入力してからこの行を消去する。
そうするとエディタが一時的に「if」というキーワードを記憶してくれる。
とても実用的な方法ではないけどね。
14デフォルトの名無しさん:2010/04/16(金) 09:20:24
(5)編集コマンドバーに、複数行をコメントにする機能ならあるけど
15デフォルトの名無しさん:2010/04/16(金) 10:08:39
>>12-14
みなさん、ありがとうございます。よくわかりました。
慣れるしかないって感じですね。

エディタのツール→オプション→編集のところに「変数の宣言を強制する」というチェックボックスがありました。
これは、>>12のご回答「(3) モジュールの先頭にOption Explicitと書く 」と
同じ効果がありそうな、感じがします。

>VBAである必要性がないのならVBを使った方がいい。
  VBにすると、私の質問の多くが解決されそうでしょうか?
  特にTABの保持が実現できるなら、VB買おうかなと思います。
  アプリを1から作るためのVBではなく、
  トレース実行など、現在のVBAのようにExcelとの連携が密にできて、
  Excel付属のVBAの使いにくさが解決できるなら、ぜひ買いたいです。
16デフォルトの名無しさん:2010/04/16(金) 10:38:47
(5)について

ご希望のとは違うし、これが2000でも使えるかどうかは知らんけど

VBEのコードを簡単にコメントブロックする方法
http://officetanaka.net/excel/vba/tips/tips04.htm

17デフォルトの名無しさん:2010/04/16(金) 11:48:08
>>16
うぉーーー、これは便利です。
さっそく取り入れました。キーボードから手が離れないのが素晴らしいです。
これはいいです。ありがとうございました。すばらしい。

ちなみに、初心者質問させてください。
C言語などで言う「#include "hoge.c"」のような、ソースファイル組み込みは
VBAでできるでしょうか?
   単にその位置に別ファイルのソースを挿入するだけの機能です。
   1つのボタンでの処理が長くなってきたので、別ファイルに分割したいと思っています。
   subにしてもよいのですが、変数をpublicで宣言したりとか、結構手間そうなので。
   includeというキーワードで検索したのですが、見つけられませんでした。
18デフォルトの名無しさん:2010/04/16(金) 12:01:05
そもそも#include "hoge.c"とかやるのが筋が悪い
19デフォルトの名無しさん:2010/04/16(金) 12:09:50
17です。
すごいページを見つけましたので、貼っておきます。
http://www.ne.jp/asahi/hishidama/home/tech/lang/index.html
こういうのが欲しかった、みたいな。素晴らしいページです。
このページに依れば、VBAには、#includeは無いみたいです。
ありがとうございました。

>そもそも#include "hoge.c"とかやるのが筋が悪い
そうなんですけど、
関数化で階層化すると、スタックの待避や復元などのオーバーヘッド時間で
処理が遅くなることもあるので、1関数内に書いてしまう私です。すみません。
20デフォルトの名無しさん:2010/04/16(金) 12:43:52
アホか
21デフォルトの名無しさん:2010/04/16(金) 13:22:40
関数呼び出し程度のオーバーヘッドが嫌なのに、VBやVBA使うの?
22デフォルトの名無しさん:2010/04/16(金) 13:29:37
すみません。組み込み屋なので、マイコンのときは気にしてしまいます。
エクセルはPCなので関係ありませんが、
記述スタイルを踏襲したいんです。
23デフォルトの名無しさん:2010/04/16(金) 14:22:26
頭固すぎw
24デフォルトの名無しさん:2010/04/16(金) 14:26:57
コボラーがJavaやるみたいなもんか
25デフォルトの名無しさん:2010/04/16(金) 15:25:52
(;゚д゚)ァ
26デフォルトの名無しさん:2010/04/16(金) 16:31:15
だめだこりゃ
27デフォルトの名無しさん:2010/04/16(金) 16:54:02
言語仕様や開発環境の違いをいちいち気にしてたら仕事にならない。適応力を試されてると考えるんだ。
複数の環境を使い分けられない人間はプログラマーをやる資格がない。
28デフォルトの名無しさん:2010/04/16(金) 22:25:21
最近打ち合わせでは分かり切ったことは飛ばして話を進めているのに
知識として持っててあたりまえのことを質問する馬鹿が増えた
29デフォルトの名無しさん:2010/04/17(土) 13:12:27
TABの保持にこだわる理由が分からん
変数の宣言位置を揃える古臭い書き方でもしてるのか?
30デフォルトの名無しさん:2010/04/17(土) 13:18:02
むしろ半角スペースになった方が揃うでしょ
31デフォルトの名無しさん:2010/04/17(土) 13:18:44
どんなエディタで見ても、ね
もちろん固定幅フォントにする必要はあるが
32デフォルトの名無しさん:2010/04/17(土) 19:52:46
2つのシートに行った来たりして、変数に数値を入れるマクロができました。
sub ○○を
標準モジュール、module1に記述しています。

ボタンを作ってクリックすればマクロが動かせると言うことで、
sheet1にボタンを作って、clickにて動くようにしたところ(コードはsheet1に移動)

rangeコマンド等が、sheet1を書き換えるようになってしまいました。

sheets("sheet2").select
range("A1").value = hogehoge

みたいな感じにして、従来はきちんとsheet2のA1に数値が入っていたのですが、
sheet1のA1に数値が入るようになってしまいました。

with sheet1のような感じになっているのですが、
どのように対処すればいいでしょうか?
33デフォルトの名無しさん:2010/04/17(土) 20:00:25
VBAを捨てる
34デフォルトの名無しさん:2010/04/17(土) 20:03:15
説明がよくわからないのでその.xlsをうpしてください
35デフォルトの名無しさん:2010/04/17(土) 20:46:39
>>32
その説明では状況がまったくわからないので答えようがない
36デフォルトの名無しさん:2010/04/17(土) 22:03:54
withsheet2で
37デフォルトの名無しさん:2010/04/17(土) 22:05:30
>>32
range("A1").value = hogehoge
のコードもsheet1にあったりする?

この状況だと対策は
Rangeへ シート指定する
 or
コードを標準モジュールに戻す
38デフォルトの名無しさん:2010/04/17(土) 23:47:36
>>32
それぞれのモジュールで
MsgBox Range("a1").WorkSheet.Nameとしてみな。
39デフォルトの名無しさん:2010/04/18(日) 01:39:24
>>29
>TABの保持にこだわる理由が分からん
キミにはわからないだろうな、きっと。
401/2:2010/04/18(日) 02:05:26
以下のようなランダム出題によるYES,NOクイズをつくりました。
しかし、無駄な記述が多すぎてクイズが100や200になったときには処理が遅くなる気がするのと、
もっと見易い書き方ができるような気がします。
(例えばいちいち問題文に""をつけるのは面倒くさいので、ans部分で一括してつけるとか)
修正できる方、修正お願いします。
また三択以上の問題(例.a.明智光秀、b.豊臣秀吉、織田信長)にするときの記述も思いつかないので、
そちらも教えてください。

Dim a As String
Dim b As Integer
Dim c As Integer

b = Int(3 * Rnd + 1)

If b = 1 Then
a = "本能寺の変を起こしたのは明智光秀である"
c = 0

ElseIf b = 2 Then
a = "関ヶ原の戦いは1500年に起こった"
c = 1

Else
a = "平城京が移転したのは710年である"
c = 0
End If

ans = MsgBox((a + "?"), vbYesNo, "質問")
412/2:2010/04/18(日) 02:06:08
If c = 0 Then
Select Case ans
Case vbYes
MsgBox "正解"

Case vbNo
MsgBox "不正解"
End Select
Else
Select Case ans
Case vbNo
MsgBox "正解"

Case vbYes
MsgBox "不正解"
End Select
End If
4240:2010/04/18(日) 02:11:21
なお、一から書き直した方が作りやすい場合は、
私の記述を元にせずに、そちらを書いて下さい。
43デフォルトの名無しさん:2010/04/18(日) 02:16:37
無駄な記述が多すぎ
一から書き直した方が作りやすい
おまえに書いてやったら何かくれるなら書いてやらんでもない
44デフォルトの名無しさん:2010/04/18(日) 02:25:42
問題をプログラムに埋め込むな
せっかくExcel使ってるんだから
問題文と正解・不正解を
シートに記述出来るように汁
45デフォルトの名無しさん:2010/04/18(日) 08:17:25
>>40
そのままでも100や200なら大して遅くはなりませんから安心して下さい。
丸写しは感心しないので、まずは二択のプログラムを作ってみせてください。

二択の問題の例
問題   本能寺の変を起こしたのは誰か?aかbで答えなさい。
選択肢 a.明智光秀、b.豊臣秀吉
解答   (  )
46デフォルトの名無しさん:2010/04/18(日) 09:00:20
b
47デフォルトの名無しさん:2010/04/18(日) 09:05:52
c 織田信長
48デフォルトの名無しさん:2010/04/18(日) 09:09:57
俺をaとかbとか記号で呼ぶな
49デフォルトの名無しさん:2010/04/18(日) 09:51:25
d. 徳川家康
e. 千利休
f. 柴田勝家
50デフォルトの名無しさん:2010/04/18(日) 22:19:22
かなり既出であれば申し訳ありません

VBAでPDFファイルを作成したいのですが,以下の件で困っています
・ファイル名,出力先フォルダを指定できない

1,2回であれば,手作業でもかまわないのですが,
各事業所毎に出力するため30回ちかく保存先ダイアログが出る度に
ファイル名を入力して保存しています。

PCにはAcrobat,クロセPDF2などがインストールされています。

よろしくご指導ください。

511/2:2010/04/19(月) 01:01:43
>>43-45
ありがとうございます。
参考にして2択問題をつくってみました。
vbyesnoでは作り方がわからなかったため、
ボタン式ではなくaかbを入力式にしました。

皆さんなら言うまでもなくわかると思いますが、
A列に問題文(本能寺の変をry)、B列に選択肢a(明智光秀)、
C列に選択肢b(豊臣秀吉)、D列に答え(a)がエクセルに入ってます。


Dim a As String
Dim b As String
Dim c As String
Dim ans As String
Dim d As String
Dim i As Integer

i = 1
a = Cells(i, 2).Value
b = Cells(i, 3).Value
c = Cells(i, 1).Value
d = Cells(i, 4).Value
522/2:2010/04/19(月) 01:02:31
ans = InputBox(c + "? aかbで答えなさい。" & vbCrLf & "a." & a & " b." & b)

If ans = d Then
MsgBox "正解"

ElseIf ans <> "a" And ans <> "b" Then
MsgBox "aかbで答えて下さい"

Else
MsgBox "不正解"
End If
53デフォルトの名無しさん:2010/04/19(月) 01:12:36
クロセPDF2は使用禁止です
54デフォルトの名無しさん:2010/04/19(月) 02:00:16
× クロセ
○ クセロ
55デフォルトの名無しさん:2010/04/19(月) 02:02:42
>>50
出力する方法はたくさんありますし、何もかも説明するのは不可能です。
今はどんなマクロで出力していますか。保存の部分を書いて下さい。
たぶん少し修正するだけで自動化できる可能性があります。
56デフォルトの名無しさん:2010/04/19(月) 02:40:55
>>51
その方法だと、三択の時は解答がE列、四択だと解答がF列になってしまいます。
目的(この場合は解答)が同じセルは同じ列にまとまるようにすれば、
プログラムを作る手間が少なくなります。もう一工夫しましょう。
57デフォルトの名無しさん:2010/04/20(火) 08:41:10
Invoke()は使えますか?またはその代替
58デフォルトの名無しさん:2010/04/20(火) 20:12:19
IDispatch::Invokeなら、遅延バインディングしてれば内部で勝手に使うだろ。
59デフォルトの名無しさん:2010/04/21(水) 00:33:10
>>56
なるほど。
つまり、A列が問題としたらB列を解答として、
数が可変な選択肢は最後の方の列に羅列した方がいいというおとですね。
60デフォルトの名無しさん:2010/04/21(水) 14:39:31
質問です
VBAのFSOを使ってファイルを抽出
データのファイル名や最終アクセス日などリスト化
ここまではできたのですが指定した日付より
前のアクセス日時のものをほかの列にリスト化するということが
できません、どなたか教えて頂けませんか?
61デフォルトの名無しさん:2010/04/21(水) 14:49:42
それはご愁傷様です
62デフォルトの名無しさん:2010/04/21(水) 15:54:34
オートフィルタ→コピー
63たろう:2010/04/21(水) 19:32:46
テキストボックスの設定でコンボボタンをクリックしたらテキストぼっくっすの数値をシート1のA列に記入しなさい
とまではわかったのですがテキストボックスが空白の時にデバックがかかってしまうのですが
どうやればかいひできますか?
64デフォルトの名無しさん:2010/04/21(水) 19:36:27
テキストボックスが空白の時にテキストぼっくっすの数値をシート1のA列に記入しないようにすればいいよ
65たろう:2010/04/21(水) 19:36:52
どうすればいいですか?
66デフォルトの名無しさん:2010/04/21(水) 20:56:33
そんな初歩的な・・・。
67デフォルトの名無しさん:2010/04/21(水) 22:47:15
文字列をひっくり返す関数下さい

in→あいうえお
out→おえうあい

こんな感じのです
68デフォルトの名無しさん:2010/04/21(水) 23:24:02
特定の文字列を逆転させる

サンプルマクロは、アクティヴシートのA1の文字列を逆転させます。
Sub Sample()

Dim myStr As String
Dim myLetter As String
Dim i As Integer

i = Len(Range("A1").Value) + 1
While i > 1
i = i - 1
myLetter = Mid(Range("A1").Value, i, 1)
Select Case StrConv(myLetter, vbWide)
Case "゛", "゜"
i = i - 1
myLetter = Mid(Range("A1").Value, i, 2)
End Select
myStr = myStr & myLetter
Wend

Range("A1").Value = myStr

End Sub
69デフォルトの名無しさん:2010/04/22(木) 14:37:40
>>67
Function 反転(S)
  For i = 1 To Len(S)
    T = Mid(S, i, 1) & T
  Next
  反転 = T
End Function
70デフォルトの名無しさん:2010/04/22(木) 14:41:08
VBAで出来そうで思いつかないので知恵を貸してください。

1.ある商品を数箇所に店舗に卸します。
2.それぞれの店舗のオーダー数はバラバラですが、カートンは出来るだけ共通のものを使いたいと思います。
  ただし、取扱いに困るほど大きいものは使えません。
3・それぞれの店舗の発注数を入力するだけで、最適なカートン入数を弾き出せないでしょうか?

<例>
靴の発注(10足〜20足入りが最適)
店舗A  120足
店舗B   82足
店舗C  118足
店舗D  180足

10足入りをメインにすると、2足と8足入りの端数が出るため3種類のカートンが必要になります。
20足入りでも同様です。
そこで12足入りにすると、

店舗A  12足入*10 = 120足
店舗B  12足入*6 + 10足入 = 82足
店舗C  12足入*9 + 10足入 = 118足 
店舗D  12足入*15 =180足

ということで12足入と10足入の2種類で済みます。

こういった計算を自動でするにはどの様な式を組めばいいのか知恵を貸して頂きたく・・。

もしかしたら他スレで訊くべき内容かもしれませんが、計算に強い方がいらっしゃいましたら
知恵を貸してくださいm(_ _)m
71デフォルトの名無しさん:2010/04/22(木) 14:42:20
ageさせてください!
72デフォルトの名無しさん:2010/04/22(木) 15:07:34
>>70
条件が「取り扱いに困るほど大きい」では計算ができません。
いくつ以下、と具体的な数字で示して下さい。
73デフォルトの名無しさん:2010/04/22(木) 15:15:59
>>67-69
Mid statementを使えば、For i=1 To Len(s)/2でできるだろ
74デフォルトの名無しさん:2010/04/22(木) 15:20:17
>>70
10足分入るカートンと、12足分入るカートンの2種類があって
最適な組み合わせを調べたいってこと?
75デフォルトの名無しさん:2010/04/22(木) 15:22:28
>>72
商品によって変わるので一概に言えません。
(例としては靴の場合で10-20足入としました)
とりあえず変数で示して頂ければ幸いです。

実務上では品目ごとにを許容範囲を設定し、参照する形にしたいと思います。
76デフォルトの名無しさん:2010/04/22(木) 15:30:54
>>74
全数を最小の種類のカートンで出荷するには、何足入と何足入のカートンを用意すればいいのか? 
ということを調べたいのです。

例では、
10足入の場合は、他に12足入と18足入の合計3種類カートンを作らなくてならないのに対し、
12足入では12足入と10足入の2種類で済むので効率的です。

実際は取引先も扱い商品も多数あり、いちいち考えるのが大変なので、
自動で最適結果を出したいと思っています。
77デフォルトの名無しさん:2010/04/22(木) 15:51:37
素因数分解と最大公約数がミソだが
カートン候補がありすぎるとプログラムも大変だな
78デフォルトの名無しさん:2010/04/22(木) 16:06:33
まず4C2で6通りの最大公約数を求める
@ この6つの公約数を見比べて、標準カートン10前後の奴の数が多い奴で1つ確定
30とか40とか大きくなったら10にするような処理が必要
それでまず2店舗〜4店舗が確定

残りの2店舗で割り切れない場合
A その2店舗の最大公約数があればそれでもう1種確定

それがなければ
B @の確定カートンで割った余りを求め、その余り2つに公約数があれば確定

それもなければ
C Bの商から1減らしてあまりを求め(つか、さっきの余りに@をプラスして)、その2つに公約数があれば確定

@で、標準カートンに近いものがない場合(2とか3とかにしかならない)
強引にカートンを10にしてしまいBから以下を4店舗分繰り返す
79デフォルトの名無しさん:2010/04/22(木) 16:10:07
仰るとおり、因数分解と公約数だな、と思ったのですが、
これが中々難しくて・・・

アタマが痛くなってきてしまいましたw
80デフォルトの名無しさん:2010/04/22(木) 16:16:31
店舗Eの発注が9足だった場合、許容範囲を9〜に下げて
そして9個いりのカートンは使うってことなのかな?
81デフォルトの名無しさん:2010/04/22(木) 16:24:02
力づくで計算したらいいのに
For K=カートン最小値 To カートン最大値
S=必要数(K)
If S > 暫定必要数 Then S = 暫定必要数
Next
82デフォルトの名無しさん:2010/04/22(木) 16:32:03
>>80
1つ違うくらいならそうしたいですが、大幅に違う場合は例外として扱うことになると思います。
(1000-5000個が適用範囲の商品に、15個の発注が来た場合など)

ただ、実際にはあまり少量のオーダーは受けないので無視して良い事例かと思います。

>>78
ちょっとイメージできないので考えさせてください・・


皆さんありがとうございますm(_ _)m
83デフォルトの名無しさん:2010/04/22(木) 16:38:46
VBAに関係ないことになると嬉々としてレスする奴がいるよな
84デフォルトの名無しさん:2010/04/22(木) 16:39:33
単純に
下1桁が2の倍数なら、12カートンを(1桁/2)個用意すれば、残りは10カートンで済む
どうせ奇数はないんでしょ?あっても繰り上げすれば済む

結論
全て12と10のカートンでおk
85デフォルトの名無しさん:2010/04/22(木) 17:02:46
>>84
すみません。カートン総数も減らしたいので出来るだけ多くパッキングしたカートンを基本にしたいのです。
書いてなかったですね。申し訳ない。
奇数もありますが、ご指摘のとおり繰上げ処理でも問題ないです。

なんかスレ違いな気がしてきたので、もうちょっと考えてみますねw

スレ汚し失礼しましたm(_ _)m
86デフォルトの名無しさん:2010/04/22(木) 17:04:14

この書き込みの意図がわかりません
87デフォルトの名無しさん:2010/04/22(木) 17:32:08
端数を切り上げてもいいんなら、12個入りのカートン1種類だけでいいじゃん
なんか条件が曖昧すぎるよ
コンピューターのプログラムってのは、もっと厳密に数字が決まってなきゃ作れないんだよ
条件が色々あるんなら、そのすべてをリストアップするか、法則を決める必要がある
88デフォルトの名無しさん:2010/04/22(木) 17:38:18
1カートン1個なら端数は出ないし1種類で済む

それでは困る場合は、「1カートンは最低でも何個以上にするか」「カートンは何種類以下に抑えたいか」
「端数がいくつまでなら切り上げ可能か」のような数字を商品ごとにすべて決めてデータベース化しないと。
89デフォルトの名無しさん:2010/04/22(木) 18:00:49
>>85
商品別にカートンと個の間に、もう1つ数量の単位(組とか)を設定する。
上記例の靴だったら2個=1組
適用範囲1000〜5000個のものだったら200個=1組 みたいなかんじ。
組数以下の端数は1組として切り上げる。

こういう設定でできないかな?
90デフォルトの名無しさん:2010/04/22(木) 18:28:59
エクセルが高くて買えないんですけど、タダで勉強するにはどうすればいいんでしょうか?
91デフォルトの名無しさん:2010/04/22(木) 18:32:01
>>90
openoffice
92デフォルトの名無しさん:2010/04/22(木) 18:32:38
93デフォルトの名無しさん:2010/04/22(木) 18:33:43
94デフォルトの名無しさん:2010/04/22(木) 19:43:39
勉強するだけなら買わなくてもいいだろ
ネットの解説サイトを見て回ってればいい
実際に使いたいなら>>91-93
95デフォルトの名無しさん:2010/04/22(木) 22:15:02
どうもありがとうございます!
タダでずっと使えそうなOPENOFFICEで頑張りたいと思います
96デフォルトの名無しさん:2010/04/22(木) 23:48:31
コードを"ゴリゴリ書く"ってよく言うけど、
これってVBAにも当てはまると思う?

Cやアセンブラならゴリゴリが似合うけど、
VBAならベタベタとか、ポロポロとかの方が
似合う気がするんだけど。
97デフォルトの名無しさん:2010/04/23(金) 03:52:47
>>96
ゴリゴリ書くって表現は、処理の根幹部分で既存のライブラリに頼らないとか、
規模が大きかったり開発期間が短い場合に使うものだから、言語の違いは直接は関係ない。

けど、VBAはOfficeの特定の作業を自動化するのが目的の言語だから、
関数を数個書いて終わるケースが大半を占める。「ゴリゴリ書く」ことも少ないだろうね。

たまに大規模なアプリをVBAで作っちゃう人もいるけど、それはVBを使った場合にくらべて
開発効率や処理効率が悪いことがほとんど。
98デフォルトの名無しさん:2010/04/23(金) 04:04:01
すべてのヘルプを読んでから質問するように
99デフォルトの名無しさん:2010/04/23(金) 07:06:09
VBA初心者です
この言語にはポインタみたいなのはないんでしょうか?
リンクリストとかのデータ構造はどうやって実装しているんですか?
100デフォルトの名無しさん:2010/04/23(金) 07:42:43
>>99
ポインタ型はありません。
リスト構造も標準では用意されていないので、実装はプログラマー依存です。
単なる整数型のインデックスと配列の組み合わせで実現することが多いと思います。
101デフォルトの名無しさん:2010/04/23(金) 09:46:20
>>97
どうもありがとう。
ゴリゴリってそういう意味があったんですね。
知りませんでした。
ちょっとしたネタのつもりが良レスもらって感謝です。
102デフォルトの名無しさん:2010/04/23(金) 12:03:27
教えてください。

WinXP SP3 office2000を使っています。

ボタン1とボタン2があり、どちらのボタンを押しても ボタン1の色が変わるようにしたいのです。
以下のようにして記述したのですが、色が変わりません。私は何か勘違いしているのでしょうか?

Private Sub CommandButton1_Click()
  CommandButton1.BackColor = QBColor(10)  ' ボタン1のボタン色を変える 実行される
  Call hoge1                ' 関数1を実行
  CommandButton1.BackColor = QBColor(15)  ' ボタン1のボタン色を戻す  実行される
End Sub
 
Private Sub CommandButton2_Click()
  CommandButton1.BackColor = QBColor(10)  ' ボタン1のボタン色を変える 実行されない
  Call hoge2                ' 関数2を実行
  CommandButton1.BackColor = QBColor(15)  ' ボタン1のボタン色を戻す  実行されない
End Sub

宜しくお願いします。

103デフォルトの名無しさん:2010/04/23(金) 13:09:52
期待通りに動いていないんだから
どうみても勘違いです
ほんとうにありがとうございました
104デフォルトの名無しさん:2010/04/23(金) 13:27:55
>>102
変わるぞ
三つ目を用意して
Private Sub CommandButton3_Click()
CommandButton1.BackColor = QBColor(10) ' ボタン1のボタン色を変える 実行されない
Call hoge2 ' 関数2を実行
CommandButton1.BackColor = QBColor(1) ' ボタン1のボタン色を戻す  実行されない
End Sub
試してみては
105デフォルトの名無しさん:2010/04/23(金) 13:56:25
マクロはときどき壊れるからなぁ
最後に正常に動いていたときの
バックアップを取るのは必定
106デフォルトの名無しさん:2010/04/23(金) 17:02:38
>>104
追試、ありがとうございます。そうですか、動きますか。
もう一度やってみたのですが、僕の場合は動きませんでした。

hoge2関数の処理時間が3秒程度と長いので、
ボタンの色を変えて処理中であることを示したいのです。
しかし自身のボタン色ではなくて、他のボタン色を操作します。
もしかしたら他のボタンのことは操作できないのかと思っていました。
ボタン色の指示行の間に入れた関数処理自身は
正しく実行されるのですが、
指示したボタンの色がまったく変化しません。
まるで「どのみち元の色になるんだから、色を変えるのは省略します」と
言っているみたいです。
107デフォルトの名無しさん:2010/04/23(金) 17:04:05
>>102

単に関数2が一瞬で終わってるだけじゃないか?
108デフォルトの名無しさん:2010/04/23(金) 17:10:09
2003でこれ動くよ

Private Sub CommandButton1_Click()
CommandButton1.BackColor = QBColor(15)
End Sub

Private Sub CommandButton2_Click()
CommandButton1.BackColor = QBColor(10)
End Sub
109デフォルトの名無しさん:2010/04/23(金) 17:17:37
doeventはさんでみるとか?
110デフォルトの名無しさん:2010/04/23(金) 17:31:05
ホンとだ
間に処理かますと処理後の色変更しかしやがらねー
111デフォルトの名無しさん:2010/04/23(金) 17:51:22
みなさん、いろいろ試してくれて、ありがとうございます。

僕は、以前に作ったExcelブックを使い回していて、必要に応じてボタンをcopyしたりして使っています。
なので自分で新規にボタンを作ったことがありません。
調べてみると、僕の使っているボタンは「オートシェープ」という部品のようです。
ボタンとオートシェイプとの違いで、できる/できない があるのでしょうか。
ちよっとパニックです。

>>110
ありがとうございます。できないですよね。
どうしてなんでしょう。もし何かヒントがあればおしえてください。宜しくお願いします。
112デフォルトの名無しさん:2010/04/23(金) 17:55:17
>>111
じゃあたぶんボタンの名前を間違ってるだけだな

あとシェープじゃなくてシェイプな。大した違いではないけど何か調べるときに
検索やヘルプでひっかかりにくくなるから正しく覚えておいた方がいい
113デフォルトの名無しさん:2010/04/23(金) 18:06:43
>>111
しばらく触ってなかったんでキーワードがみつからないが
色変更させてからシートなりオブジェクトなりを強制再描画させるとかの技はあるはずだ
でなきゃ点滅処理さえ効かない
114デフォルトの名無しさん:2010/04/23(金) 18:16:36
>>111

hogeを呼ぶ前に DoEventsでうまくいった
115デフォルトの名無しさん:2010/04/23(金) 19:19:25
>>105
マクロはときどき壊れるからなぁ
マクロはときどき壊れるからなぁ
マクロはときどき壊れるからなぁ
116デフォルトの名無しさん:2010/04/23(金) 20:19:54
>>103
>>104
>>105
>>112 死んでよし

117デフォルトの名無しさん:2010/04/23(金) 20:49:19
Mid関数と、Mid$関数の違いって、戻り値をバリアント型で返すか、文字列型で返すかだよね?
バリアント型で返さないとエラーになる場合ってのはどういうとき?
118デフォルトの名無しさん:2010/04/23(金) 21:15:36
>>115
あの餌で釣れるとは思わなかったんだが・・・
119デフォルトの名無しさん:2010/04/23(金) 21:18:03
>>116
マクロはときどき壊れるからなぁ
マクロはときどき壊れるからなぁ
マクロはときどき壊れるからなぁ
120デフォルトの名無しさん:2010/04/23(金) 22:15:47
>>117
違う
どっちも戻り値はString型
121デフォルトの名無しさん:2010/04/24(土) 00:06:09
オブジェクトブラウザで見ると、一応バリアント型とString型に分かれているけど、
評価しようとした時点で、必要に応じて自動でバリアント経由になってしまうから、
結果的に同じ意味にしかなり得ない、って感じかと。
VBA上では単にMid$がMidのエイリアス扱いの可能性もあるけど、それは判断のしようがない。

WindowsSDK付属のOLE/COM Object Viewerで「Visual Basic For Applications (Ver 6.0)」を覗くと、
Stringsモジュールに
BSTR _stdcall _B_str_Mid([in]BSTR String, ...
VARIANT _stdcall _B_var_Mid([in]VARIANT *String, ...
の二つが見つかるのだが、これがMid$とMidに対応しているのかなあ。
122デフォルトの名無しさん:2010/04/24(土) 12:00:21
みなさんのお知恵を、お貸しください。
下のようなif文を書いているのですが、まるで能が無くて、書いてて悲しいです。

nの中心付近を整数で求めたいんです。
下の例ではn=16ですが、実は250以上あったりして、これを全部手打ちで書いています。
何か規則正しいので、計算式で求められそうなのですが、うまく考えられません。
n=0, n=1は、if文で振り分けて、それ以上がなんとかならないかと。

    If (n = 0) Then c = 0
  ElseIf (n = 1) Then c = 0
  ElseIf (n = 2) Then c = 2
  ElseIf (n = 3) Then c = 2
  ElseIf (n = 4) Then c = 3
  ElseIf (n = 5) Then c = 3
  ElseIf (n = 6) Then c = 4
  ElseIf (n = 7) Then c = 4
  ElseIf (n = 8) Then c = 5
  ElseIf (n = 9) Then c = 5
  ElseIf (n = 10) Then c = 6
  ElseIf (n = 11) Then c = 6
  ElseIf (n = 12) Then c = 7
  ElseIf (n = 13) Then c = 7
  ElseIf (n = 14) Then c = 8
  ElseIf (n = 15) Then c = 8

板汚し、すみません。
123デフォルトの名無しさん:2010/04/24(土) 12:27:04
>>117, 120, 121
Mattew Curland著 「Advanced Visual Basic6」より

You should always use the $ versions of string function whenever they are available.

If a $ version of a function is available, then its non-$
counterpart actually returns a Variant rather than a String.
Although the VB compiler is smart enough to avoid duplicating
the string when assigning the return value of a Variant
function to a String variable, a significant amount of overhead and
code generation is involved in using the non-$functions.
If you think the extra character is too much trouble,
one look at the generated code wil cure your laziness.
Search for $ in the Object Browser to get a list of the $functions.

ってことで、$版使ったほうがいいという話。
ただ、VBAなんて手抜いてナンボなんで、目くじらたててやる必要もないよなあ。
124デフォルトの名無しさん:2010/04/24(土) 12:38:09
>>122
c = WorksheetFunction.Ceiling(n / 2 + 0.1)



かな?
125デフォルトの名無しさん:2010/04/24(土) 12:54:05
126デフォルトの名無しさん:2010/04/24(土) 13:26:04
>>124
ありがとうございました。できました。
c = WorksheetFunction.Ceiling((n / 2 + 0.1),1) と、,1を追加しました。
大変助かりました。ありがとうございます。

Excelの命令が使えるこはビックリでしたが、
それよりも、VBAで切り上げ計算の演算子がないのがショックでした。
ありがとうございました。
127デフォルトの名無しさん:2010/04/24(土) 13:40:26
>>126
これでもいいんじゃね

C = Int(n / 2) + 1
If C = 1 Then C = 0
128デフォルトの名無しさん:2010/04/24(土) 14:33:34
>>127
ありがとうございます。
そうですね。1の特殊性がなければ、上の行1行でいいですね。
ありがとうございます。
助かりました。
129デフォルトの名無しさん:2010/04/25(日) 02:38:39
教えてください。

Excel VBAのプログラムを書いて、仕事の改善に使っています。

しかし、VBAのテキストエディタが使いにくいので、なんとかできないかと思っています。
VBAエディタで不満なのは、
・自分の好きなレイアウトでソースが書けない
   半角スペース、TABが無視されてしまい、ソースが見にくい
・TABが半角スペースになってしまう。

そこで、別途VB.netなどを買えば、VBA内蔵のエディタはoffになり、
VBのエディタ(TABも半角スペースによる位置揃えも可能)が使えるものでしょうか?
ブレークポイントやステップ実行なども使いたいです。
130デフォルトの名無しさん:2010/04/25(日) 02:50:13
無理
131デフォルトの名無しさん:2010/04/25(日) 02:54:30
>>129
そんなあなたにはExcelに埋め込むのは止めて
RubyとかPythonでWIN32COM経由で
Excel操作をすることを強くお奨めします
132デフォルトの名無しさん:2010/04/25(日) 04:19:39
>>129
マクロはときどき壊れるからなぁ
133デフォルトの名無しさん:2010/04/25(日) 11:01:07
>>129
あなたがVBAのエディタに合わせたほうが早いです。以上。

最初はみんな用意されたものに抵抗するんだよね。
134デフォルトの名無しさん:2010/04/25(日) 11:23:33
DLLで関数を公開することって出来ますか?
DLLの読み込みはできるようなので

・スクリプトのDLLをロード
・セル操作などをスクリプトに公開
・VBAからスクリプトをコール
・スクリプト内で計算
・スクリプト内で公開されたセル操作などを使いExcelに出力
・VBAに戻る

といったことをやりたいのですが可能でしょうか?
135デフォルトの名無しさん:2010/04/25(日) 11:28:11
ScriptControlで直接Excelからスクリプト呼び出しするのが普通。
136デフォルトの名無しさん:2010/04/25(日) 19:20:36
もとからスクリプトサポートされてるんですねthxでした
137デフォルトの名無しさん:2010/04/25(日) 20:52:08
微妙にVBAとは違うかもしれないのですがこちらで質問させていただきます
ボタンを押して現在から2時間後を出してくれるように
Cells(7, 3) = DateAdd("h", 8, Time)
と作りセルの書式設定のユーザー定義で時間と分だけを表示するようh:mmに設定しました。
同じ日内で収まる場合なら正常に8時間後を出してくれるのですが、
日を跨いでしまうとなぜかユーザー定義が勝手にyyyy/m/d h:mmに変わってしまいます
宜しければ対処法をご教授くださいませ
138デフォルトの名無しさん:2010/04/25(日) 21:13:42
>>137
Cells(7, 3).Value = Format(DateAdd("h", 8, Time), "h:mm")
139デフォルトの名無しさん:2010/04/25(日) 21:17:27
>>138
無事表示してくれました
本当にありがとうございました
140デフォルトの名無しさん:2010/04/25(日) 23:06:48
面接でVBAをアピールしたら「そんなもの下の下でしょ?(笑)という反応でした。
そんなに駄目っすか?だったらVBできますって言った方がまだ良い?
141デフォルトの名無しさん:2010/04/25(日) 23:11:28
VBAの良さって普通の人であればあるほど知らない。
ただ、他のことも出来てVBAもできる、ぐらいじゃないと意味がない。
142デフォルトの名無しさん:2010/04/26(月) 00:15:50
業種と職種による。
プログラマーならVBAは基礎知識のうちだからアピールポイントにはならない。
143デフォルトの名無しさん:2010/04/26(月) 00:29:18
基礎知識なのか
excelとかそもそも使わないし
C++一筋だったからVBA最近まで知らなかったよ
144デフォルトの名無しさん:2010/04/26(月) 11:47:01
事務員で「Excelできる人歓迎」みたいに書いてあったらVBA知ってるとかなり有利。
プログラマーならVBでもアウトだろうねえ。まあ会社にもよるだろうけど。
145デフォルトの名無しさん:2010/04/26(月) 11:52:03
まあそうだけど事務員とプログラマーじゃ一応給料が結構違うし
事務員は月給12万くらいだけどプログラマーなら25万くらいあるし
146デフォルトの名無しさん:2010/04/26(月) 12:27:51
客先常駐のPGだと経歴書にEXCELとかVBAを一切書いてなくても
本業の待ち時間にVBAのちょっとしたものを作らされたりするよね。
147デフォルトの名無しさん:2010/04/26(月) 12:50:51
プログラマーじゃないけど出身が社内SEなんで、社内SEなら業務ツール作りで
VBA使えることって便利だし重要かなと思ってアピールしたんだけどなあ・・・。

他には一応Java、Cはやってるし、鯖で必須のPerl、Python、VBSあたりも普通に
使えるんだけど、小さな会社の社内SEなんで、鯖管理で使う後者はともかく、
前者はアピールしない方が良いかと思ったんだよな。

そもそもプログラマー志望じゃないし、自社開発も無いって話だったんで、
なんか無言でシコシコ書いてるのが好きなんだろ?って思われなくなかった
っていうか。
148デフォルトの名無しさん:2010/04/26(月) 17:18:19
それを面接で言えばよかったんじゃないの?なんで言わなかったの?
149デフォルトの名無しさん:2010/04/26(月) 17:24:47
>>148
いやあ、面接官がIT系のコンサル野郎だったでやんす。
「システム導入こそすべて」みたいな奴で、もうどうにもならんかった。
開発も泥臭いとこはやってなさそうな感じの。

まあ、そんな奴がのさばってるって時点でアレなんですが。
150デフォルトの名無しさん:2010/04/26(月) 17:55:07
マ板でやれや
151デフォルトの名無しさん:2010/04/26(月) 18:18:12
Excel2007です
現在MicrosoftWebBrowserを利用して
指定セル(住所が書いてある)の地点のGoogleMapが表示されるようにしてあります。

ここでもう少し高度な操作をしたいために(ピン操作やルート案内など)
GoogleMapsAPIを使用したいのですが
ExcelVBAでGooglemapsAPI(javascript?)をGoogleMapに投げ込んで
結果をMicrosoftWebBrowserに返すにはどうすればいいのでしょうか?
152デフォルトの名無しさん:2010/04/26(月) 18:21:43
>>149
気持ちは分かる
153デフォルトの名無しさん:2010/04/27(火) 11:34:07
filecopyで、ネットワーク上の共有フォルダにファイルをコピーさせたいのですが、
共有フォルダにアクセスできない場合のエラー処理が出来ずに困っております。

dirでいけると思ったのですが、アクセスできない場合、dirでもエラーになってしまいます。

何かよい方法はないでしょうか。
154デフォルトの名無しさん:2010/04/27(火) 12:28:48
On Error
155デフォルトの名無しさん:2010/04/27(火) 13:23:14
On Error でも良いんですが接続先のサーバーやPCが落ちてるときなど
タイムアウトで実際にエラー処理に移るまでに時間が掛かりすぎて困ります
このエラーが出るまでのタイムアウトを短くするにはどうすればよいでしょう?
156デフォルトの名無しさん:2010/04/27(火) 14:18:45
>>155
ファイル処理とかネットワーク処理は、ちゃんとやろうとすると意外と大変。
とくにVBAの関数だけではタイムアウトが制御できないから、
グローバル変数を使ったフラグとタイマーを使って時間内に終わったかどう自分で調べるような仕組みを
ちまちま作るしかない。

フラグセット→タイマーセット→On Errorで強制終了回避→ファイル処理→すぐに終わったらタイマー解除
タイマーで強制的に抜けたらフラグクリア
フラグがセットされたままだったら処理成功と判断する

みたいな手順を、よく考えて作る。
157デフォルトの名無しさん:2010/04/28(水) 07:47:23
      ,―ヽ_(((((_、―
   ,/  ノ       ヽ  ~\
  /   ノ   IPA    ヽ   ~\
/   ノ           ヽ、  `ヽ
|    ノ / ̄\   / ̄~ヽ ヽ    i
|   ノ              |  ノ
\  |  <●>  <●>  (  )
 \ |      | |       i /
    |      /  ヽ       レ
   i     (●_●)      /  
    i、    ,-――-、   ・ /
    i、  <(EEEEE)> ∵/    どういたしまして
      i、  \   ./  /
       \   ーー   ,ノ       
  ,,.....イ.ヽヽ、ー-―一ノ゙-、.
  :   |  '; \_____ ノ.| ヽ i
      |  \/゙(__)\,|  i |
158デフォルトの名無しさん:2010/04/28(水) 16:43:11
ほんと糞言語だよな
スタックないなんて
切り上げ切捨てのどっちかもないよね?
159デフォルトの名無しさん:2010/04/28(水) 17:05:55
スタックっつうか配列以外のデータ構造がまともに扱えない

切り上げ切捨てはどっちも出来る
160デフォルトの名無しさん:2010/04/28(水) 19:08:50

実装できないwww
161デフォルトの名無しさん:2010/04/28(水) 21:23:58
糞言語だと思うなら、使わなければいいじゃん
162デフォルトの名無しさん:2010/04/28(水) 22:24:00

vbaは言語じゃねーよwww
163デフォルトの名無しさん:2010/04/28(水) 22:44:06
連休らしくなってまいりました
構ってちゃんの季節ですね
164デフォルトの名無しさん:2010/04/28(水) 22:46:53
ふぅ(´ω`)
165デフォルトの名無しさん:2010/04/28(水) 22:47:53
166デフォルトの名無しさん:2010/04/29(木) 00:43:54
VBに足りない機能は
全部COMという万能倉庫から持ってくればいい。
167デフォルトの名無しさん:2010/04/29(木) 09:57:52
COM使うならExcel使う必要も無ければVBAを使う必要もない
168デフォルトの名無しさん:2010/04/29(木) 10:40:35
意味がわからない。
そもそもVBAのグローバルコンテキスト自体がOfficeのCOM(IDispatch)だよな。
で、VB(A)以外でCOMを使うということだけど、

他言語で書いたらどれだけコーディングが面倒かご存知?
まあ、WinOLE32とかいちいっちコーディングするのが面倒じゃなくて
ブラウザも要らないなら、どうぞって感じなんだけど。
あと、Excelと密に連携取れないね。
169デフォルトの名無しさん:2010/04/29(木) 10:47:31
え?
170デフォルトの名無しさん:2010/04/29(木) 12:19:42
ExcelというアプリのUIを丸ごと再現するのは面倒だし意味ないし
VBAだけではなかなかかゆいところに手が届かないし
事務員がExcelさわってる裏で事務作業の手伝いをさせるのがVBAの本来の使い方だから
171デフォルトの名無しさん:2010/04/29(木) 12:41:39
まあ、ここでExcelVBAを否定しても意味ないし
172デフォルトの名無しさん:2010/04/29(木) 13:47:12
たしかにRubyは面倒だな
173デフォルトの名無しさん:2010/04/29(木) 14:30:42
みなさん、普段はどんな言語を使ってるんですか?
・・・と聞こうと思ったけれど、ここは事務員のが多いって話でしたね。
ということは、VBScriptとかhtmlとかJavascriptとかのエンドユーザ向け言語ですか?
174デフォルトの名無しさん:2010/04/29(木) 14:37:53
またもや知ったかか
175デフォルトの名無しさん:2010/04/29(木) 14:42:01
ここで一番多いのは警備会社勤務
2ちゃんの質問スレで困ってる人を見つけたら助けるふりして雑談始めるのが仕事
176デフォルトの名無しさん:2010/04/29(木) 14:46:30
事務員だけどVBAできます・・・・というか、IT屋のPGとして開発経験があれば、
プロジェクト規模とかステップ数でPGとしての職歴をアピールできるのかもしれないけど、
そうでない場合はアピールしようが無いというか、何をもってできるとするのかよくわからん。
177デフォルトの名無しさん:2010/04/29(木) 14:47:28
>>175
自宅警備会社というやつですか?
178デフォルトの名無しさん:2010/04/29(木) 15:01:55
>>177
自室です。
179デフォルトの名無しさん:2010/04/29(木) 16:14:27
>>173
ネットが繋がらない環境でJava使ってる。
VBAは各種ファイルの生成とか、XMLやらブックの解析とか。
180デフォルトの名無しさん:2010/04/29(木) 17:08:26
お話に花が咲いているところ すみません。教えてください。

office2000 XP SP3 です。

PCのCOMポートから、RS232Cで文字を受信して、Excelシートに表示しています。

while(1)
  if (受信文字=あり) then
    Cells(y, 1).Value = 受信文字
    y = y + 1
  endif
wend
という感じです。
いい感じに動作するのですが、シートの一番下の行まで行って、
次の行を書くときに、スクロールしたいのですが、
画面1行スクロールをするには、どのような記述をするのでしょうか。

宜しくお願いします。
181デフォルトの名無しさん:2010/04/29(木) 17:20:05
182デフォルトの名無しさん:2010/04/29(木) 18:08:21
Application.Calculation = xlCalculationManual
で、関数の計算を止めた場合、

WorksheetFunction.Maxなどで関数をVBA内で使用(シートへの記載は無し)したら、
その計算結果を利用する判定時に誤作動したりするのですか?

やはり直前でxlCalculationAutomaticに戻さなくてはいけないのですか?
183デフォルトの名無しさん:2010/04/29(木) 18:24:43
お話に花が咲いているところ
嫌味言うなら質問するな
184デフォルトの名無しさん:2010/04/29(木) 20:40:06
気の利いたこと言おうとして失敗する人っているよね。
その一言が余計、という。

「へえ。君って○○大学出てるんだ」
「いやあどうしょうもないバカ大学でお恥ずかしい(謙遜のつもり)」
「……俺の息子はその大学を第一志望にして入学したんだよ(怒)」
185デフォルトの名無しさん:2010/04/29(木) 21:11:20
つ Ca
186180:2010/04/29(木) 22:37:54

どうもありがとうございます。大変助かりました。
VBAの命令は、何でもあるんですね。ビックリしました。おかげさまで、なんとか作れそうな感じです。

以下のような感じで、現在の画面の最下行数を計算して
  temp_str = ActiveWindow.VisibleRange.Cells(1, 1).Address ' 現在の画面の左上セルの座標「$A$123」を文字で得る
  n = InStr(1, temp_str, "$")                ' 左の$を見つける
  n = InStr(n + 1, temp_str, "$")               ' 右の$を見つける
  y = Val(Mid$(temp_str, n + 1, Len(temp_str) - n)) + Windows(1).VisibleRange.Rows.Count ' "123"を取り出し、画面の縦の数を加算
この行数と、次回の書込予定セルのy位置と比較してスクロールしながら、書き込んでいくつもりです。

ここで、もう少し教えてください。

上記の最下行の計算ですが、VisibleRange.Cells(1, 1).Address の返値が文字で返ってくるので、めんどうな文字計算をしています。
これが、直接数字で返ってくる命令はないものでしょうか。

temp_str = ActiveWindow.VisibleRange.Cells(1, 1).Address というのは、現在のアクティブウインドウに対しての命令だと思います。
しかし別シートを開いている時でも、文字書込は決まったシートに バックグラウンドで実行したいのです。
シート指定をすればいいと思って
a = Worksheets("AAA").VisibleRange.Cells(1, 1).Address
などと やってみましたが、エラーだと言われました。
どのように書いたら、バックグラウンドで実行できるのでしょうか。

よろしくおねがいします。
187デフォルトの名無しさん:2010/04/30(金) 00:43:47
>>184
その会話で気の利いたことを言った(つもり)のはどっち?
188デフォルトの名無しさん:2010/04/30(金) 00:45:56
>>186
a = Worksheets("AAA").Range(hoge).Cells(1, 1).Address
189デフォルトの名無しさん:2010/04/30(金) 11:02:24
>>186
Visibleってのは「見えている」範囲のこと。ウィンドウを「切り替えたら見えるだろう」範囲ではない。
だから裏画面では意味がない。
190180:2010/04/30(金) 19:02:09
教えてくださいますでしょうか。
cells(1,1) と range("A1")という、2つの表現方法がありますが、
forで回すことを考えるとcells(1,1)のほうが都合が良いと思います。
しかし、range()も使いたいことが多いです。
そこで、この(1,1)という値を"A1"に変換するような関数はあるのでしょうか?

現在は、
dim array as string
dim rng_str as string
array = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

x = 1
y = 1
rng_str = mid$(arry, x, 1) & format(y)

などとやっています。
何か1発でできる関数があると便利なのですが。
191デフォルトの名無しさん:2010/04/30(金) 19:13:14
>>190
アドレスとかじゃ本末転倒か
192デフォルトの名無しさん:2010/04/30(金) 19:23:11
そうですね。できれば、aaa = Conv(1,1)みたいな感じの物がVBAに備わっていることを期待しているのですが、
やはりむずかしそうでしょうか。

あと、もう1つよろしいでしょうか。
セルを選択するのと反対に、解除するのにはどのように書けばよろしいでしょうか。
選択は、セルの周囲の線が太く見えて、解除は、セルの周囲の線が太くなくなるということです。

選択 cells(1,1).select

解除 cells(1,1).Deselect と書いたら、叱られてしまいました。

193デフォルトの名無しさん:2010/04/30(金) 19:43:52
>>190
rng_str = Cells(Row, Col).Address(False, False)

とりあえずこうするといいよ。
194デフォルトの名無しさん:2010/04/30(金) 21:17:14
>>187
>その会話で気の利いたことを言った(つもり)のはどっち?
二つ目の鍵カッコだよ。

この会話では、相手が不機嫌になった理由を教えてくれたから、
「ああ、俺余計なこと言ったな」と本人も気づくけど、
普通は腹の中で「この野郎」と思ってもわざわざそれを伝える人は少ない。

結果、本人はずっと「俺ってユニーク」などと思い込んだまま、
他人をイラつかせ続けることになる。

まあ、俺のことなんだが。
195デフォルトの名無しさん:2010/04/30(金) 21:59:14
>>192
行列の変換は Chr(64 + y) & x
ただしZ列より右は表現できない
AA列以降もサポートしたいなら自分で関数を作ってモジュール化すればいい

セル選択の解除は不可能
196デフォルトの名無しさん:2010/04/30(金) 22:01:57
>>192
一般機能で出来ないことはvbaでも出来ない。

シートの中で必ず1セルは選択されているものだから、vbaでもどこかのセルは選択しないとあかん
197デフォルトの名無しさん:2010/04/30(金) 22:05:08
何でもいいけどいい加減>>182に答えてくれよ!

さもないと自分で調べるぞ!!
198デフォルトの名無しさん:2010/04/30(金) 23:29:49
>>193
ありがとう。Row=1, Col=1 → A1 と出ました。ありがとう。
これで楽になりそうです。

>>195, >>196
>セル選択の解除は不可能
>シートの中で必ず1セルは選択されているものだから、vbaでもどこかのセルは選択しないとあかん
そうなのですね。ありがとうございました。
確かに、自分でExcel使うときは、どこす1箇所選択されています。
助かりました。ありがとうございました。
199デフォルトの名無しさん:2010/05/01(土) 15:32:28
>>197
調べろよw
あと手動計算にしなくても再計算すればよろし
マクロの記録でF9だ
200デフォルトの名無しさん:2010/05/01(土) 17:57:32
ていうか再計算止めたからってWorksheetFunction
の計算まで止まるわけないだろ。
むしろ発想自体新鮮w
201デフォルトの名無しさん:2010/05/01(土) 19:46:16
         / ̄(S)~\  <                       >
       / / ∧ ∧\ \<  嫌なら見るな! 嫌なら見るな! >
       \ \( ゚Д,゚ ) / /<                       >
         \⌒  ⌒ /  ノ Y´`Y´`Y´`Y´`Y´`Y´`Y´`Y´`Y´`Yヽ
          )_人_ ノ  
          /    /
      ∧_∧ ■□ (    ))
     (   ; )■□  ̄ ̄ヽ
   γ⌒   ⌒ヽ  ̄ ̄ノ  ノ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
202デフォルトの名無しさん:2010/05/01(土) 22:37:18
>>199-200
自分で調べるのが面倒だからこその質問スレだろうが!
情弱なめんな、ゆとりなめんな質問に答えてくれて本当にありがとうございました。
203デフォルトの名無しさん:2010/05/01(土) 22:41:08

冷静な自己分析だと思うぞ
204デフォルトの名無しさん:2010/05/02(日) 06:25:26
>>202
>自分で調べるのが面倒だからこその質問スレだろうが!
自分で調べてもどうしてもわからない時の質問スレだよ。
別に2chじゃなくとも、人に教えを請う時はそれが当たり前だと思うが。
205デフォルトの名無しさん:2010/05/02(日) 06:59:03

2ちゃんの画一的なコメント 乙
206デフォルトの名無しさん:2010/05/02(日) 12:09:35
てか教えてGooに行けばいいんだよな
207デフォルトの名無しさん:2010/05/02(日) 12:47:44
       -‐''''"´ ̄``ヽ、              ____
       /     _     ヽ        //´   __,,>、
     /        ̄ ̄   {        /::/ / ̄:::::::::::::::\
      l _ィニニア二二二ニヽ、j._      /::::l/::::::::::::::::::::::::::::::::l
     | 0Lj/-‐-レノ ノ_ヽ:::`ヽ     l:::::::::::/l/lノノ/_イ:::::l
     レ:r、/ イ゚テ   ピト`|::|      l:::::::::/ rtテ、  .ィtq l::::::|
      l:lヘ  '"   ,j  '"/ノ      |::lヘ!j  ´  ,j   !;:::/
     ヽヽ、   r‐-,   /'         レリー 、    ,....,  lノ/
        lヽ、  ̄ /         `ヽ、lヽ 、  ̄ /´
     _,r┴‐-`v´-‐j-、__   , -‐-、_r┴─'ー‐チト       バルス!!
  / ̄/:.:.:.:| ̄ ̄`T ̄´|:.:.:.:l´ `ヽ /    ヽ ̄`ー-‐'´`''''⌒ヽ
/   ,':.:.:.:.:.l    l   l:.:.:.l    \  _r‐、-、-、r,    、   ',
     |:.:.:.:.:.:.!     !   !:.:.l   ,. -‐ゝ/// 〉 〉 〉 〉 〉    !   ',
    l:.:.:.:.:.:.l     |   l:.:.:l  /  人〈〈〈〈 ' ' ' /っ   l    l
    l:.:.:.:.:.:.!     !   l:.:.:.ト/   /  ```´-ァ‐'''"     /   l
、__/:.:.:.:.:.:l     |    |:.:.:ヽヘ  l    //         / _ ィノ
    /:.:.:.:.:.:.:!    l   |:.:.:.:.:l `ーヽ、_ノ´l、______/lニ二」
____l:.:.:.:.:.:.:.|      l   |:.:.:.:.:!        |_  ( ( ) )_〕|   l
   l`ー‐‐'匸二l ̄ ̄l二フーイ       /   ̄ `‐‐'´ ヽ  |
208デフォルトの名無しさん:2010/05/02(日) 15:58:59
> 意思決定までコンピューターが出来るようになると、
> 人間自体が必要なくなる。

今でもほとんど「意思決定」に人間なんか要らないだろ。

1. 提案者「こんなアイディアがあります」
2. 決定者「費用対効果を数字で示せ」
2. 提案者「費用が○○円、利益が△△円を見込んでいます」
3. ○○ < △△か?
   true → 4.へ
   false → 5.へ
4. 決定者「そのアイディアを採用する」
   → 6.へ
5. 決定者「そのアイディアを却下する」
   → 6.へ
6. 決定者「次のアイディアはなんだ?」

結局のところ、「意思決定」(笑)とやらをやる人間はこんなロジックで動いているんだから、
人間なんかおく必要ない。Excelどころか、20年前のPCでBASICで組んでもいいレベル。

「費用対効果を出せ」「数字で示せ」「説明責任を果たせ」、って言うと非常に説得力が
あるように見えるけど、実は判断基準のなすりつけなんだよね。
209デフォルトの名無しさん:2010/05/02(日) 17:06:47
>>208
んじゃそのプロセスをマクロで表現しなよ
210デフォルトの名無しさん:2010/05/02(日) 21:18:22
質問させてください。

A列にx軸の値、B〜H列に7系列分のy軸の値が書いてある表で、
A,B列の値を選択してグラフを書かせるとA列をx軸、B列をy軸(系列1)としてくれるのですが、
A〜H列の値を選択してグラフを書かせるとx軸はblankで、A〜H列全てがy軸(系列1〜8)になってしまいます。
A列をx軸にして7系列分のグラフを書くにはどのように工夫したらよいでしょうか。
211デフォルトの名無しさん:2010/05/02(日) 21:54:14
あなたは知らないのですか?
212デフォルトの名無しさん:2010/05/03(月) 13:25:00
>>210
グラフの種類を散布図にして
元データの設定ウィンドウでY軸からA列を消して、X軸にA列を追加
213デフォルトの名無しさん:2010/05/04(火) 21:21:37
エクセルのサイズが500MBに届きそうなんだがこんなもんか?
214デフォルトの名無しさん:2010/05/04(火) 22:22:06
こんなもんかと聞かれても困るな w
まぁ常識的に考えて肥大しすぎだとは思うが w
215デフォルトの名無しさん:2010/05/04(火) 22:53:39
http://peiyorin.cocolog-nifty.com/blog/2007/09/excel_1635.html

これ以外にもシートをコピー→新しいブックの新しいシートに貼付け も効果があるらしい
(シートタブからのシートのコピー はダメ)
216デフォルトの名無しさん:2010/05/04(火) 23:40:10
>>215
それやると、セルの幅はコピーされない(初期状態のまま?って言うの)んと違うかったっけ?
217デフォルトの名無しさん:2010/05/04(火) 23:50:05
>>216
? 普通に書式も一緒にコピーできるけど?
218デフォルトの名無しさん:2010/05/05(水) 00:33:09
ページ設定がコピーされないんでそのまま印刷するとおかしくなるだけ
219デフォルトの名無しさん:2010/05/05(水) 12:47:49
>>210
Excelは、変なお節介があり、ユーザーは動作の予想ができないので、
覚えにくいし、使いにくいですよね。

さて、具体的な方法は自分で考えてもらうとして、イメージを説明します。
グラフを作るとき、多くの場合は、希望するデータ範囲を囲って、
グラフボタンで進んで行って「グラフできたぁ」となるワケですが、
これは、EXcelのお節介な自動機能でグラフを作っているだけなので、
覚え始めのころは「このやり方が全てだ」と思い込んでしまいます。
僕もそうでした。しかし、この方法では、いつかは行き詰まります。

本来あるべき論としては、「この列のデータを、あの列のデータに対してグラフ化したい」だと思います。
このやり方が、本当のグラフ作成なのですが、
Excelのお節介で、私たちは、それが想像しにくいようになっています。

範囲を選択して、グラフボタンで、グラフウィザードを進んで行きますが、
そのウィザードの途中に、次のような画面が出てきます。
http://mcnc.hp.infoseek.co.jp/cgi-bin/img-box/img20100505123431.png
この画面では、すでにEXcelが勝手に選んだ「系列1,系列2」というY軸の値が選ばれています。
まずこれを削除します。そして、その右側の「Xの値」「Yの値」の所の文字も消して、
その枠の右側の三角?っぽいボタンを押します。
すると、ウィザードを開いているのに、なぜかシートに触れてしまいますので
自分の好きなY軸の範囲を選択します。同様にして、Xの値も範囲を指定します。
これで、EXcelのお節介なく、自分の好きな軸に、自分の好きな範囲を指定してグラフが作れます。

この方法は、既に出来上がっているグラフに対しても可能でなので、
自分で調べて見てください。

僕の思うグラフの作成は、「これをXに、これをYに」という指定をするのが正しい方法、
というかユーザーがイメージできる作成方法だと思っています。
Excelやワードのお節介が減ることを期待したいです。
220デフォルトの名無しさん:2010/05/05(水) 13:32:18
VBAの話をしろボケ
221デフォルトの名無しさん:2010/05/06(木) 00:23:24
>>219
なかなか面白い話しやけど、確かにスレ違い。
222デフォルトの名無しさん:2010/05/08(土) 17:44:55
配列に数が入っている状態で,
平均値などを計算したい場合,
一度,シートに書き出してエクセルのaverage関数を使うしかないのでしょうか?
223デフォルトの名無しさん:2010/05/08(土) 17:47:19
いいえ
224222:2010/05/08(土) 17:55:03
>>223
すいません

自分で関数を定義したくはないのですが
そのようなサブルーチンがvbaにも実装されているのでしょうか?
225デフォルトの名無しさん:2010/05/08(土) 18:11:12
WorksheetFunction.Averageって配列を受け付けられなかったっけ?
226デフォルトの名無しさん:2010/05/08(土) 18:49:16
配列できるね。
227デフォルトの名無しさん:2010/05/08(土) 19:13:10
セルにAddCommentで複数行のコメントを入れようとしてます。
vbNewLineで改行していれようとすると5行までしか入りません。
無限にいれれるようにするにはどうしたらいいでしょうか?
228222:2010/05/08(土) 19:13:18
例えば,
配列 a[100]
を定義したとして,a[10]からa[i]までの平均値をだしたいのですが
excelの関数で大丈夫ですか・
229デフォルトの名無しさん:2010/05/08(土) 19:24:00
>>228
じゃあ、10〜iまで回せばいいじゃん
230222:2010/05/08(土) 19:49:42
>>229
可変長の部分をa_temp というdouble型の配列を作成,そこに格納し
ave = WorksheetFunction.Average(a_temp)
としても 0 しか返ってきません.
何か間違っていますでしょうか?
231デフォルトの名無しさん:2010/05/08(土) 19:50:24
平均ぐらい自分で出せよカス
232222:2010/05/08(土) 20:13:58
>>231
枯れたサブルーチンがあるなら自分で書くよりミスは圧倒的に減るはずですよね.
なんとかなりませんか
233デフォルトの名無しさん:2010/05/08(土) 20:15:05
この程度でミスしてる時点で他のあらゆるコードが信用出来ない。おまえさんはもう諦めろ
234222:2010/05/08(土) 20:19:47
>>233
vbaは何分初めてなもんで
よろしくお願いいたします
235デフォルトの名無しさん:2010/05/08(土) 20:23:10
何事もほどほどにな
236デフォルトの名無しさん:2010/05/08(土) 20:45:32
>>227
気のせいでした
237デフォルトの名無しさん:2010/05/09(日) 01:21:50
>>234
とりあえず、作ったプログラムを丸ごと貼り付けて
238222:2010/05/09(日) 09:59:16
お騒がせしました.
求めた平均値を入れる変数の型をlong型にしていたため,
常に0となっておりました.
double型に変えると無事動作しました

ありがとうございました
239デフォルトの名無しさん:2010/05/09(日) 15:56:22
あるブックでマクロ実行中、他のブックを操作する方法ないですか?
240デフォルトの名無しさん:2010/05/09(日) 17:08:43
>>239
もう少し詳しく書かなきゃわからんよ
他のブックを操作するとは例えばどんな事?

また、あるブックでマクロ実行中て書いてるけど
どんな処理をしている時を想定しているの
241デフォルトの名無しさん:2010/05/09(日) 19:07:08
>>240
イメージとしてはExcelの二重起動でしょうか
マクロの実行中ってほかのエクセルの編集作業が全くできないと思うんですが、それをできるようにしたいです。
242デフォルトの名無しさん:2010/05/09(日) 19:16:36
そのまんま、Excelを2重起動すればいい。
243デフォルトの名無しさん:2010/05/09(日) 19:25:38
>>239
取りあえずDoEventsでも入れてみれば
244デフォルトの名無しさん:2010/05/09(日) 19:48:48
>>242-243
質問が悪かったです。ちょっと出直してきます
245デフォルトの名無しさん:2010/05/09(日) 20:11:42
自己解決
246デフォルトの名無しさん:2010/05/10(月) 08:04:51
phpのmysql_connect()関数が使えません。
環境は、
windows7
Apache2.2
PHP5.1
mysql server 5.1
です。
普通のphpファイルは開けるのですが、
mysql_connect()を使うとブラウザでページを表示できなくなります。
なぜでしょうか?
247デフォルトの名無しさん:2010/05/10(月) 08:07:15
すいません。誤爆しました
248デフォルトの名無しさん:2010/05/10(月) 23:22:47
図がないシートなのに、保存しようとすると
「図が大きすぎます」エラーが出るのは
どんな理由が考えられますか?

VBAがたくさん使ってあるシートです。
でも、図の類は何もありません。
249デフォルトの名無しさん:2010/05/12(水) 04:09:28
スタックが小さくて、まともな業務ソフトつくれないよ。
マイクロソフトは、あいかわらず、いつまでもユーザー泣かせのことやってる。

250デフォルトの名無しさん:2010/05/12(水) 04:12:14
これだけメモリー搭載が増えてる時代なのになんでスタックを大きくしないのか
不思議でしようがないいよ。
故意にユーザーを苦労させ、エラー出るように設計してるとしか思えない。
251デフォルトの名無しさん:2010/05/12(水) 04:14:37
なんか、日本語版だけ故意にスタック小さくしてるような感じする。
252デフォルトの名無しさん:2010/05/12(水) 07:36:24
スタックが増えても、落ちるまでの時間が多少伸びるだけじゃねえのw
253デフォルトの名無しさん:2010/05/12(水) 12:40:58
VCのスタックサイズのデフォルトは1MBなんだが、VBAではどのくらいなんだ?
254デフォルトの名無しさん:2010/05/12(水) 13:04:22
条件式について質問です。

処理対象データ ↓

A B C D
1 あ い う
1 あ い う
2 あ い う
3 あ い う
3 あ い う
4 あ い う
4 あ い う
4 あ い う

というデータがあるとします。

A列の値が同じである間、同じSheetにデータを出力できるようにし
A列の値が異なる場合になったならば、別シートに出力変換したいんだけども
何かアドバイスを貰えませんか。
255デフォルトの名無しさん:2010/05/12(水) 13:11:08
>>254
Aを上から見ていって、
前の値と比較すればいいでしょ。

Set procRange = [A1]
Set outputSheet =
While procRange <> ""
 If procRange.Offset(-1) <> procRange Then


 Set procRange = procRange.Offset(1)
Wend
256デフォルトの名無しさん:2010/05/12(水) 13:13:32
途中で投稿されちゃった
動かせる環境ないから適当に直せ

Dim procRange As Range
Dim outputSheet As Worksheet

Set procRange = [A1]
While procRange <> ""
 If procRange.Row = 1 Then
  Set outputSheet = Worksheets.Add
 ElseIf procRange.Offset(-1) <> procRange Then
  Set outputSheet = Worksheets.Add
 End If

 ' なんか適当な処理

 Set procRange = procRange.Offset(1)
Wend
257デフォルトの名無しさん:2010/05/12(水) 13:21:31
>>256
返答ありがとうございます。
高度な文面なので検索してちょっと理解深めます。
Offset〜〜に解決の糸口を見つけられそうなので
イジイジしてきます。ありがとおおおおおおおお
258デフォルトの名無しさん:2010/05/12(水) 18:19:08
教えてください。

質問の概要
ワークシートの変更を禁止したいです。

説明
・シート内にあるボタンを押すと計算が始まります。
・その計算は、そのシート内のセル内容を読込んで計算するので、シートを変更されると、困ります。
・そこで、計算している間は、シート変更を禁止させたいです。

計算中にシートタブがクリックされたら、このような動きにしたいです。
 メッセージボックスを表示して「今はダメよ」と表示する
 もしメッセージボックスを表示することで、計算が狂ってしまうなどの問題があるのなら、
 最低でも、シート変更を無視、無反応にし、計算を安全にしたいです。

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

宜しくお願いします。
259デフォルトの名無しさん:2010/05/12(水) 18:21:51
Application.ScreenUpdateing = Falseじゃだめなの?
260デフォルトの名無しさん:2010/05/12(水) 20:54:35
>>259
ありがとうございました。Application.ScreenUpdating = Falseにより、期待通りの動きが出来ました。
すばらしいです。

ただ、不思議なことがあります。教えていただけませんでしょうか。

以下のように、計算前にボタンの色を変えて、
計算後にボタンの色を戻すようにしているのですが、その色の変化が、うまく動きません。

従来、ScreenUpdatingを入れない時は、ボタン色が正しく変化します。
   Button1.BackColor = QBColor(赤)   ' 色を変える
   Call KEISAN
   Button1.BackColor = QBColor(白)   ' 色を戻す

次のように、ScreenUpdatingを入れると、
   Button1.BackColor = QBColor(赤)
   Application.ScreenUpdating = False
   Call KEISAN
   Application.ScreenUpdating = true
   Button1.BackColor = QBColor(白)
白のまま計算を開始して、計算が終わると白→赤→白と、まとめて変化します。

ScreenUpdatingを、' にすると、正しく色が変化します。(再現性があります)
どうしてこんなことが起こるのでしょうか?

宜しくお願い致します。
261デフォルトの名無しさん:2010/05/12(水) 21:24:18
>>260
ボタンの背景色の変更と、その色で画面が更新されるタイミングには実際にはブランクがある為。
VBAマクロ実行中も一定の間隔で画面の更新処理は走るが、
ScreenUpdatingがFalseの時はその処理が妨げられる。
ScreenUpdatingをTrueに戻すと、とりあえず画面全体を更新しなおすので、
後述の処理だとまとめて変化したように見える。
262デフォルトの名無しさん:2010/05/12(水) 23:44:46
できました
263デフォルトの名無しさん:2010/05/13(木) 01:00:39
Button1.BackColor = QBColor(赤)
Call DoEvent
Application.ScreenUpdating = False
Call KEISAN
Application.ScreenUpdating = true
Button1.BackColor = QBColor(白)

だったかな
264デフォルトの名無しさん:2010/05/13(木) 01:03:13
全然違った
スマソ orz

Button1.BackColor = QBColor(赤)
DoEvents
Application.ScreenUpdating = False
Call KEISAN
Application.ScreenUpdating = true
Button1.BackColor = QBColor(白)
265デフォルトの名無しさん:2010/05/13(木) 01:07:09
自作関数をセル上に入力すると、ポップアップで引数の説明文を表示させるようにするにはどうしたらいいのでしょうか。
例えばセル上に "=IF(" まで入力すると
IF(論理式,[真の場合],[偽の場合])   と、表示されますが、
このポップアップ表示されるやつを自作関数でも表示させたいのです。

ご教示よろしくお願いします
266デフォルトの名無しさん:2010/05/13(木) 02:50:22
自己解決
267デフォルトの名無しさん:2010/05/13(木) 17:21:52
>>264
ありがとうございました。なんとか出来ました。
僕のExcel (office2000)だけなのかわかりませんが、教えてもらった方法だと、症状が改善しませんでした。
Button1.BackColor = QBColor(赤)
DoEvents
Application.ScreenUpdating = False
Call KEISAN
Application.ScreenUpdating = true
Button1.BackColor = QBColor(白)      動作結果 ボタンon→KEISAN→赤→白のままなんです。

Button1.BackColor = QBColor(赤)
Call KEISAN
Button1.BackColor = QBColor(白)

Sub KEISAN(){
  DoEvents
  Application.ScreenUpdating = False
   :
   :
  Application.ScreenUpdating = true
End Sub
     のようにKEISANの中に置くと 動作は、 ボタンon→赤→KEISAN→白となります。

でも、解決できて良かったです。どうもありがとう。感謝します。
// ------------------------------------------------------------- //
別件ですが、VBAのエディタについて教えてください。
行頭でTABキーを打つと、カーソルは4文字毎に飛んでいきます。しかし、BackSpaceキーを1回押しても、1文字分しか戻りません。
というか、TABが4スペースになってるみたいです。これを、TABのままにして、BSキー押したときに、1TAB分戻るようには出来ないでしょうか?
ところが、何かの都合?でBSキーで1TAB分戻ることもあります。もう、わけがわかりません。半分怒っています。
これは、どのような時に起こるのでしょうか?
通常のエディタのように動かないので、使いにくくて困っています。すみません。ご存じでしたら、どなたか教えてください。
268デフォルトの名無しさん:2010/05/13(木) 17:31:47
つメモ帳
269デフォルトの名無しさん:2010/05/13(木) 17:38:07
>>267
一般的には、TABで送ったものはSHIFT+TABで戻すんじゃね?
270デフォルトの名無しさん:2010/05/13(木) 17:50:10
>>269
ありがとうございます。Shift+TABを、Excelでやってみました。

VBAエディタでは、確かに出来ました。左に1TABずつ戻ります。初めて知りました。
ところが、秀丸では、Shift+TABは、エラー。
メモ帳では、Shift無視で右にTABしていきました。

text editorは、space4個はspace4個、tabはtab、として置いて欲しいと思っています。
space4個打ったところでは、BS1回で、1spaceが消えればいいし、
tabを打った所では、BS1回でtab1個が消えればいい、というかそのほうが自然だと思うのです。
僕の価値観だけでしょうか。

でも、>>269に Shift+TABを教えてもらったので、今度からはストレスがぐっと減りそうです。
どうもありがとうございました。
271265:2010/05/13(木) 18:11:23
>>266は私のレスではありません。

引き続きお願いします。
272265:2010/05/13(木) 19:04:04
>>271は私のレスではありません。

引き続きお願いします。
273デフォルトの名無しさん:2010/05/13(木) 20:59:53
>>270
Visual StudioやEclipseといった開発環境は大抵Shift+Tabで戻るよ
秀丸の場合、1文字以上選択状態にしてShift+Tabで戻る(サクラエディタも同様)

Tabキーでスペース2個とか4個とかが入力されるようにするのは
スペース派(ソースコード中にタブ文字を一切使わない)には普通のこと。
タブ文字は見る方の環境によって幅が変わってしまうので、それを嫌っている。

ただVBAは専用エディタでしか見ないだろうし、
そもそも設定変更できないのがひどいのは事実
274デフォルトの名無しさん:2010/05/13(木) 21:05:50
あのエディタでリドゥのつもりでCtrl+Yを押すと悲惨な目に遭う
275デフォルトの名無しさん:2010/05/13(木) 21:58:59
いやならバインディングかえればいいのに
馬鹿なの?死ねの?
276デフォルトの名無しさん:2010/05/13(木) 22:06:50
死ねの?
277デフォルトの名無しさん:2010/05/13(木) 22:46:05
死ぬの?─┬――死ぬよ(死ぬ派)
.       │
.       └――死なないよ(死なない派)
278デフォルトの名無しさん:2010/05/14(金) 07:41:41
時刻の条件式について質問です。

00:15
00:30
00:45
〜〜略〜〜
03:00


みたいな時間がず〜〜〜〜と続くと想定して
これを開始の00:15から03:00までの間ループさせたいんだけど
時間と分を別々に分けて15分ずつ足して行く方法しかないですかね?
279デフォルトの名無しさん:2010/05/14(金) 08:22:28
>>278
そうじゃないの
つまり0時1時2時3時のステップと15分30分45分00分のステップを入れ子でループするんでしょ

280デフォルトの名無しさん:2010/05/14(金) 08:25:59
>>278ですけども
分けて計算すると変数多くなってしまうと思っての質問だったのですが
分けて計算するとしたら、どういう感じのループ条件式になりますでしょうか。
重ね重ねすいません。
281デフォルトの名無しさん:2010/05/14(金) 08:27:43
>>279
おおお!!納得です。
ちょっと考えてきます、ありがとございました!
282デフォルトの名無しさん:2010/05/14(金) 12:11:45
エンバグの元なのに
283デフォルトの名無しさん:2010/05/14(金) 12:40:02
配列のデータで一意のデータを出力させたいのですが、
以下の配列データが複数あるとします。

A(0) = 1
A(0) = 2
A(0) = 3
A(0) = 4
A(0) = 3
A(0) = 3
A(0) = 10
A(0) = 2

出力結果は

A(0) = 1
A(0) = 2
A(0) = 3
A(0) = 4
A(0) = 10

こんな感じにしたいのですが、どんな感じにすればいいでしょうか
284デフォルトの名無しさん:2010/05/14(金) 12:42:08
>>283
配列の全要素は0ではないです、すいません。

A(1) = 1
A(2) = 2
A(3) = 3
A(4) = 4
A(5) = 3
285デフォルトの名無しさん:2010/05/14(金) 13:00:10
>>283
配列をソートして前と違うものを取り出せばよい。
あるいは最小値と最大値が極端に離れてなければBoolean型の配列を
Redim FLG(最小値 To 最大値) As Boolean
のように用意して、ループを回しながらフラッグをたて、フラッグが
立っているものを取り出してもよい。
数値にDictionaryを使うやつはアホ。
286デフォルトの名無しさん:2010/05/14(金) 13:05:51
すまん、上はフラッグが立ってないときだけ取り出すの間違いね。
287デフォルトの名無しさん:2010/05/14(金) 13:11:59
Dictionaryを使えばいい
288デフォルトの名無しさん:2010/05/14(金) 13:13:21
>>285
配列のソートって出来るのですね。
フラッグはちょっと難しそうでしたので配列ソートの方を参考にさせて頂きます。
調べてる時Dictionaryというのも頻繁に出てきたのでこれも調べてみます。
レスありがとございました!
289デフォルトの名無しさん:2010/05/14(金) 13:18:27
馬鹿の一つ覚えのDictionaryがやっぱり出てきたかw
290デフォルトの名無しさん:2010/05/14(金) 13:25:01
Dictionaryの何がいけないか2行で説明してくれ
291デフォルトの名無しさん:2010/05/14(金) 13:25:29
え?Dictionaryダメなの?
292デフォルトの名無しさん:2010/05/14(金) 13:31:43
Dictionaryダメっていうやつはカルト宗教にはまりやすいタイプ
293デフォルトの名無しさん:2010/05/14(金) 13:32:51
ダメって書くなら根拠書いて欲しい。
言いっぱなしは迷惑。
294デフォルトの名無しさん:2010/05/14(金) 13:35:29
うるせーDictionaryっていっぱい連レスするんじゃねーよ
295デフォルトの名無しさん:2010/05/14(金) 13:37:59
>>290
二行も必要ないなw
アホだからだよ。

無理やり二行で書くと
何で単純な整数にハッシュが必要なんだってことだな。
ハッシュなんて文字列に使うものだぞ。
296デフォルトの名無しさん:2010/05/14(金) 13:48:13
そもそもDictionaryがどういう実装しているか知らないが、
(少なくともCollectionよりは効率がいいはずだが)
整数値は整数値をそのままハッシュ値にすればいいでしょ。

ていうか、そんなんでDictionary否定してたの?
297デフォルトの名無しさん:2010/05/14(金) 13:56:03
ダミだこりゃ。
お手上げだね。
298デフォルトの名無しさん:2010/05/14(金) 14:05:17
なるばくDictionaryを多く使ったほうがいいよ
299デフォルトの名無しさん:2010/05/14(金) 14:08:51
何にでもDictionaryの人って大和の吊るし柿みたいに味のあるコードを書く人多いよね。
300デフォルトの名無しさん:2010/05/14(金) 14:19:11
正直Dictionary回避してまで手に入れたいものって何?
301デフォルトの名無しさん:2010/05/14(金) 14:26:17
インタプリタでソートしたりなんかしたりして遅くなるより
ネイティブなDictionaryでやったほうがいいね
302デフォルトの名無しさん:2010/05/14(金) 14:35:57
ほんとアホばっかだなw
>>299
そういう皮肉は今の人には通じないって。
303デフォルトの名無しさん:2010/05/14(金) 14:48:09
場合によって使い分けるのが一番
304デフォルトの名無しさん:2010/05/14(金) 14:58:02
VBA関係ないし
305デフォルトの名無しさん:2010/05/14(金) 16:11:00
Rangeオブジェクトについてなんですけども、
複数モジュールがある中で共有して扱わないとエラー出てしまったので
subとかが書かれてるよりも一番上(グローバル宣言?)にしたらエラーが出ませんでした。

これって外道ですかね?
306デフォルトの名無しさん:2010/05/14(金) 16:16:12
何の話ざんしょ。もっとわかりやすくしてね。
307デフォルトの名無しさん:2010/05/14(金) 16:35:00
Rangeオブジェクトの変数についてですけども、Moduleが1〜3あったとします。

Module1
Module2
 dim aaRange as Range
 call ユーザ定義関数(aaRange)
Module3
 ユーザ定義関数(aaRange)記載


上記のようにModule2でRangeオブジェクトを宣言し、ユーザ定義の引数で貰ってるとします。
頻繁にユーザ定義関数を実行するのですが、aaRangeの値を常に保持していたくてグローバル宣言(呼び方あってるのかな)
してしまったと言う訳ですが!!!

糞設計でしょうか!!
308デフォルトの名無しさん:2010/05/14(金) 16:37:23
うんkです
309デフォルトの名無しさん:2010/05/14(金) 16:45:36
デナオシテキマス
310デフォルトの名無しさん:2010/05/15(土) 14:27:47
16進数苦手。

イミディエイトウィンドウで
?hex(50000)
だと
C350
と出ます。

でも
?&hC350
だと
-15536
と出ます。

何で??
50000に戻したいのに・・・。

因みに
?-15536=50000
False
?hex(-15536)=hex(50000)
True
と出ます・・・。
311デフォルトの名無しさん:2010/05/15(土) 15:50:46
>>310
50000はIntegerの範囲に収まってないのにIntegerに変換しようとしてそうなる
?&hc350& でLongに変換すればちゃんと50000になる
最後の&はLongを表す文字な
312デフォルトの名無しさん:2010/05/17(月) 08:04:24
エクセルVBA開発のコーディングルール作ってるんだけど、意見聞かせて欲しい
ちなみに、会社で後任に引き継ぐのを想定してるだけなんで、ガチガチにする必要なし

みなさん設計する時どんなことに気をつけてます?
313デフォルトの名無しさん:2010/05/17(月) 09:18:42
元々緩やかな下降線にはあったけど、人が減った事によって
それまでは人混みに隠れていた工作員の存在が目立つようになったのが致命傷だったな
工作員の誘導を嫌って参加者が減り、他所からの工作員を排除しようとして規制をするから
参加機会が奪われて更に参加者が減るという負のスパイラルにおちいってる
314デフォルトの名無しさん:2010/05/17(月) 09:32:43
>>312
関数の引数は基本的にByValにするとかかな。
速度的にはByRefが望ましいんだけど。(特に文字列)

Option Explicit強制とか、
空文字の代わりにvbNull使うとか、
$バージョン関数があるなら$バージョン関数使うとか、
改行文字の種類も揃えたほうがいいかも。

変数名のつけ方をシステムハンガリアンにするなら
統一したほうがいいね。
315デフォルトの名無しさん:2010/05/17(月) 12:41:57
Option Explicit以外、何一つ共感できない
316デフォルトの名無しさん:2010/05/17(月) 12:45:34
>>315
俺もそう思った
317デフォルトの名無しさん:2010/05/17(月) 12:47:19
なるほど
空白よりvbNullで統一したほうがいいな
そういやOption Explibt忘れてたわ……入れとこう

命名規則はアプリケーションハンガリアンにする予定
触る人のレベルなんかわからないし、プロジェクトごとの理解をまず深めて貰わないといけない
頭文字のみ大文字、単語ごとにアンダースコア、2バイト禁止
変数・プロジェクト名が長くなるから、頭文字大文字が必須になる

自分で慣れてないから書き換える手間が半端ないっていう
318デフォルトの名無しさん:2010/05/17(月) 13:32:40
・VBA禁止
319314:2010/05/17(月) 13:35:57
>>315-316
共感するしないじゃなくて、具体的な案とか意見書いてくれ。
問題点があるならそれもよろしく。
320デフォルトの名無しさん:2010/05/17(月) 13:36:32
なぜそこまでしないといけないんだ
321デフォルトの名無しさん:2010/05/17(月) 13:37:57
共感できないというなら理由ぐらい示せってだけだよ。
322デフォルトの名無しさん:2010/05/17(月) 13:43:49
めんどくさい
323デフォルトの名無しさん:2010/05/17(月) 13:46:18
役に立たないなあ…
324デフォルトの名無しさん:2010/05/17(月) 13:51:31
別に役に立ちたくないし
325デフォルトの名無しさん:2010/05/17(月) 14:00:39
>>315
俺もそう思った
326デフォルトの名無しさん:2010/05/17(月) 15:47:24
>>315
私もそう思うわ
327デフォルトの名無しさん:2010/05/17(月) 18:47:47
共感とか意見とか議論とか以前にルールに作るのになんかない? って質問に答えてるのが>>314だけじゃねえか
人のレスにいちゃもんつけるくらいしか出来ねえのか三流プログラマども




俺も>>315には共感するけどそれはそれとして
328デフォルトの名無しさん:2010/05/17(月) 20:03:33
関数の前には必ず説明のコメントを書く。書式も統一して、検索しやすいようにする
何より

手段と目的が逆転しないように気をつける
329デフォルトの名無しさん:2010/05/17(月) 20:18:20
変数名は大文字で始める?小文字で始める?
システムハンガリアンとかいうのは小文字だよね?
330デフォルトの名無しさん:2010/05/17(月) 21:42:31
Dim hoge$ と書くか Dim hoge As Stringと書くか
331デフォルトの名無しさん:2010/05/17(月) 22:47:17
普通は小文字で
332デフォルトの名無しさん:2010/05/17(月) 23:08:56
大文字にしておくと、小文字で打ったときに自動訂正してくれる
だから大文字含めた変数名にしておくと、タイプミスが少なくなる
333デフォルトの名無しさん:2010/05/17(月) 23:43:45
小文字の変数名にすると、ある型の名前を変数名にしてしまったときに
型が勝手に小文字になって困ってしまう
例えば、rangeとかdateとかを変数名にすると、全体的に型のRangeが
勝手にrangeに変わってしまう
なんとかならないんだろうか
334デフォルトの名無しさん:2010/05/18(火) 00:04:23
VBAはシンボルを大文字小文字で区別しないんだから気にしなけりゃいいんじゃね
あとはかぶらない名前にするか
335デフォルトの名無しさん:2010/05/18(火) 05:45:44
>>332
Option Explicitとか宣言の強制使え

>>333
システムで宣言済みの名前を使うな
336デフォルトの名無しさん:2010/05/18(火) 07:56:22
予約後を変数で使おうとする気持ちがよくわからない。
337デフォルトの名無しさん:2010/05/18(火) 08:04:48
特定の型の名前を予約語とは言わない。
338デフォルトの名無しさん:2010/05/18(火) 08:26:09
特定の型の名前を(ry
339デフォルトの名無しさん:2010/05/18(火) 08:41:53
Javaの場合なんだが、Eclipseとかの代表的なIDEは、変数の名前補完のデフォルトが
クラスの小文字名だよ
340デフォルトの名無しさん:2010/05/18(火) 12:23:32
その人の行動は「プライバシー問題に関して無頓着」で一貫しているように
見えるので理解してもらうのは難しいと思う。新しい概念を習得してもらうには
少々歳を取りすぎている。掲示板にもらった手紙の全文を掲載した時点で
気が付くべきだったのかも。
「プライバシー問題に関して無頓着」な人は親しくない相手にも平気で年齢や
職業を尋ねる傾向があるようなので注意したほうがいいです。
341デフォルトの名無しさん:2010/05/18(火) 12:24:23
>>335
デバッグするまでスペルミスのリスク抱えてろってのか?
タイプミスじゃなくて思い違いだったりすると、毎回変数名間違うことになる
一ヵ所ならまだしもデバッグ時に複数箇所とか煩わしすぎ

頻度の少ないコードとか気付かなかったり、確実にデバッグ出来るってわけでもないし……
342デフォルトの名無しさん:2010/05/18(火) 13:47:54
日本語最強。

Dim 氏名 As String
343デフォルトの名無しさん:2010/05/18(火) 15:21:21
2バイト表記はエラー起こす処理がMS公式であったはず
なんだか忘れたが、2バイト名関数を呼び出した時いらない参照呼び出して不具合引き起こしてたような
対応する気ない見たいだから、でっかいシステム組むのにはエラーでる覚悟はしとくべき
344315:2010/05/18(火) 16:38:12
・関数の引数をByValにするのかByRefにするのかは、関数の仕様による。どちらかに決めうち
 するような性質のものではない。
・空文字列とvbNullは同じものではない。VarType()してみればわかる。
・いちいち$バージョンの関数があるかどうか調べるのはめんどくさいので使わない。
 そもそもmid()とmid$()とかは別物なのか?とかいうのも調べるのがめんどい。
・改行文字の種類も揃えたほうがいいかも <= 意味不明。vbCrLfを使いましょうってことだとしても、
 別にそろえる必要性を感じない。
・システムハンガリアンは使わない。
345315:2010/05/18(火) 16:40:05
ちなみに、俺が昔作ったVBA用コーディング規約で、

「変数の定義はできるだけ遅くやる(使用する行/ブロックの直前でやる」

と決めたら、誰一人共感してくれなくて、驚くほどの反発があったことを思い出したよw
346デフォルトの名無しさん:2010/05/18(火) 16:49:53
コーディング規約というかコーディングガイド的なものとして、こんなの提示したことあった。
・アーリーバインドをなるべく使う
・イベントプロシージャの中に処理を直接書かない
・変数は一行一個で宣言しろ
・Publicな関数はPascalCaseで
・Const使え

こんな感じだったか。
347デフォルトの名無しさん:2010/05/18(火) 16:51:59
あ、そうそう、俺はシステムハンガリアンも使って良い派で、使うならfrmとかを決めてた気がする。
348デフォルトの名無しさん:2010/05/18(火) 19:47:42
文字列をByValで渡した時って、先頭のポインタが値渡しされるの?
それとも、文字列全体がまるまるコピーされるの?
349デフォルトの名無しさん:2010/05/18(火) 20:40:23
参照渡し プロシジャに値を渡す時、値そのものではなく、値が格納されている
変数のアドレスを渡す
呼び出し先のプロシジャで引数として宣言している変数の値を変更する
と、その引数に指定している呼び出し元の変数の値も変更される

値渡し プロシジャに値を渡す時、値そのものをコピーして渡す。
呼び出し先のプロシジャは、渡された値のコピーを受け取るだけなので
呼び出し先のプロシジャで引数として宣言している変数の値を変更して
も、呼び出し元の変数は一切影響を受けない。

だったかと
350デフォルトの名無しさん:2010/05/18(火) 21:15:22
>>349
で、ポインタの値渡しなの?中身の値渡しなの?
351デフォルトの名無しさん:2010/05/18(火) 21:18:55
>>350
コピーされる。
ちなみにVBの文字列の型はBSTR。
先頭に文字列長、末尾にヌル文字のUTF16文字列だったかな。
352デフォルトの名無しさん:2010/05/18(火) 21:27:09
手元の本によると
プロシージャの引数の文字列がコピーされるのは以下のタイミング。

・ByRefだと文字列定数を渡した時
・ByValだと常時

もちろんポインタのコピーじゃなくて文字列をフルコピー。
VBの文字列はImmutableじゃない。
353デフォルトの名無しさん:2010/05/18(火) 21:52:10
>>351-352
ありがとうございます。
VBAについてそこまで深く書いてある本もあるんですね
354デフォルトの名無しさん:2010/05/18(火) 22:27:49
>>344
・引数にByRef|ByValを指定しなければByRefになる。
 アホが引数を書き換えるとわかりづらいバグに発展する。
 普通の関数であれば値渡しでいいはず。参照渡しを積極的に使う場面は少ない。
・ごめん。vbNullじゃなくてvbNullString。
・$・非$関数は別物。$じゃなければVariantが帰ってきている。
 普通はVariantには用がないはず。作者も$の方使えって言ってる。
・それならばvbCrLfとvbNewLineどちらを使うのか。
・システムハンガリアンはどうでもいいや。
355デフォルトの名無しさん:2010/05/18(火) 22:35:57
作者って誰だよ
VBの作者か?
356デフォルトの名無しさん:2010/05/18(火) 22:44:19
厳密にいうとVBにIntelliSenceつけたチームの中の人だな。
357デフォルトの名無しさん:2010/05/18(火) 23:13:14
VBEの自動構文チェックって邪魔にしか思えないんだが、あれが便利で使ってるって人いる?
なんであんなものがあるのか不思議でしょうがない
358デフォルトの名無しさん:2010/05/18(火) 23:21:43
どっかのペインにちょこっとアクティブに表示してくれるだけなら
便利な機能だけどダイアログで出るのが最高にウザいよなw
359デフォルトの名無しさん:2010/05/19(水) 11:30:50
>>354
普通の関数であれば参照渡しでいいはず。
値渡しが必要な場合にのみByValを使え。
360デフォルトの名無しさん:2010/05/19(水) 11:35:47
midとmid$のパフォーマンス気にする奴が、常にByVal使えとか笑えるわ
361デフォルトの名無しさん:2010/05/19(水) 11:59:22
まあそれもそうだね。
ただ、両バージョン混在してるなら$にしろって言うけどね。
参照渡しは本当に理解してないのが多い(特にCとかJavaとかの人)
362デフォルトの名無しさん:2010/05/19(水) 12:00:52
俺はかっこ悪いから$とかつけない
ByValもつけない
363デフォルトの名無しさん:2010/05/19(水) 12:04:27
変数宣言とか関数宣言だと使うよ。
いちいちAsなんて書いてられない。
364デフォルトの名無しさん:2010/05/19(水) 12:11:17
兎に角、統一してあればそれでいいや
365デフォルトの名無しさん:2010/05/19(水) 12:23:27
Typename(Mid("a",1,1))ってやるとStringって言われるんだけど、
実際はVariantだってのはどこ見ればわかるのか知りたい。
366デフォルトの名無しさん:2010/05/19(水) 12:25:02
第一引数を数値にしてみたけどやっぱり戻り値はStringだなあ
?Typename(Mid(123,1))
String
367デフォルトの名無しさん:2010/05/19(水) 12:34:42
そもそもTypeNameってVariant自体は表示しないでしょ
368デフォルトの名無しさん:2010/05/19(水) 12:41:11
>>364
なんかネット上に書いてありそうだけど、この本見てね。

Welcome to PowerVB
http://www.powervb.com/
369デフォルトの名無しさん:2010/05/19(水) 13:11:03
midとmid$の差なんて、100万回実行して0.1〜0.2秒位の差しかないよ。
その程度の差が利いてくるほどの計算量が必要な処理なら、そもそもVBAで
やるのがどうかという話もある。
まぁ一般プログラマは気にしなくて良いレベル。
370デフォルトの名無しさん:2010/05/19(水) 13:20:40
Mid$()って、MS BASICあたり位からの互換性のためが主な目的な気がする。
そんな細かいことより、文字列の連結方法を教えといた方がいいよね。
371デフォルトの名無しさん:2010/05/19(水) 13:21:29
連結方法ってカッコ付ける奴かな。
372デフォルトの名無しさん:2010/05/19(水) 13:34:17
>>368
何書いてあんの?
何を読ませたいの?
英語の勉強からするのも面倒だし
ネットに書いてあるとか言うの教えてよ
373デフォルトの名無しさん:2010/05/19(水) 13:38:34
374デフォルトの名無しさん:2010/05/19(水) 13:44:53
別にvbCrLfとvbNewLineが混在してても気にならない。
けど、普通はどっちか一つしか使わんだろ。気分でvbCrLf/vbNewLineをごちゃまぜに使うような奴なら、プログラマ
としての素質を疑うよな。
プロジェクト全体として(というほどの大きなプロジェクトがVBAで構築されることがあるのかどうかは知らないが)、
統一されてなくてもかまわんよ。

例えば、CでいちいちNULを'\0'と書けとか言われたら切れるな。0で済むところは0で書くし。
0と'\0'が混在してても気にならないし、0とNULLが混在してても気にならない。
375デフォルトの名無しさん:2010/05/19(水) 14:01:05
上で出てた参照渡しについて
引数として用意した変数に格納してから渡したほうがいい?

call 処理(変数)



引数 = 変数
Call 処理(引数)
変数 = 引数
376デフォルトの名無しさん:2010/05/19(水) 14:14:00
>>375
こんなレベルの奴がいるなら、基本ByValで渡せというのもうなずけるな。
377デフォルトの名無しさん:2010/05/19(水) 15:17:35
なに一人で戦ってるんだ?
手を貸してやろうか?
378デフォルトの名無しさん:2010/05/19(水) 16:07:10
いつもながら、誰がどの発言なのか良くわからずぐだぐだ
379デフォルトの名無しさん:2010/05/19(水) 16:25:10
俺も>>314を支持する派に転向するわw
380デフォルトの名無しさん:2010/05/19(水) 16:54:16
constさえあれば良かった。
381デフォルトの名無しさん:2010/05/19(水) 17:15:06
じゃあ俺も314で
382デフォルトの名無しさん:2010/05/19(水) 17:31:06
>>375エスパーすると

Q:
hoge1,hoge2,・・・hogeN
それぞれ何度も演算したり入れ換えたりした後に関数を呼び出し
関数の中でも同じ変数名でスパゲッティ大盛り
引数のhogeA,hogeBを間違えて渡した時の修正コストが半端ない
だから呼び出し前にそれぞれ変数に値を入れておけば、その部分だけ修正すればいい
よって>>375ですか?

A1: つ 参照
A2: つ 規約
A3: そんな時は大抵他の場所でも入れ違いがあるんじゃね
383デフォルトの名無しさん:2010/05/19(水) 17:52:06
VBAコーディング規約は、こんな項目を含めるといいかも。

・Option Explicit必須
・デフォルトコントロール名(Text1など)の使用禁止
・伝統的なループ変数(i, j, k, ...)以外の一文字の変数名禁止
・ByVal/ByRefの省略禁止
・変数宣言/定義時は、Variantであっても必ず型名を付ける
・一行の「If ... Then」禁止
・Goto/Gosub禁止
・IIf禁止
・Call禁止(書くな)
・While ... Wend禁止(代わりにDo ... Loopを使え)
・$付き関数がある場合はそれを使え
・「=""」「<>""」の代わりにLenBを使え
384デフォルトの名無しさん:2010/05/19(水) 18:50:33
>>383
>Goto/Gosub禁止
On Error は除いてくれ

Call禁止 反対 サブプロシジャ呼び出しであることを明確にしたい
385デフォルトの名無しさん:2010/05/19(水) 19:16:01
>「=""」「<>""」の代わりにLenBを使え

俺普段=””使ってるわ。。。
386デフォルトの名無しさん:2010/05/19(水) 19:59:17
Integerを使わずLongを使え、というのを足しても良いかもな。
387デフォルトの名無しさん:2010/05/19(水) 21:25:40
足してもいい。Integerが32bitだと思ってる厨房が多い。
388デフォルトの名無しさん:2010/05/20(木) 13:53:14
VBAでオセロでも作ってみようと思うんだけど、まったく分かりません
要点としては
@ゲーム開始ボタンを押した後、盤目をクリックしたら駒を描写する所
A一度置いたところにもう置けない判定
B駒を挟んでひっくり返す判定

どうかご教授ください
389デフォルトの名無しさん:2010/05/20(木) 14:03:49
>>388
1. Cells(2, 2).Value = "●"
2. If Len(Cells(2, 2).Value) > 0 Then Debug.Print "おけない" End If
3. Cells(2, 2).Value = "○"

つか、VBAじゃなくて他の言語でオセロ書けるのかよ?
390デフォルトの名無しさん:2010/05/20(木) 21:16:48
セルの数字を文字列に変換するマクロを考えていますが、この場合は元の数字に「’」をつける
形で良いのでしょうか?それともCstr を使用した方が適当なのでしょうか? 
391デフォルトの名無しさん:2010/05/20(木) 22:00:31
>>385
> >「=""」「<>""」の代わりにLenBを使え
>
> 俺普段=””使ってるわ。。。

おいらも。こっちのがタイプ量少ないし。
LenBだといいことあるの?
392デフォルトの名無しさん:2010/05/20(木) 22:01:28
>>390
セルの書式を文字列にすれば?
393デフォルトの名無しさん:2010/05/20(木) 23:07:16
>>391
Len 6命令 <=> LenB 5命令
ちょっとだけお得。
これよりもうちょっとコストが付くのが空文字列の比較。
速度で言えば、LenBが最速。
394デフォルトの名無しさん:2010/05/20(木) 23:20:39
>>390
Cells(2, 2).Value = Cells(2, 2).Value + ""
395デフォルトの名無しさん:2010/05/20(木) 23:42:12
>>394
Cells(2, 2).Text & ""
396391:2010/05/21(金) 00:02:51
>>393
なるほど。性能か。シビアな場合もあるのかもね。
文字列連結も+使うんじゃなくて領域確保した上でMid()使えとか。

おいらはとりあえず性能関係シビアな用途に使っていないし「= ""」 で良いや。
397デフォルトの名無しさん:2010/05/21(金) 00:26:48
>>396
普段使うVBAなんて最速で書けた方が偉いからね。
398デフォルトの名無しさん:2010/05/21(金) 00:46:22
差が出るほど大規模なプログラムをVBAなんかで書くのか…
399デフォルトの名無しさん:2010/05/21(金) 00:56:18
If文書いてて条件の否定を付けるために
カーソル移動するのがめんどいから
Xor Trueなんて行末に書き足すのは俺だけでいい
400デフォルトの名無しさん:2010/05/21(金) 01:06:42
>>398
プログラムの規模じゃなくてデータの規模が問題なんだよ。
401デフォルトの名無しさん:2010/05/21(金) 10:49:32
>>383
DoUntill...Loopもだめ?
402デフォルトの名無しさん:2010/05/21(金) 14:42:26
>>398
ループ内で、普通に文字列連結とかしてたら死ぬときがあるよ
403デフォルトの名無しさん:2010/05/22(土) 11:52:57
文字連結で何故死ぬの?
404デフォルトの名無しさん:2010/05/22(土) 12:05:08
>>402
これ書いたのだれ?もしかしておれ?
405デフォルトの名無しさん:2010/05/22(土) 13:04:22
多分このこと。
http://support.microsoft.com/kb/170964/ja

文字列連結は、需要が多い上に意外と時間がかかる。
何も考えずに作ると処理が死ぬほど遅くなる。
406デフォルトの名無しさん:2010/05/22(土) 16:35:49
すいません、しょうもないことと承知で質問します。
xlnoneとは何をするのでしょうか?
407デフォルトの名無しさん:2010/05/22(土) 17:17:17
何もしない
ただの書式設定のプロパティ値

罫線描画を線無しにする時とかにプロパティをこれに設定する
408デフォルトの名無しさん:2010/05/22(土) 21:00:46
Listviewのリストは、縦には出せないのでしょうか?
409デフォルトの名無しさん:2010/05/22(土) 21:13:44
わかりづらかったですね。
Listviewは、縦スクロールにならないのでしょうか?
410デフォルトの名無しさん:2010/05/22(土) 22:22:26
変数の規約について
例えば出勤日リストの行を定義する変数名

Shukkin_row_count_
ってするより、

S_r_c_ ' Shukkin_row_count_
としたほうが、タイプミスや誤読が減って設計コスト下がるよね
むしろアンダーラインなくして頭文字を大文字で対応すべきかなあ

コードが長くなると変数の意味が散逸しかねないけど……
411デフォルトの名無しさん:2010/05/22(土) 22:45:34
そんな意味ならコメントは日本語でよくね?
412デフォルトの名無しさん:2010/05/22(土) 22:55:31
>>410
ワケ判らん変数名は付けるな
下手に短い名前なら意味が判る長い変数名の方がよぉ〜っぽど良いわ、ヴォケ

413デフォルトの名無しさん:2010/05/22(土) 23:09:26
問題は長い短いじゃなくて俺の命名センスにあるのかな
300行くらいの短いコード書いてみたが、変数名省略しなくても慣れたらすらすら書けた
コメント部分が200行くらいになったが


>>411
うん、コード書く時は日本語コメントは当然付ける
それに追加で、省略前の変数名明示ってことで
414デフォルトの名無しさん:2010/05/22(土) 23:09:28
他の項目にS_r_o_とかあったら死ねるな。
COBOLに侵され気味な俺だと、
SHUKKINrowCountかSHUKKIN_rowCountって感じかなあ。
ベタローマ字は全て大文字というのが俺的基本法則。
415デフォルトの名無しさん:2010/05/22(土) 23:22:55
俺ならVBAとC#では気にせず変数名や関数名に日本語使う
それで可読性や開発効率が上がるなら別にいいじゃんてスタンス
416デフォルトの名無しさん:2010/05/22(土) 23:30:18
>>413
その省略前の変数名という考え方がわからん
s_r_c_'出金の行数
とかでいいと思ってしまう
417デフォルトの名無しさん:2010/05/23(日) 00:26:49
S_r_c_と言う記号で見るのと
Shukkinn_row_count_と言う意味で見るのを比べれば、
保守する時の可読性、認識レベルが異なる

だから逆に、接続を長くして意味を持たせるか、後で読み返した時の読みやすさを高めるために省略するかで迷ってる

日本語変数を使うってのが両方満たして楽なんだが……予期しないエラー引き起こすリスクもある
418デフォルトの名無しさん:2010/05/23(日) 00:30:35
母音省略でいいよ。
sknRowCnt
419デフォルトの名無しさん:2010/05/23(日) 00:32:35
あれ、回答レスになってないな?
省略前って言うのは、今Shukkinn_row_count_って変数があるけど、これをS_r_c_に省略した場合
ってことで使ったんだが、↑のように保守作業時に変数の意味を理解させるって側面もある
420デフォルトの名無しさん:2010/05/23(日) 01:23:02
ソースは他人が見てわかるように書くべし
そして「明日の自分は他人」

結論。好きにしろ
421sage:2010/05/23(日) 23:37:36
すみませんが、どなたか教えていただきたいことがあるのです。
エクセル2003でADOを用いてアクセス2003のデータを抽出したいのですが、
抽出条件で「・・・を含む」としたいのですが、上手くいきません。具体的には

.Source = "SELECT * FROM テーブル1" & _
" WHERE 日時>=" & 開始日 & " AND 日時<=" & 終了日 & _
IIf(Range("B10") <> "", " AND 依頼者='" & Range("B10").Value & "'", "") & _
IIf(Range("B12") <> "", " AND 項目='" & Range("B12").Value & "'", "")

となっておりまして、テーブル1というアクセスのテーブルから、日時と依頼者と項目を完全一致で抽出することはできました。
この中から依頼者と項目に関して、「・・・を含む」条件にしたいのですがLIKE演算子等入れても上手くいきません。
どなたか教えていただけますでしょうか。
422デフォルトの名無しさん:2010/05/23(日) 23:40:15
>>421
SQLの問題というなら

SQL質疑応答スレ 9問目
http://pc11.2ch.net/test/read.cgi/db/1252492296/l50

若しくは同じデータベース板のAccessスレ(あるのかどうかは知らん)へGo !
423デフォルトの名無しさん:2010/05/23(日) 23:46:23
>>421
上手くいかないとき、Sourceにどんな文字列が入っているのか出力して見てはいかが?
424421:2010/05/23(日) 23:53:16
>>422
問題はSQL何ですかね?だとすると手がつけられません。

>>423
デバックしたときに見た文字列は上手くいっていました。
ということは外部データの取り込みではLIKE演算子は無理なのでしょうか・・・
425デフォルトの名無しさん:2010/05/23(日) 23:54:57
むり
426デフォルトの名無しさん:2010/05/24(月) 00:00:03
あれ?できなかったっけ?
427421:2010/05/24(月) 00:05:18
たとえば
IIf(Range("B10") <> "", " AND 依頼者='" & Range("B10").Value & "'", "") & _
のところを、
IIf(Range("B10") <> "", " AND 依頼者 Like'%" & Range("B10").Value & "%", "") & _
へ変えてみても上手くいきませんでした。
もしかして書き方が間違ってますか?
428デフォルトの名無しさん:2010/05/24(月) 00:14:13
>>424
デバッグで見ただけでは分かりにくいエラーは有るよ
俺はSQL文をテキストファイルに出力するプロシジャを作って
別途確認する様にしてる w

429デフォルトの名無しさん:2010/05/24(月) 00:18:14
>>427
Value & "%" の%の後ろのシングルクォートは?
あと一応Like演算子と文字列の間にスペースを入れようか。
それとセルの内容エスケープしてないのはわざとだよね?
430デフォルトの名無しさん:2010/05/24(月) 00:25:43
マンドクセだから確認してないけど
先に抜き出す条件を文字列でSQLにぶちこんでみ
それで出来ないなら構文かデータベースチェック
431421:2010/05/24(月) 00:28:19
できました!。皆さんありがとうございます。
特に>>427さん
大変ありがとうございます。
恥ずかしながら、後ろ側のシングルクォーテーションが必要とは知りませんでした。
また、Likeの後にスペースを入れていないことも原因のひとつでした。(本当に情けない。。)

>>427さん
後学のため教えていただけますか?
>それとセルの内容エスケープしてないのはわざとだよね?
具体的にはどういったことでしょうか?
432421:2010/05/24(月) 00:30:22
興奮してレスを間違えました。
429のレスは427ではなく>>429さんへのレスでした。
433デフォルトの名無しさん:2010/05/24(月) 00:32:44
>>431
エスケープっていうのはたとえば、Range("B10")の内容に
シングルクォートが含まれていたりしたらSQL文として
文法エラーになるよ、っていうだけの話。
Like '%'%' みたいになったらシングルクォートの閉じ位置が
変わるので文法エラーになる。

まあ、自分で使うツールってだけならあんまり気にしなくていいよ。
434421:2010/05/24(月) 00:40:20
>>433
なるほど・・・
たしかにそうですね。勉強になります。
今回は時間の都合上、運用面で対処したいと思いますが、
今後はそういったことを含めて構築していきたいと思います。
とにかくありがとうございました。
435デフォルトの名無しさん:2010/05/24(月) 08:17:43
D-SUB9ピンのRS-232Cで接続するバーコードリーダーから文字列を入力する方法を教えてください
TELNETで認識するところまでは出来たのですがそこまでしか出来ませんでした
436デフォルトの名無しさん:2010/05/24(月) 09:00:54
だれかイミディエイトウィンドウを画面右側にぴったりフィットさせる方法を教えてくれ。
前はいろいろいじくってたらなんとかできたんだけど、今どうやっても上手くいかない。
437デフォルトの名無しさん:2010/05/24(月) 09:22:38
しばらくここ読んでなくて乗り遅れたが、空文字の代わりにvbNullStringって書いたやつ誰だよ。
どういう場面を想定したか知らんがrange("a1").value=vbnullstringなんてのは間違いだよなぁ。
438デフォルトの名無しさん:2010/05/24(月) 09:25:46
2ch もう終わってるね
439デフォルトの名無しさん:2010/05/24(月) 09:30:59
そんなことを言う人は破門です
440デフォルトの名無しさん:2010/05/24(月) 09:48:26
LenBがLenより速いとか書いたやつもしっかりString型の時と書かなきゃいかん。
Excelでよく使うVariant型では逆になるぜ。
441デフォルトの名無しさん:2010/05/24(月) 09:53:23
>>435
VBみたくAPI使えばいいんでね
442デフォルトの名無しさん:2010/05/24(月) 10:05:25
436
ぐっとしてきゅって右下にばっする
443デフォルトの名無しさん:2010/05/24(月) 10:18:36
>>440
くどくなるので必ずこうしろと言うわけではないが、Variant型の2次元配列の
各要素の型が何型か判定する場合が多いと思うが、判定して文字列だったら
String型の一時変数に格納して処理した方がベター。
そうすればLenBが確かに速い。
数値などの他の型でも一時変数に移した方がいいのは同じ。

444436:2010/05/24(月) 10:26:51
>>442
d
でけたぜ!
右下にってのがコツなんだな。
445デフォルトの名無しさん:2010/05/24(月) 11:04:44
正直、=""とかLenBとかにこだわってるのはほとんど無意味だぜ
そんなの、長い文字列を連結したり、RangeのCopyメソッドを使った瞬間に
無意味になる
446デフォルトの名無しさん:2010/05/24(月) 14:06:07
Public Type A
ID As Integer
Name As String
End Type

Public Type B
ID As Integer
Name As String
ByRef A As String <-ここでエラーが出る
End Type

Sub main()
Dim TableA() As A
Dim TableB() As B
・・・・
End Sub

TableBでTableAのメンバーの一つを参照させたいのですが、上記のような記述だとエラーが出ます。

構造体のメンバーに参照(ポインタ)を使いたいのですが方法はないものでしょうか?
447436:2010/05/24(月) 16:53:58
>>447
文字列の連結に単純連結がいけないのはほとんどの人が知ってるだろ?
あとはいかにスマートにMidステートメント使うかが腕の見せ所。
まぁ今はバカでも使えるJoinがあるので楽になったけどな。
448デフォルトの名無しさん:2010/05/24(月) 19:01:08
単純な文字列連結にこだわりすぎるやつも馬鹿だな
文字列連結なんて大抵は短い文字列同士の連結にしか使わず
さらに回数もたいしたことないのが普通なんだから
その辺をわかってて使うなら普通の簡潔な記述の方が優れてる
449デフォルトの名無しさん:2010/05/24(月) 20:19:31
>>448
んなこたー当たり前。
回数の多い例が出てたんでね。
こんなのほとんどの言語で共通だと思うが、未だに知らない人もいるみたいなんでね。
450デフォルトの名無しさん:2010/05/24(月) 20:34:22
長さ0の文字列かどうかならLenとかLenBの方が""と比較するよりいいかも知らんが、セルが空白かどうかを調べるだけならIsEmptyが一番軽いだろうねぇ。
俺は大体""と比較するけどな。
451デフォルトの名無しさん:2010/05/24(月) 22:12:41
そういうチマチマした高速化の技術はどうでもいい
高速化で本当に困るのはそんなところじゃない
上で出てた文字列連結の知識や、valueを配列に一気に出し入れする技、
WorksheetFunctionを使う技などをまず覚えるべき
452デフォルトの名無しさん:2010/05/24(月) 22:38:03
>WorksheetFunctionを使う技

意識したことないけど、これどんなん?
453デフォルトの名無しさん:2010/05/24(月) 23:43:02
>>451
そんな低レベルな話してもしょうがねぇなぁ。
お前の文字列連結を手直ししてやるからここで書いてみ?
A1:A60000の値をカンマで連結するコードを書け。
ただし
454デフォルトの名無しさん:2010/05/24(月) 23:44:24
おっと途中で送信したぜ。
ただしJoinはなしな。
これは猿でもできるから。
455デフォルトの名無しさん:2010/05/25(火) 02:44:49
高速化言うんならCとかでDLL作って呼び出したらいいんじゃね
VBAですることじゃない
456デフォルトの名無しさん:2010/05/25(火) 06:08:39
何で書こうと回数の多い連結を単純に連結しては駄目だわな。
以前VBAを馬鹿にした酔っ払いSQL厨がいたが、アルゴリズムも知らない馬鹿だったぜ。
457デフォルトの名無しさん:2010/05/25(火) 08:09:07
>>453の素晴らしい回答にご期待ください。

俺は猿でもできるJoin使うけど。
458デフォルトの名無しさん:2010/05/25(火) 08:54:57
適当に

A6000までコピー
クリップボードから変数に抜き出し
Replaceでvblfを,に変換
書き出し

そこそこ早いかな?
459デフォルトの名無しさん:2010/05/25(火) 08:59:05
>>456
回数だけではない
どちらかというとむしろ、文字列が長いかどうかが重要だな
回数というのもどちらかというと、「ペース」と置き換えるべきだし
460デフォルトの名無しさん:2010/05/25(火) 09:15:49
連結してねえw
461デフォルトの名無しさん:2010/05/25(火) 10:02:35
A60000だった
列Aでもいいな
462デフォルトの名無しさん:2010/05/25(火) 10:46:29
お前と連結したいよ
463デフォルトの名無しさん:2010/05/25(火) 11:47:36
ウホッ
464デフォルトの名無しさん:2010/05/25(火) 12:24:32
プログラムとしては面白いが、解答としてはどうなの
実際に文字列連結する場合、配列でもなんでもいいけど書き出してからその処理するのは流石に時間かからないかな
見てないけど
465デフォルトの名無しさん:2010/05/25(火) 12:48:58
もう連結ネタ飽きたのでそろそろ別のネタ始めてクレクレ
466デフォルトの名無しさん:2010/05/25(火) 13:07:40
ネタも何も質問スレなんだから質問ありきだろ
467デフォルトの名無しさん:2010/05/25(火) 13:10:42
素直にJoin使えばいいのに、禁止する意味がわからない
何がしたいの
468デフォルトの名無しさん:2010/05/25(火) 13:16:14
任意の型の空の配列を作成する方法ってありますか?
String型ならSplit()で行けるし、Variant型ならArray()でいけますが、
他の型はどうやって作成すればよいでしょうか?
469デフォルトの名無しさん:2010/05/25(火) 13:26:26
>>458
DataObject使うのか?
でもReplaceが遅いからなぁ。
試しに
A1
A2
.
.
A599999
A600000
と2文字〜7文字の60万セルでやってみたら2.8秒だったぜ。
DataObjectとSplitとJoinの併用でもほぼ同じ。
一方Midステートメントは0.6秒。
ループ回して一次元配列に移してJoinは微差でMidステートメントに負けるようだが俺ならJoin使うな。
なんたって楽だからな。
470デフォルトの名無しさん:2010/05/25(火) 13:34:18
上は連結文字列の作成だけで書き出しは入ってないからね。
471デフォルトの名無しさん:2010/05/25(火) 21:15:37
60万行じゃなく6万行でやってみたら>>458のDataObjectが一番速いな。
Dictionaryと似たような特性だな。
数万データならそこそこ速いが数十万になるとウンコってやつ。
472デフォルトの名無しさん:2010/05/25(火) 21:32:17
で、結局どんな答えを想定してたんだ?
473デフォルトの名無しさん:2010/05/25(火) 21:38:05
クリップボード経由で数百万語を一変数に押し込む処理ってCPUとメモリに依存しそうだが
474デフォルトの名無しさん:2010/05/25(火) 22:51:12
まだまだCPUやメモリは速くないなと思ってしまった。
475デフォルトの名無しさん:2010/05/25(火) 23:27:54
思いつきで書いただけだが、「エクセルVBAテクニック」としてなら有りな感じ?
限定条件下になりそうだけど
476デフォルトの名無しさん:2010/05/26(水) 00:40:46
>>458はvbLfじゃなくvbCrLfだな。
477デフォルトの名無しさん:2010/05/26(水) 17:00:12
Mid$とclsConcatenate使って、
vbCrLfは10と13だから、SelectCaseでそれぞれ処理し、
2文字ずつカウントする

……と、多分こういう解答を求めてたんだろうか
478デフォルトの名無しさん:2010/05/26(水) 20:43:51
Mid$以外使う必要がないでしょ
clsConcatenateってなんだろうと思って検索したら
独自に作ったStringBuilderもどきがひっかかった
もし、そういうのを使うならclsConcatenateだけでいいし
vbCrLfでSelect Case云々言ってるのは、なんでそんなことをしてるのか
ちょっとわからない
479デフォルトの名無しさん:2010/05/26(水) 21:03:22
初歩的なことなのだが教えて欲しい。
Public変数は、プロシージャの処理終えると値消えてしまうのか?
480デフォルトの名無しさん:2010/05/26(水) 21:12:04
基本的に残るけど、一定のタイミングや、
Endステートメントを実行すると初期化されなかったっけ。
481デフォルトの名無しさん:2010/05/26(水) 22:26:59
>>479
VBAの処理が終わったあとで変数の内容を見るには、イミディエイトウィンドウで?
たとえば変数aの値を確認したければ?a[Enter]と入力すればいい
ttp://f12.aaa.livedoor.jp/~itatisa/phpup/cgi/src/up9840.png

変数がクリアされる条件は、Endを実行した時(End SubやEnd Functionではなく単独のEnd文)
エディタやマクロの記録などでVBAを書き換えたとき
482デフォルトの名無しさん:2010/05/26(水) 23:35:58
VBAの本でいい本ってある?
なんか、サンプル載せましたよ
みたいな本ばっかりで、このスレに書いてあるようなことが載ってる本
見たこと無いんだけど

例えば、>>481に書いてあるようなこととか、つい最近話題になった
文字列連結のことだとか、そういうことすら、書いてある本を
ほとんど見たことがない
483デフォルトの名無しさん:2010/05/26(水) 23:41:14
フェイタンと師団長だったら、別に師団長が強烈な発を持っていなくても
勝負はわからんよなw
484デフォルトの名無しさん:2010/05/27(木) 00:11:27
最近かってためになったのは
ExcelVBAスキルアップテクニック
Excelプロフェッショナルエンジニアテクニック
かな
485デフォルトの名無しさん:2010/05/27(木) 00:26:31
>>482
VBAはVB6と言語としては全く等価だから
VB6で探したほうがいいね。
486デフォルトの名無しさん:2010/05/27(木) 05:20:36
>>480-481
なるほど。Endで消えてしまうとは、知らなかった。
ありがとう。
487デフォルトの名無しさん:2010/05/29(土) 20:28:43
これ出来ないのかな、と前から何度も思ってた事なのですが、

テキストボックスとテキストボックスなら、図形の矢印で結ぶことができて、
片方のテキストボックスを動かしたら、矢印の線も一緒に動くじゃないですか。

これを、
セルとテキストボックスでやることは出来ないのでしょうか?

つまり、テキストボックスから、矢印を延ばして、あるセルにくっつけます。
そして、どっちを動かしても、矢印で繋がったままにしたいのです。
488デフォルトの名無しさん:2010/05/30(日) 10:02:24
489デフォルトの名無しさん:2010/05/30(日) 12:41:07
質問です。。
ユーザーフォームのラベルでバック半透明で文字だけをくっきり表示させたいです。
どうすればよろしいでしょうか?
490デフォルトの名無しさん:2010/05/30(日) 22:55:02
VBAでマウスカーソルをピクセルで指定してクリックさせるにはどうするのが良いのですか?
今はShellを使って別プログラムから呼び出してますが、処理が遅くなるので
もっとスマートなやり方があれば教えて下さい。
491デフォルトの名無しさん:2010/05/31(月) 05:10:33
うんこ
492デフォルトの名無しさん:2010/05/31(月) 08:39:22
>>488
VBAで作るとすると
1.矢印の起点・終点(高さ)を取得
セルなら(i-1)までの.RowHeightの合計プラス(iの.RowHeight)/2
テキストなら位置プラス(高さ)/2
2.横位置を取得
同様に

3.左右のオブジェクト判定
セル、テキストボックスの右端位置を比較

4.1と2を元に矢印の位置設定


>>499
ラベルのプロパティ→項目別→表示
で好きなの選ぶ
493デフォルトの名無しさん:2010/06/01(火) 01:02:31
>>489の質問は492で解決になっているのか??
表示の中に半透明の設定なくない?
494デフォルトの名無しさん:2010/06/01(火) 07:19:17
EXCEL2003、XPsp2です。

EXCELのVBAだけを使って、インターネット(TCP/IP)通信をする
プログラムは作れるのでしょうか?
難易度は問いません。

よろしくお願いします。
495デフォルトの名無しさん:2010/06/01(火) 08:21:24
ぐぐったらフォームの半透明化が見つかった
窓側のコントロールのカスタム描画を使うAPIだな

半透明ってのがイメージ湧かないが
496487:2010/06/01(火) 12:52:30
ありがとうございました
497デフォルトの名無しさん:2010/06/01(火) 17:06:19
Docmd.RunSQLってマルチプルINSERT対応していますか?
DBはMySQLです。
498497:2010/06/01(火) 17:19:55
あ、ここAccessじゃなくてExcelでした。
すみません。
499デフォルトの名無しさん:2010/06/01(火) 22:20:26
Formulaで数式埋め込もうとすると短い式なら問題ないんだが、
複雑な(長い)式になるとTRUEを返される。
何だこれ?
500デフォルトの名無しさん:2010/06/01(火) 22:24:10
もっと色んなパターン試せばどうだろう
別の長い式作って
501デフォルトの名無しさん:2010/06/01(火) 22:46:14
EasyCommっていうフリーウェアをインポートして
装置からデータをRS-232C経由で取り込むプログラムを書いたんですが、
プログラム動作中はストップキーも聞かず、入力を受け付けてくれない
ようです。これってそういう仕様とあきらめるしかないのでしょうか。
502デフォルトの名無しさん:2010/06/01(火) 22:51:58
DoEventsじゃなくて?
503デフォルトの名無しさん:2010/06/02(水) 07:37:52
真偽返すのはどっか引数が抜けてるんじゃね
504デフォルトの名無しさん:2010/06/02(水) 11:32:10
>501

んなこたぁない。
505デフォルトの名無しさん:2010/06/02(水) 20:39:09
エクセル2000では動く、エクセル2007では
動かないマクロがあるんだけど。
考えられる原因ってどんなのがあるの?
506デフォルトの名無しさん:2010/06/02(水) 21:40:52
大抵は、変更とか削除された機能を使っていたとかじゃないか?
2007で旧時代の機能は大分整理されたみたいだからな。
507499:2010/06/02(水) 21:57:24
解決した。

結局TRUEが返される理由はわからんが、
思い通りの結果が出たのでまぁ良しとする。
508デフォルトの名無しさん:2010/06/02(水) 22:08:20
>>506
そうなん?ってことは2007で動くように
作りなおさなきゃってこと?
そのまま使える方法ってないのかなぁ?
509デフォルトの名無しさん:2010/06/03(木) 11:30:03
ない
2003と2007はまったく別のソフトだと思った方がいい

何も全部作り直さなくても、たいていのマクロは少し修正するだけで使えるようになるはず
510デフォルトの名無しさん:2010/06/03(木) 19:45:17
両方で動くようにはできないってこと?
511デフォルトの名無しさん:2010/06/03(木) 20:22:43
それは内容による
速度やExcelそのものの制限に関係なく、
両方で結果が同じになる関数ばかり使ってればいい
512デフォルトの名無しさん:2010/06/04(金) 06:30:29
両方で結果が違う関数なんてあるんだぁ
たとえばどんな関数?
513デフォルトの名無しさん:2010/06/04(金) 08:14:47
version
514デフォルトの名無しさん:2010/06/04(金) 11:34:28
おおっと
515デフォルトの名無しさん:2010/06/04(金) 12:06:55
Versionはプロパティ
516デフォルトの名無しさん:2010/06/04(金) 23:56:59
WorksheetFunction
517デフォルトの名無しさん:2010/06/05(土) 00:07:43
エクセルver2002を使っています。
印刷設定について教えていただきたいのですが、

一枚77行で縦に任意の枚数(2枚なら77*2行)にあわせて行を77行ごと追加する
マクロがあるのですが、この作成された任意の枚数の表の印刷範囲についてなのですが、、、

表作成後に表全体を選択して印刷範囲設定しているのですが

With ActiveSheet
.PageSetup.PrintArea = Range(."表全体").Address
End With
※縮尺73%、A3、品質300dpi
プリンターの種類、印刷品質、余白の設定で印刷行数が77からずれることがあります。

【質問】
1.マクロで、縮尺はきにしないで常に77行目に印刷境界線をもってくることはできますでしょうか?
2.また、縮尺50%にしても77行ごとに印刷境界線をもってくることはできますでしょうか?

よろしくお願いいたします。
518デフォルトの名無しさん:2010/06/05(土) 03:54:52
ipadでExcelVBA動くようにならんかね
519デフォルトの名無しさん:2010/06/05(土) 04:01:07
>>517
77行毎に一旦別のシートにコピーして
印刷
その後そのシートは削除するとか
520デフォルトの名無しさん:2010/06/05(土) 07:11:07
>>518
つ Citrix Receiver for iPad
521デフォルトの名無しさん:2010/06/05(土) 20:49:36
>>517
印刷境界線ってのは何をさしてるんだ?

印刷範囲を77行までにするなら
ActiveSheet.PageSetup.PrintArea = "$1:$77"

78行の前に改ページ入れたいなら
Rows("78:78").Select
ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=ActiveCell

とりあえずマクロの記録でこうなった
522517:2010/06/06(日) 14:03:42
>>517です。
分かりにくい説明ですみません。

縦に1〜77と数字を入れたとして、次ページでまた1〜77といれる。

【縮尺100%】
1
2
3


76
77
--------改ページのライン
1
2
3


76
77
-------改ページのライン
523517:2010/06/06(日) 14:05:33
【縮尺90%】
1
2
3


76
77
1
2
--------改ページのライン
3


76
77
1
2
3
4
--------改ページのライン

縮尺が100→90%になったときに改ページラインがずれてしまいます。(列側のラインも同様にずれます)
また印刷の余白を変更したり、解像度を変更したりしてもずれます。
複数シートに同じような表があり、マクロで一括で体裁を整えたいのですが、

上記のようなとき、手動で改ページラインを77と1の間にもっていけば
自動的に100%になり綺麗に印刷することができます。
この時手動であれば90%のままで77行ごとにもできます。
これをマクロで印刷範囲を77行ごとにしたいのです。
※縮尺は問いません。(縮尺指定できるのであればやり方だけでも教えていただけたらと思いますが・・・)
524デフォルトの名無しさん:2010/06/06(日) 14:52:35
だから、77行目ごとに改ページ入れたいんだろ
>>521の後半でわからない?まったくの初心者か?
その77行ごとにデータ入れるマクロで、改ページも入れるようにすればいいだけなんだが

わからんようなら、A列から1を探してその手前に改ページ入れるマクロ書いといてやる
    Dim row
    ActiveSheet.ResetAllPageBreaks
    row = 1
    Do
        row = row + 1
        If Cells(row, 1).Value = 1 Then
            ActiveWindow.SelectedSheets.HPageBreaks.Add (Cells(row, 1))
        End If
    Loop Until Cells(row, 1).Value = ""

2007で作ってるけど、たぶん2002でも動くと思う

暗黙の型変換気持ち悪いとかいう突っ込み禁止
525517:2010/06/06(日) 17:26:45
>>524さん
ご指摘ありがとうございます。
マクロはネットで調べながら覚えたもので、勉強不足ですみません。

そして、謎が解けました!
ActiveSheet.ResetAllPageBreaks
の時点で自動で縮尺が100%になるんですね。
この後に縮尺を90%にしてから
HPageBreaks.Add
で改ページをいれてあげたらうまくいきました。

ありがとうございました。
526デフォルトの名無しさん:2010/06/06(日) 20:12:11
下記のデータが仮にあったとします。
ユーザーフォーマットを使用してコンボボックスにユーザーID(A列)を
配置し、指定されたA列のB列、C列データを呼び出し変更を加えれるようにしたいのですが、
コンボボックスとテキストボックスをどのように紐つければよいのでしょうか?

A B C 
1 犬 雄 
2 猫 雄 
3 鳥 雌   

527デフォルトの名無しさん:2010/06/06(日) 20:35:57
更新後処理
528デフォルトの名無しさん:2010/06/06(日) 21:23:42
アドインを2つ作りました。

中のプログラムはモジュール名から何まで全く同じで、
途中で参照するファイル(テキスト)だけが異なります。

別の業務をしている人向けに、それぞれに作ったのですが、
兼業する人が両方のアドインを追加すると、うまく動きません。

具体的には、最初に動かした方のテキストをずっと読んでしまうようです。

どこを変えれば動くようになるでしょうか。
529デフォルトの名無しさん:2010/06/06(日) 21:58:41
空が青いなぁ。
530デフォルトの名無しさん:2010/06/06(日) 22:01:43
全部同じなら中の人も見分けつかないだろうな
処理なり使ってるシステムから切り替え出来ないの?
531デフォルトの名無しさん:2010/06/07(月) 21:22:06
既にシート中にある、表の中身(文字列)を二次元配列として変数に代入して
他のシートのセルに場合わけして入れる場合、どのように書いたらよいのでしょうか?
532デフォルトの名無しさん:2010/06/07(月) 21:46:32
Hairetu = range( , )

ループ処理
Hairetu(i,n)の条件分岐でHairetuBにでも格納

sheets( ).rante(,) = HairetuB
533デフォルトの名無しさん:2010/06/07(月) 22:08:28
>>532さん、ありがとうございます。
最初の変数の代入は、どのように記述すればよいのですか?
二次元配列を宣言してx(i,n)でstring型で宣言したのですが、
データ数が多いのでfor文で回して代入したいのです。、
range("A1")を代入するとしたら、for文はどうなるのですかね??

For i = 1 To 18000
For j = 1 To 18
x(i,j) = Range(i, j)
Next j
Next i
こうじゃないですよね。。
534デフォルトの名無しさん:2010/06/07(月) 22:14:31
Hairetu = range("A1:Z99")
535デフォルトの名無しさん:2010/06/07(月) 22:47:54
ありがとうございます。
すみません、最後の別シートの格納の仕方についてなのですが…
例えば、x(2,3)の内容をRange("C2")に入れるなど、所定の場所に格納
する際に、for文で回して入れる方法はあるのでしょうか?
536デフォルトの名無しさん:2010/06/07(月) 23:12:48
>>533
ワークシートの内容を配列に入れるには、配列を二次元のVariant型にしておけば、セルがいくつあっても一気に代入できる。
Forを使うより何倍も速いしプログラムも簡単。
String型にしてしまうとFor〜Nextを使うような遅い方法しか使えなくなる。
537デフォルトの名無しさん:2010/06/07(月) 23:14:50
>>535
そりゃ
Range("C2") = x(2, 3)
だろう。
ほかのデータはどこに入れるの?規則的に並んでなければForを使うのは面倒だよ。
538デフォルトの名無しさん:2010/06/08(火) 18:05:08
別の配列に入れ替えればいいだろに
539デフォルトの名無しさん:2010/06/08(火) 23:49:19
質問なのですが、
セル範囲を一括で配列に格納した場合の添え字を
0からスタートさせることは出来ますか?

普通に格納するとx(1,1)から数値が入ってしまうところを
x(0,0)から数値が入るようにしたいのです。
今は別の配列に入れ替えてるのですが、ちょっと不便で・・・

よろしくお願いします。

540デフォルトの名無しさん:2010/06/08(火) 23:59:25
Excel2007

テキストボックスのScroolBarsプロパティをfmScrollBarBothに設定しているんですけど、
ホイールマウスの真ん中のホイール部分を回転させても有効になりません。

有効にする方法ってありますか?

541デフォルトの名無しさん:2010/06/09(水) 02:26:41
>>539
無理。
VBAでは、0オリジンに拘るよりも、1オリジンを素直に受け入れた方が何かと楽だよ。
542デフォルトの名無しさん:2010/06/09(水) 04:03:16
まだ勉強しだして一週間なんですが教えてください

AとBにそれぞれ1〜50の数字を代入し
AとBを掛け合わせた数を縦方向にペペペと貼り付けを繰り返したいんですが
1×2と2×1は答え同じなんで重複を無くすために
代入する数値を【A>B】と定義するのってどうしたらいいんですか
↓こんな感じでやってます
Dim A
Dim B
for A 1 to 50
for B 1 to 50
(右クリックコピーでペペペと貼り付けるマクロ省略)
Next B
Nezt A
543デフォルトの名無しさん:2010/06/09(水) 04:56:01
やりたいこと(出来上がりイメージ)がよくわからん上に
大事なとこが省略されてる気がする

とりあえずA>Bのときだけなんかの処理をしたいのなら

Dim A
Dim B
for A=1 to 50
for B=1 to 50
If A>B Then
(右クリックコピーでペペペと貼り付けるマクロ省略)
End If
Next B
Next A

こんな回答しかできません
出来上がりのイメージとかあればもうちょいマシな回答できるかも
544デフォルトの名無しさん:2010/06/09(水) 05:03:23
>>542
とりあえず質問そのままの解答だと
If A > B Then ぺぺぺ
だけど、条件がA>Bだけだと6*1と3*2が同じ答えで重複するし
50*50は1回しか出てこないのに条件から外れちゃうよ?

いちいち調べなくても必ずA>Bになってるプログラム
For B = 1 To 49
For A = B + 1 To 50
ぺぺぺ
Next A
Next B

それから右クリックコピーってなんだ?
セルに数値を入れるだけなら右クリックも貼り付けも必要ないんだが。
545デフォルトの名無しさん:2010/06/09(水) 09:39:29
Dim A&, B&, rowCnt&, colCnt&
rowCnt = WorksheetFunction.Max(A,B)
colCnt = WorksheetFunction.Min(A,B)

もしくは
If A < B Then
 Dim swap&
 swap = A
 A = B
 B = A
End If

ってやりたいだけか?
546デフォルトの名無しさん:2010/06/09(水) 16:12:47
Sub Hoge(inRange as Range, outRange as Range)
上記のようなインターフェースのサブルーチンがあるとします
inRangeのデータに何らかの演算をしてoutRangeにコピーします
このサブルーチンをワークシートの上のほうにある関数入力部分に
=Hoge(A1:B2, C1:D2)
のように入力したのですがうまく動いてくれません
引数付きのサブルーチンをワークシート上で手動呼び出しするにはどうすればいいんでしょうか?
547デフォルトの名無しさん:2010/06/09(水) 17:02:14
インターフェースのサブルーチン だぜ
548デフォルトの名無しさん:2010/06/09(水) 18:59:39
シート1からシート7までのb242:u242のセルをコピーして
シート11のb2からb8まで順番に貼り付けるにはどうすればよろしいのでしょうか?
549デフォルトの名無しさん:2010/06/09(水) 19:00:27
シート上に CommandButton を 2 つ配置し、
それぞれ CommandButton1, CommandButton2 とします。

CommandButton1 をダブルクリックして、次のコードを書きました。

 Private Sub CommandButton1_Click()

  CommandButton1.Enabled = False
  CommandButton2.Enabled = False

  MsgBox "now processing..."

  CommandButton1.Enabled = True
  CommandButton2.Enabled = True
 
 End Sub

ここで CommandButton1 をクリックしてダイアログボックスが出ているとき、
CommandButton2 の文字が黒のままで False になっていないように見える
のは、なぜですか?

MsgBox の行にブレークポイントを仕掛けて CommandButton1 をクリック
したときは、きちんと CommandButton2 の文字も灰色になります。

(WinXPSP3/Excel 2003)
550デフォルトの名無しさん:2010/06/09(水) 20:25:57
>>546
SubをPublic Functionにしろ。
あとワークシートにVBA記述すんな。モジュールに書け。
関数の入力のダイアログでユーザ定義関数の一覧部分に
自分の定義したFunctionが出てるか確認しろ。

以上。
551デフォルトの名無しさん:2010/06/10(木) 07:04:06
RS485を入出力したいのですが、RS232Cとかでよく使われるMScommを利用しようと思っています。
ところが、「ActiveXはオブジェクトを作成できません。」とエラーが出てしまいます。
RS232Cの入出力でも同様に出てしまいました。
VB6.0ランタイムはインストール済です。参照設定もしています。

どうしてでしょうか?解決策は?
552デフォルトの名無しさん:2010/06/10(木) 07:26:00
553デフォルトの名無しさん:2010/06/10(木) 14:36:54
ワークブックXには、2つのワークシート(以下WS)があります。
・ワークシートA(以下WSA)は日次報告の原紙が作成済み
・ワークシートB(以下WSB)の列Cには日次報告の対象となる日付(MMDD形式)が入力済み

上記の2つのシートを使い、
1.「WSA」を「WSB:C列に入っている日付の個数分作成」し、
2.1.で作成されたWSのシート名を「WSBの日次報告の対象となる日付」に変更
するというマクロはどのように組めばよいのでしょうか?
554デフォルトの名無しさん:2010/06/10(木) 15:14:06
>>553
実際に操作してマクロの記録しろよ
555デフォルトの名無しさん:2010/06/10(木) 17:21:40
>>553
    Dim r
    r = 1
    Do Until Sheets(2).Cells(r, 3) = ""
        Sheets(1).Copy After:=Sheets(2)
        Sheets(3).Name = Sheets(2).Cells(r, 3).Text
        r = r + 1
    Loop

シートの1枚目が原紙、2枚目が日付の入ったシートって前提な
556デフォルトの名無しさん:2010/06/10(木) 20:11:03
C++とかでDLLを作ってそのDLLの関数からRangeを操作したりって出来ますか?
557デフォルトの名無しさん:2010/06/10(木) 20:54:18
IDispatch::Invokeとか直接呼ぶ羽目になりそうな気もするけど、
一応可能じゃないかと。
558553:2010/06/10(木) 23:26:31
>>552
すみません…
駆け出しなもので、余計なコードが入ってしまうと理解に時間がかかるため
エディターで編集しています



>>555
ありがとうございます!
少し参照するシートや列を変更してみたら、自分の環境でも動くようになりました
ちなみに、こんな感じです↓

Sub ワークシートコピー()
Dim r
r = 1
Do Until Worksheets("日付データ").Cells(r, 9) = ""
Worksheets("原紙").Copy After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = Worksheets("日付データ").Cells(r, 9).Text
r = r + 1
Loop
Application.DisplayAlerts = False
Worksheets("原紙").Delete
Dim p As String
p = Worksheets("日付データ").Range("A6").Text
Dim n As String
n = Worksheets("日付データ").Range("A7").Text
ActiveWorkbook.SaveAs Filename:=p & "\" & n & ".xls"
Application.Quit
End Sub
559デフォルトの名無しさん:2010/06/11(金) 01:40:47
>>542
書いてみた

Sub main()

Dim C As Range
Dim strC(2500, 0) As String

For Each C In Range("A1:AX50")
strC(C.Row * C.Column, 0) = C.Row * C.Column
Next C

With Range("A1:A2501")
.Value = strC
.RemoveDuplicates Columns:=1
End With

Rows(1).Delete

End Sub
560デフォルトの名無しさん:2010/06/11(金) 07:44:47
書き直した

Sub main()
Dim C As Range
For Each C In Range("A1:AX50")
Cells(C.Row * C.Column, 1) = C.Row * C.Column
Next C
Range("A1:A2500").RemoveDuplicates Columns:=1
End Sub
561デフォルトの名無しさん:2010/06/11(金) 07:57:31
バグがあった・・・Orz

Sub main()
Dim C As Range
For Each C In Range("A1:AX50")
Cells(C.Row * C.Column, 1) = C.Row * C.Column
Next C
Range("A1:A2500").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub
562デフォルトの名無しさん:2010/06/11(金) 09:57:55
Excelで勤怠表を作成する時、必ず問題になるのが、
深夜割増、早朝割増、深夜休憩、早朝休憩の計算方法だと思うんだけど、
これってVBA使わずに完全に解決してる例がみつからない。

ここまできっちりやるならVBAもしくはシステム化が普通なのかな?

タイムカードは基本的には休憩時間を考慮しないし、そのへんなかなか難しいね。
563デフォルトの名無しさん:2010/06/11(金) 11:31:45
>VBA使わずに完全に解決してる例がみつからない。

君の能力の問題じゃね?
564デフォルトの名無しさん:2010/06/11(金) 12:14:02
> 君の能力の問題じゃね?

俺のググる能力が足りなかったのか!!
565デフォルトの名無しさん:2010/06/11(金) 13:07:52
>>562
そういうの作った人が、やめちゃってわかんないから、バグとってくれって頼まれたことがある
まあ、ものすごく長い式が詰め込まれとったわ
VBA使わずにできなくは無いのは確かだけど
VBA使えるならそのほうが圧倒的に楽
566デフォルトの名無しさん:2010/06/11(金) 13:25:52
>>565
読む方からしても、関数よりVBAの方がわかりやすいってことあるよね。
うちにもExcel2003の列数の制限いっぱいまで式が詰め込んであるワークシートが
複数枚、さらに記録機能で作っただけのマクロも大量の悲惨なやつがあるんだが、
とてもじゃないが解析する気にならない。当然作った人は辞めてる。
しかも経理用のだからよくわからん。

ただ、VBAとかマクロを使わずにワークシート関数のみを駆使したシートを
作ると自己満足度が高いので、気持ち的にはわかることはわかる。
567デフォルトの名無しさん:2010/06/11(金) 15:24:34
どんな就業規則なのかしらんけど、区切り時間とか計算式が変わる境界値を設定して、
一列に一個**時間を計算して、そのsum()なんかを設定値と比較して条件式なんかを
設定した方が、VBAでごちゃごちゃやるよりシンプルだと思うのは俺だけか。
568デフォルトの名無しさん:2010/06/11(金) 15:29:44
おまえだけ(´ω`)
569デフォルトの名無しさん:2010/06/11(金) 15:55:02
>>567
まあ、そう思うなら

区切り時間15分、夜間割り増し、深夜割り増し、早朝割り増し、休日割り増し、休憩(外出)時間分減算


こんくらいでいいから、どんだけすっきり書けるか、挑戦してみw
(余力があるなら、さらに休日の夜間深夜早朝とかも入れてね)

入力はタイムカードの時間記録4個ね(出社、退社、時間内出、入)

570デフォルトの名無しさん:2010/06/11(金) 16:15:40
>>567
平日の深夜早朝の手当は就業規則関係ないだろ。

>>569
休日の深夜早朝は法律には無いと思うので、
そういう就業規則があるところは羨ましいな。

やってみるとめんどくさいのがまともな勤怠表。
571デフォルトの名無しさん:2010/06/11(金) 17:40:30
Excelの自動計算機能を使ってもめんどくさいのに、VBAだと簡単にできると主張する不思議
572デフォルトの名無しさん:2010/06/11(金) 17:43:26
「完全に解決してる例」が見つからないのは、その手の奴は会社ごとに異なるから
汎用性のあるものを作るのはむずかしいし、自分の会社用の奴をごりごり作ったとしても
公開しないからじゃないの?
573デフォルトの名無しさん:2010/06/11(金) 17:47:52
>>562
逆にVBAじゃないと完全に解決できないと思う理由は何なの?
574デフォルトの名無しさん:2010/06/11(金) 18:29:45
そりゃVBAはなくてもできるだろうけど使った方がずっと簡単
俺なら迷わずVBAを使う
575デフォルトの名無しさん:2010/06/11(金) 19:56:22
>>571

エクセルの式は基本的に1行にまとめないといけないから複雑なことをするには向いてない
無理にやろうとすると大変な思いをする
大量の計算を1行に詰め込むのはプログラミング的にはクソの代表だしさw


VBAならそんな制約は無いし元々そういうややこしいことをするための物だから楽にできる
使える人にとってはね


使えない人がこれから覚えてでも楽かと問われれば微妙w
使えるようになるまでが大変だから(その人のセンスしだいってとこもあるけど)

576デフォルトの名無しさん:2010/06/11(金) 20:31:13
ワークシート関数では手間のかかることってのが

計算の途中経過を保存したり再利用すること
場合分けすること

だから、これらの処理が必要ならVBAを使った方がいい
計算式が独立してて一つ結果が出たらそれで終わりって場合はワークシート関数でやる
577デフォルトの名無しさん:2010/06/11(金) 20:32:34
ワークシート関数を激しく多重ネストして可読性を下げるくらいなら、
ユーザー定義関数をワークシートに張った方がずっと良いと思う。

マクロ有効にしたくない?知らんがな。
578デフォルトの名無しさん:2010/06/12(土) 01:40:11
>>573
それを俺に聞かれても困るがな。
579デフォルトの名無しさん:2010/06/12(土) 01:44:46
俺は勤務表のカレンダーをExcel関数で作ってきたけど、カレンダー作成マクロでも組んだ方が楽だよな。
Excel関数だと無駄な同じ式を30日分入れとかにゃならんし、休日判定なんかもめんどくさい。
580デフォルトの名無しさん:2010/06/12(土) 02:49:29
VBAでカレンダーを作る一番簡単な方法
ネットにアクセスしてYahooカレンダーからデータを抜き出す
祝日法が改正されてもYahooが潰れない限り全自動で対応できる
581デフォルトの名無しさん:2010/06/12(土) 03:14:36
休日は算出できんものな。
法律が出来ても変わるし、天ちゃんが死んでも変わる。
582デフォルトの名無しさん:2010/06/12(土) 03:51:21
VBAってなんて文書性の高い言語なんだといまさらながら感動
ワークシートコピー() とは
rは変数だよん
r に1を設定
ワークシート("日付データ")のセル(r,9)が""でない限り
ワークシート("原資")をワークシートコレクションの現在の個数番目の
ワークシートの後に複写,
現在のシートの名前をワークシート("日付データ")のセル(r,9)に書かれている
文字列に設定,
rにr+1を設定
以上繰り返し

エクセルの警告表示をオフに
ワークシート("原紙")を削除
pは文字列変数だよん
pにワークシート("日付データ")の範囲("A6:A6")の文字列を設定
nは文字列変数だよん
nにワークシート("日付データ")の範囲("A7:A7")の文字列を設定
現在のブックをp&"¥"&n&".xls"という名前で保存
エクセルを終了
わかった?
583デフォルトの名無しさん:2010/06/12(土) 06:20:35
エスパーに質問。
ほとんどのPCで1分程度で終わるマクロが、あるPCだけエラーは吐かないものの数時間待ってても返ってきません。
デバッグモードに入りどこで止まっているかを見ても無限ループに入っているわけではなさそうです。
PCのスペックは同等、エクセルとVBのバージョンも一緒です。
考えられる原因はなんでしょうか?

584デフォルトの名無しさん:2010/06/12(土) 08:14:52
>>580
WebAPIは基本ですよね。
585デフォルトの名無しさん:2010/06/12(土) 08:19:08
>>583
on error resume next でエラーループさせてるとか。
レジストリ書き換えが上手く行って無いとか。
iniの読み込みがいつまでもtrueにならないとか。

エラー吐かない、と書いてるならば on error resume next は入れて無いよね?
デバッグで止まっているなら、そこが問題なんじゃないか?
do loop 使ってる?

いかんせん情報が少なすぎる。
586デフォルトの名無しさん:2010/06/12(土) 09:15:00
Debug.Printまみれにしてやれ。
587デフォルトの名無しさん:2010/06/12(土) 09:51:46
当然ウイルス対策ソフト切って試してるんだろうな
588デフォルトの名無しさん:2010/06/12(土) 10:09:55
yahooのカレンダー取得せんでもアクセスカレンダーって使えなかったっけ
あれは祝日がないのか?
589デフォルトの名無しさん:2010/06/12(土) 13:40:59
>>584
Windowsのバージョンが変わった場合とか、そもそもMacが共通だとか、
環境によってはライブラリが無いとか、そういう制限て無いの?
590デフォルトの名無しさん:2010/06/12(土) 13:42:58
>>588
もう祝日は数年分の祝日リストをワークシートに書いといてそれを見るようにすればいいんじゃね?
配布が簡単なところがExcel開発の良いところだし。
591デフォルトの名無しさん:2010/06/12(土) 15:39:04
>>585
もうすこし詳細調べてみます
>>586
おk
592デフォルトの名無しさん:2010/06/12(土) 17:32:51
祝日法はアルゴリズムそのものだからなあ
多分フリーで最新の祝日反映されたカレンダー一覧がごろごろ堕ちてるだろ
593デフォルトの名無しさん:2010/06/12(土) 18:17:50
>>589
ほとんどがXML(or SGML)ファイルなので大丈夫と思うよ。
欠点はスキーマが統一化されてない事かな。
594デフォルトの名無しさん:2010/06/13(日) 11:10:35
事務職レベルなのですごく初歩的な質問します。

EXCELでもACCESSでもいいんですがVBAを書くとき、
ネットとか既存のシステム?からVBAを借用してきて、自分用に編集することってあります?
それとも、全部一から書きますか?
595デフォルトの名無しさん:2010/06/13(日) 11:59:23
>>594
ネットにあるサンプルを利用するのは凄く勉強になるけど、
必ず自分で手打ちする事が大切かな。

面倒かもしれないけど、コードを印刷して自分で手打ちするのと、
ただコピペして終わりにするのでは、大きな差があると思う。

自分の物にしたいなら、コード手打ちが良いよ。
もちろん1から組めるに越した事はないけどね。
596デフォルトの名無しさん:2010/06/13(日) 12:02:29
ライブラリならともかくコピーして編集って怖くね?
なんかものすごいバグが紛れ込みそうで不安
597デフォルトの名無しさん:2010/06/13(日) 12:06:22
>>596
VBAのライブラリ結局生ソースだろw
598デフォルトの名無しさん:2010/06/13(日) 12:09:38
メソッドの用法を調べて、後は自分で組めるレベルまで頑張るしかない。
599デフォルトの名無しさん:2010/06/13(日) 12:11:40
>>597
ライブラリとしてまとまってるクラスや関数を使うのと
実装をいじるのでは全然違うでしょ
600デフォルトの名無しさん:2010/06/13(日) 12:20:17
自分で作ったものだったら何をやってるか判ってるからそのまま流用っつーのはよくある。

ネットで拾った物は自分で、その部分のみをテストして納得したら
編集し直して使うのはある。
(変数名を自分がわかり易い名前にするとか
601デフォルトの名無しさん:2010/06/13(日) 12:24:10
プログラム書く癖ってあるじゃん。
定数化のルールとか、インデントの入れ方とか。
range("A1") で書く人もいれば、cells(1,1) で書く人もいる訳で。

そう考えると、やっぱり自分で書きなおした方が良いな。
602デフォルトの名無しさん:2010/06/13(日) 12:37:19
>>599
たいしてかわらん
そのまま使えるものをコピペしてくるなら
ライブラリだろうが、実装だろうが変わりないじゃん

アレンジがひつようなら、やっぱりかわらんじゃん
603デフォルトの名無しさん:2010/06/13(日) 12:41:12
レスありがとうございます。
今まで、会社で既存のものを流用したり、ネットから一部コピーや
本に書いてるのを打ち込んだりしてました。
知識不足のため、全部自分で考えてやると時間がかかり過ぎて・・・

でも、ちゃんと覚えていくしかないですね。
604デフォルトの名無しさん:2010/06/13(日) 12:42:46
あ、
>>603は594です。
605デフォルトの名無しさん:2010/06/13(日) 12:45:25
>>602
そのまま使えて、副作用もないコードならコピペでもいいかもね
でもまずは副作用がないことを確認して、アレンジするなら新しい副作用が出ないように書かないといけない
規模が小さければどうって事ないが、普通これは結構な手間になり、見逃せばバグにもなる
ライブラリはそういうことも実装する側が考えている(というか考えるべき)からその手間もリスクも少ない
606デフォルトの名無しさん:2010/06/13(日) 21:43:36
特殊なアドインを自動操作する方法を検討してます。
手動でやるときは、メニューバーから選択して、一連のキー入力をするだけなんですが、
vbaでこのような処理を自動化するにはどうすればよいでしょうか?

もちろん、本来はアドインのインタフェースを調べてそれを呼ぶべきなんでしょうが、
仕様がまったく不明なので、手動処理をなぞれないかと思っています。
607デフォルトの名無しさん:2010/06/13(日) 22:10:43
addinで定義されてるルーチンなり関数なりを呼び出せば良いだけでは?
608デフォルトの名無しさん:2010/06/14(月) 13:35:56
>>606
VBAじゃなくて、なんかの自動化ソフトを使ったら?
609デフォルトの名無しさん:2010/06/14(月) 14:31:38
なんで「調べてます」って書かないで「検討してます」とか書くんだろう
610デフォルトの名無しさん:2010/06/14(月) 14:47:14
>>606
決まった順番でキーを押すだけならSendKeysという命令があるけど
副作用も多いので使えるかどうかはよく検討する必要がある。
611デフォルトの名無しさん:2010/06/14(月) 16:20:40
アドイン自体を操作するのに使える?
612デフォルトの名無しさん:2010/06/14(月) 16:46:00
参照はAddFromFile
アドインもなんかなかったっけ
613デフォルトの名無しさん:2010/06/14(月) 16:53:05
あ、いやそういう意味じゃなくって、メニュー操作してアドインに制御がわたった後でも、
そのアドイン自体の操作をSendKeysでできるのかなってこと
614デフォルトの名無しさん:2010/06/14(月) 17:03:08
そのアドインが階層メニュー使ったり、ダイアログ表示したりする奴だったら、多分SnedKeysじゃ信頼性なくて
駄目だと思う。
615デフォルトの名無しさん:2010/06/15(火) 18:09:29
今このVBAをそのまま流用して改造してるんですが、
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_080.html

選んだ階層以下すべてのファイルを、特定のURLを先頭につけて抽出したいのですが、うまくいきません。

いじったのは以下のところだけですが、ファイルがある場所のみしか抽出されないのと、フルパスをうまく吐いてくれません。
(ファイルのあったディレクトリィだけ出る)

どこがまずいでしょうか。

' 現在フォルダをシート上に表示
g_cntPATH = g_cntPATH + 1 ' 参照フォルダ数を加算

FilePaths = "http://wwww.test.com" & FilePaths & "/" & objPATH.Name & "/"
' ■先ずサブフォルダを探索するループ処理
For Each objPATH2 In objPATH.SubFolders
' フォルダ単位のサブ処理(再帰呼び出し)
Call SEARCH_SUB_FOLDER(objPATH2, GYO, COL)
Next objPATH2
' ■本フォルダの各ファイルをシート上に表示するループ処理
COL = COL + 1 ' カラムを加算
For Each objFILE In objPATH.Files
g_cntFILE = g_cntFILE + 1 ' 参照ファイル数
GYO = GYO + 1 ' 行を加算
With objFILE
' ファイル名+(最終更新日時+ファイルサイズ)
Cells(GYO, COL).Font.ColorIndex = 1
Cells(GYO, COL).Value = FilePaths & .Name
If 25000 <= .Size Then
Cells(GYO, COL).Font.ColorIndex = 3
End If
616デフォルトの名無しさん:2010/06/16(水) 10:05:49
壊滅的に説明が下手なので、コード読む気にすらならない
617デフォルトの名無しさん:2010/06/16(水) 11:18:58
説明は普通に読めるぞ
ほるだのなかに
インデックス.html
ページ1.HTML
とかを見つけたら、
http://www.ほにゃらら/インデックス.HTML
って合成したいんだろう

コードは見てない
618デフォルトの名無しさん:2010/06/16(水) 12:22:10
>>615
本当にそこしかいじってないんなら、変数FilePathsが宣言も初期化もされていないから
フルパスが出るわけない
619デフォルトの名無しさん:2010/06/16(水) 14:50:43
> 選んだ階層以下すべてのファイルを、特定のURLを先頭につけて抽出したい
「抽出」の意味が不明。(コード見ればわかるかもしれんが)

> ファイルがある場所のみしか抽出されない
「ファイルがある場所」以外は、一体どこの何を抽出したいのか?
「選んだ階層以下すべてのファイル」が対象ではないのか。
620デフォルトの名無しさん:2010/06/16(水) 14:57:39
>>618
宣言はしてあります。
ただ、全部コピペすると書き込めなかったので・・・。

>>619
そうです。その通りです。
選んだフォルダの階層以下すべてのファイルのフルパスを、
エクセル上に書き出したいんです。
今のままだと、ファイルのあるフォルダしか書き出されない上に、
そのファイルのあるフォルダよりもっと上の階層がなぜか消えてしまってるんです。
621デフォルトの名無しさん:2010/06/16(水) 16:04:38
>>620
byval と byref を間違えてるに一票
622デフォルトの名無しさん:2010/06/16(水) 16:06:27
>>615
リンク踏んだけど、そもそもそのページが読む気失せる作りだわ
623デフォルトの名無しさん:2010/06/16(水) 17:23:07
>>615
暇だったのでやてみた

FilePaths をグローバルに宣言して

全体処理のほうにこれを書いて
FilePaths = "http://wwww.test.com/"

再帰のほうのこれを修正
FilePaths = "http://wwww.test.com" & FilePaths & "/" & objPATH.Name & "/"

FilePaths = FilePaths & objPATH.Name & "/"

で、カラム位置は別として、希望の文字列が得られてると思うが?
だめなら、元のソースが壊れてると思われ、コピペからヤリナオスベシ
624デフォルトの名無しさん:2010/06/16(水) 17:26:37
>>622
ページの作りはどうでも、書いてるコードの内容が全体的にヘタクソ杉。
よくあんなの公開できるもんだと感心する。
625デフォルトの名無しさん:2010/06/16(水) 17:29:22
参照を受け取るときにC++でいうconstみたいな指定子ってある?
626デフォルトの名無しさん:2010/06/16(水) 17:35:14
>>623
>>623
おっと、バグッテた

再帰のプロシージャの中で
dim tmp しといて

FilePaths = FilePaths & objPATH.Name & "/"
 ↓
tmp = FilePaths
FilePaths = FilePaths & objPATH.Name & "/"

出口で
FilePaths=tmp

これでいけるわ
627デフォルトの名無しさん:2010/06/16(水) 17:36:08
>>624
悪口しかいえないやつより100万倍まし
628デフォルトの名無しさん:2010/06/16(水) 17:45:15
>>625
c++を知らないvb使いとしては、参照を受け取るときのconstの意味がわからん
どういう動作なのか説明してくれたら、VBではこうだと言えるカモ
629デフォルトの名無しさん:2010/06/16(水) 17:53:47
>>628
例えば配列やクラスをディープコピーして渡すのはコストがかかるので参照で渡す
けど参照で渡したときに間違って書き込みをしたくない場合につけるセーフティみたいなもんです
ようするに読み取りだけできて書き込みはできない引数のことです
630デフォルトの名無しさん:2010/06/16(水) 17:58:39
>>626
あ〜そだ、グローバルで宣言したFailePathsを引きずり回してダサダサなので
ソースをかっこよくしたいなら、引数のほうに入れたほうがいいね
自分でやってね

631デフォルトの名無しさん:2010/06/16(水) 17:59:00
>>629
VBAにはそういう機能はない
632デフォルトの名無しさん:2010/06/16(水) 18:02:08
>>631
しょぼん・・・どうもでした
633デフォルトの名無しさん:2010/06/17(木) 15:48:05
>>626
ありがとうございました!
グローバル変数の存在を思いっきり忘れてました・・・。
634デフォルトの名無しさん:2010/06/18(金) 00:58:58
初心者で申し訳ありません

今A1からD10まで数字が埋まった表があります
このうちB1〜B10を選択し、コピー、F1〜F10に貼り付けするとします
このB1〜B10を選択するときに、直接"B1:B10""指定でなく、「表上の左から2列目、一番上から一番下までの範囲を選択」、
としたいのですが、どのように書けばよろしいのでしょうか?
表はいくつかあり、それぞれ縦のデータ数が10だったり15だったりまちまちなため、セル指定だと対応できないので困っています・・・
635デフォルトの名無しさん:2010/06/18(金) 01:31:16
>>634
「表上の左から2列目、一番上から一番下までの範囲を選択」
だと

途中に空白セルがないなら
Range(Cells(1, 2), Cells(1, 2).End(xlDown)).Select
とかする

個人的には好きではないけど
途中に空白セルがあった場合なんかは
Range(Cells(1, 2), Cells(65536, 2).End(xlUp)).Select
の方がいいかも
636デフォルトの名無しさん:2010/06/18(金) 01:45:50
>>634
B1からデータの入っているセル範囲を自動的に求めてコピー
Intersect(Range("B1").CurrentRegion, Range("B:B")).Copy
637デフォルトの名無しさん:2010/06/18(金) 02:55:16
もっと単純に、
Columns("B:B").Select とか
Columns(2).Select とかで良いんじゃ?

んで
Selection.Copy でコピーして
Columns("F:F").Select でF列選択
ActiveSheet.Paste ではりつけ

つかまずはマクロの記録
638デフォルトの名無しさん:2010/06/18(金) 15:23:29
>>636
こんなやり方初めて知った。
でも、空白セルがあるとそこで途切れてしまうから、結局>>635のほうがいいのかな。
65536って入力するより、rows.countのほうがいいだろうけど。
639デフォルトの名無しさん:2010/06/18(金) 16:22:57
B列全体をコピーしてもいいのかどうか。空白セルをコピーすると何かまずいことがあるのか。
途中に空白が入ってデータが飛び飛びになることはあるのか。

このあたりが条件として欲しいところだな。
それによって手間や方法が変わってくる。
640634:2010/06/18(金) 20:50:20
みなさんさまざまなアイディア、ありがとうございました

以下のように組むことで、一応目的達成することができました
ActiveCell.CurrentRegion.Select
Selection.Offset(0, 0).Columns(2).Copy
ActiveCell.Offset(0, 5).Select
ActiveSheet.Paste
641デフォルトの名無しさん:2010/06/18(金) 21:11:18
>>640
それでいいんなら1行にまとまるよ

ActiveCell.CurrentRegion.Columns(2).Copy Destination:=ActiveCell.Offset(0, 5)
642デフォルトの名無しさん:2010/06/18(金) 21:12:41
>>634
セレクトしてる意味がない

これで充分
Columns(2).Copy
Columns(2).Offset(0, 5).PasteSpecial
643デフォルトの名無しさん:2010/06/19(土) 23:28:29
zip 内のファイル一覧を取得したいのですが、
サンプルが見つからなくて何とか以下のようなものはできました。
どこか問題はないでしょうか?とくに item.GetFolder が正規のメソッドとして
存在するのかが気になっています。
また、Folder3、FolderItem2のリファレンスはありますでしょうか?

Option Explicit
Dim m_fso
Dim m_shell
Sub main()
  Set m_fso = CreateObject("Scripting.FileSystemObject")
  Set m_shell = CreateObject("Shell.Application")
  ZipList "c:\test.zip"
End Sub
Function ZipList(FileName As String)
  Dim folder
  Set folder = m_shell.Namespace("c:\test.zip")
  ZipListSub folder
End Function
Function ZipListSub(folder As Variant, Optional path As String = "")
  Dim item
  For Each item In folder.Items
    If item.IsFolder Then
      ZipListSub item.GetFolder, item.path & "/"
    Else
      Debug.Print path & item
    End If
  Next
End Function
644デフォルトの名無しさん:2010/06/20(日) 00:37:34
>>643
とりあえず、Shell.Application絡みのドキュメントはここ。
http://msdn.microsoft.com/en-us/library/bb773938(v=VS.85).aspx
FolderItem2はShellFolderItemとしてエイリアスされている。
Folder3のヘルプは見つからないな。
更に詳細が知りたければ、参照設定で「Microsoft Shell Controls And Automation」を足すと、
大本のタイプライブラリの内容が確認できる。Folder3は一応ここに出てくる。
WindowsSDK等に付属している「OLE/COM Object Viewer」で
「Type Libraries」-「Microsoft Shell Controls And Automation (Ver 1.0)」を表示させれば、
FolderItem2のエイリアスとかまで確認できるな。
645デフォルトの名無しさん:2010/06/20(日) 13:06:43
>>643
それ以前に.ZIPがShellで処理される保障はないと思うがそれはいいのか?

つかエクセル関係ないからスレ違い
テンプレなくなってるんだな
646デフォルトの名無しさん:2010/06/21(月) 16:48:15
zipがshellで処理されないOSって何?
647デフォルトの名無しさん:2010/06/21(月) 16:57:59
2000とか98,98SEとか
648デフォルトの名無しさん:2010/06/21(月) 18:29:27
>> 647
Windows 3.1+Excel 5.0の考慮も必要だね!
649デフォルトの名無しさん:2010/06/21(月) 20:57:02
Windows8とか
650デフォルトの名無しさん:2010/06/21(月) 21:38:02
>>643
× Set folder = m_shell.Namespace("c:\test.zip")
○ Set folder = m_shell.Namespace(FileName)
651643:2010/06/21(月) 23:37:34
>644

ありがとうございます。
残念ながら英語版しかないようですね。

>645
zipfldr.dllが解除されている場合とかでしょうか?

>650
テストしたのをそのままあげてしまいました。
そこですが、fso.GetAbsolutePathName で取得したものを
渡さないと時々取得できないことがあるようです。
原因はさっぱりわかりません。

652デフォルトの名無しさん:2010/06/22(火) 14:36:04
>そこですが、fso.GetAbsolutePathName で取得したものを
>渡さないと時々取得できないことがあるようです。
>原因はさっぱりわかりません。
なぜだろうね
653デフォルトの名無しさん:2010/06/22(火) 14:46:04
AbsolutePathNameじゃないからだろ
654デフォルトの名無しさん:2010/06/22(火) 17:02:02
>>652
どっかいけ、アホ
655デフォルトの名無しさん:2010/06/22(火) 22:46:43
Stringで渡すとだめで、VariantならOKのようです。
656デフォルトの名無しさん:2010/06/22(火) 23:17:45
Set folder = m_shell.Namespace((FileName))
657デフォルトの名無しさん:2010/06/22(火) 23:35:53
それは意味ない
658デフォルトの名無しさん:2010/06/23(水) 19:22:11
意味あったけど
659デフォルトの名無しさん:2010/06/24(木) 19:49:57
初心者なんですが、皆さんの力を貸してください。
下記で困ってます。orz

【実現したいこと】
ワークシートにグラフを追加し
グラフのX軸の目盛位置(wkChart.Axes(xlCategory).Left)ピッタリに四角シェイプを配置したい。
配置先は、グラフ内ではなくワークシート上。

【多分必要だと思うこと】
グラフ内の座標から、ワークシートの座標に変換する必要がある?

【試したこと】
グラフ内の座標==ワークシート上の座標でシェイプを追加したにもかかわらず
見た目上ズレている。

【コード】
'チャート内に四角シェイプを追加して選択
wkChart.Shapes.AddShape(msoShapeRectangle, 30, 100, 20, 30).Select

'ワークシート上に四角シェイプを追加して選択
ActiveSheet.Shapes.AddShape(msoShapeRectangle, 30, 100, 20, 30).Select
660デフォルトの名無しさん:2010/06/25(金) 18:42:58
APIで座標を調べるのがあったな。
661デフォルトの名無しさん:2010/06/25(金) 22:56:29
>>659
グラフ内の座標ってChart自体の (0, 0) から始まるわけじゃなかったような気がするけど、ひょっとしてそのこと?

wkChart.Shapes.AddShape(msoShapeRectangle, 30-wkChart.ChartArea.Left, 100-wkChart.ChartAreaTop, 20, 30).Select
ActiveSheet.Shapes.AddShape(msoShapeRectangle, 30, 100, 20, 30).Select
662デフォルトの名無しさん:2010/06/26(土) 23:30:08
>>659
A1セルの大きさが基準になる。手順は以下。これで、(10,10)セルにグラフを移動とか出来る。
但し、全セルが同じ大きさであることが重要。
詳細は忘れたから調べてwww

@A1セルの大きさを変更 or 全セルの大きさを整える
AA1セルの縦横サイズを取得
B座標位置(左上位置になる)を指定する
663662:2010/06/26(土) 23:33:24
すまん。グラフの位置決めのことで、チャート内ではない。
まじすまそ
664デフォルトの名無しさん:2010/06/27(日) 01:30:22
正規表現で置換するだけの処理なんですが上手くいきません
ご教授願います

Sub sample01()
Dim re As Object, n As Object
Dim Match As Object, Matches As Object

Dim Val As Variant '配列
Dim i As Integer 'カウンタ

Val = Worksheets("Sheet1").Range("A1:A5").Value

Set re = CreateObject("VBScript.RegExp")

For i = 1 To 5 Step 1
MsgBox "対象セルの文字列は" & "【" & Val(i, 1) & "】"

re.Pattern = "\d{1}" '検索する正規表現パターン
re.Global = True '検索範囲はグローバル
re.IgnoreCase = True '大文字・小文字を区別する
Set Matches = re.Execute(Val(i, 1))

'■HITしたらああああに置換↓ここが上手く動いてくれない■
Val(i, 1) = re.Replace(Val(i, 1), "ああああ" & i)

'Set re = Nothing
Next i

MsgBox i - 1 & "件マッチ!"
End Sub
665デフォルトの名無しさん:2010/06/27(日) 02:03:45
>>664
動いてますよ?

もしかして、ワークシートに書き込みたいのなら
Range("A1:A5") = Val
を最後に足しとけばOKかと
666664:2010/06/27(日) 02:07:06
>>664だけでは説明不足だったので付け加えます
ソースの置換処理内容だけ見るとわざわざVBAでやる必要ない感じですが
実際は複雑な正規表現処理を入れる予定です

上記ソースよりも簡単に指定したセルを正規表現で置換できる処理がありましたら、
合わせてご教授頂ければと思います
667デフォルトの名無しさん:2010/06/27(日) 02:24:08
>>665
おっしゃる通りでした
Range("A1:A5").Value = Val
でワークシートに置換した値が入りました

ありがとうございました!
668デフォルトの名無しさん:2010/06/27(日) 09:36:01
所で、forのループ外で宣言している re をループ内で開放しちゃってるけど大丈夫?
669デフォルトの名無しさん:2010/06/27(日) 10:12:08
あ、コメントアウトされてたのね。

老婆心ながら、setしたobject型変数は最後に開放しておいた方がいいよ。
end subのすぐ前でOK。
670デフォルトの名無しさん:2010/06/27(日) 14:23:54
>>老婆心ながら、setしたobject型変数は最後に開放しておいた方がいいよ。
なんで? 不要だろ
671デフォルトの名無しさん:2010/06/27(日) 14:25:52
ここから先しばらく不毛な論争が続きますので質問者の方は無視してくださいな

672664:2010/06/27(日) 15:51:40
Set re = Nothingを入れる事でメモリ解放するって事ですかね?

個人的にはそんな事より"A1:A5"の範囲ならまだしも
セル範囲が増えた場合オーバーフローしないか心配です
何か良い方法ないですかねぇ
配列を使わずにセル範囲を一つ一つループで置換orスルーできるような処理があれば1番なんですが
673デフォルトの名無しさん:2010/06/27(日) 15:55:12
>>669
完全に不要。
あと、解放、な。
674デフォルトの名無しさん:2010/06/27(日) 15:56:56
>>672
何がどうオーバーフローするんだ?
675デフォルトの名無しさん:2010/06/27(日) 16:06:12
Nothing入れないと自動変数の領域がキャッシュされてるため
いつまでもオブジェクトが削除されないとかVB.netで聞いた事ある
676デフォルトの名無しさん:2010/06/27(日) 16:12:26
.NETからExcelを操作した時のアウトプロセス解放関連の話と
勘違いしている予感。
677デフォルトの名無しさん:2010/06/27(日) 16:23:59
COMのGCって参照カウンタでしょ。
それに反しなければわざわざリリースなんて要らん。
678672:2010/06/27(日) 16:26:01
>>674
ちょっとまだ試行中なのですが、例えば配列数を膨大な数にした場合や
各配列内のデータ(取得したセルの値)、文字数が多い場合等です

Variant型を超える事はないと思ってはいますが、
少し今のやり方だと心配なんですよね
679デフォルトの名無しさん:2010/06/27(日) 16:41:37
>>675
キャッシュ(笑)
VB.net(笑)
適当なこと言ってんなハゲ
680デフォルトの名無しさん:2010/06/27(日) 17:51:36
「行儀が悪い」

これならどうだ
681デフォルトの名無しさん:2010/06/27(日) 18:46:33
煽りとかでは無くて純粋に教えてほしいんだけど、
setした物はnothingにして終わらせる、って教わったんだ。

当時聞いた話では、メモリを占有し続けるからって感じで納得してたんだけど、
これは嘘なのかな?

マナーとしてnothingを代入してやるのか、それとも技術的な理由があるのか、それが知りたい。
nothing入れてやる必要が無いなら、余計なコード書きたくないし、教えてください。
682デフォルトの名無しさん:2010/06/27(日) 19:41:25
>メモリを占有し続けるから

これは嘘ではない
683デフォルトの名無しさん:2010/06/27(日) 19:49:31
nothingを代入しなくて、その変数が生きていれば、メモリが開放されることはない
nothingを代入しても、そのメモリがいつ開放されるかは定かではない
nothingを代入しなくても、その変数が無効になれば、その領域は自動的に開放される

原則はこういうこと
昔は使い終わったらすぐにnothing代入して、開放可能にしましょうってのが主流だった
今は特殊なオブジェクトでもない限り、あんまり気にしなくていいと思うぞ
684デフォルトの名無しさん:2010/06/27(日) 19:57:09
テンプレに書いてくれ
無駄なもの
最後にnothing
最後にerase
とか
他にもあるんだろうけど
685デフォルトの名無しさん:2010/06/27(日) 20:09:26
>>682-683
ありがとう。
俺、後輩にいつもnothingで終わらせろって言ってた・・・。
先輩の指導を鵜呑みにして、自分で調べなかったのが凄く恥ずかしい。
nothing忘れると、先輩が口を酸っぱくして指摘してたんで、そうと信じてた。

>nothingを代入しなくても、その変数が無効になれば、その領域は自動的に開放される
VBAの場合はend subを通った時点でdimが無効になるから、基本的にはset nothingいらないのかぁ・・・。

本当にありがとう。
686デフォルトの名無しさん:2010/06/27(日) 20:53:29
SQLServerのJOBにActiveXスクリプト書くときは
Nothingしないと警告でるよ
687デフォルトの名無しさん:2010/06/27(日) 21:21:13
そういや、fjのmalloc/free論争はどう決着したんだっけなあ
688デフォルトの名無しさん:2010/06/27(日) 21:38:02
>>685
俺は無駄なNothing代入はいらない派だが、またそうやって人の言うこと鵜呑みにするなよ?
VBAは参照カウント方式だから、参照がなくなった時点で自動的に解放されるが、
循環参照(オブジェクトAとBがお互いの参照を保持しちゃってるような場合)があるときは
明示的に解放してやらないとメモリリークする
とりあえずNothingで終わらせておけば問題は発生しないし思考停止できる、というのも一つの考え方ではある
689デフォルトの名無しさん:2010/06/27(日) 23:43:38
俺も無駄なNothing代入はいらない派だが
>>688
メモリリークといっても、エクセルの使用メモリが増えていくだけで
エクセルを終了させれば開放される

>Nothingで終わらせておけば問題は発生しないし思考停止できる
ちなみに変数をNothingにしてもメモリリークは防げないこともある

Sub test()
    Set x = CreateObject("Scripting.Dictionary")
    Set y = CreateObject("Scripting.Dictionary")
    Call x.Add("y", y)
    Call y.Add("x", x)
    Set x = Nothing
    Set y = Nothing
End Sub

このプロシジャ呼ぶとちょっとずつメモリ使用量が増加していくぞ
690デフォルトの名無しさん:2010/06/28(月) 00:31:57
だからさあ、いらないって言うやつは自分が作るときに使わなきゃいい
いるってやつは自分が作るときに使えばいい
わざわざ他人のコーディングを否定すんなよクズども
いい加減この無限ループやめろっての



ここまでテンプレ
691デフォルトの名無しさん:2010/06/28(月) 01:10:01
質問スレだから
質問されたら答えるだけ
間違いを教えていいわけない
結論はどっちでもいいと答えるのかもしれないけど
692デフォルトの名無しさん:2010/06/28(月) 09:06:38
全角英数字を半角英数字にする関数ってありますか?
Case文で全文字毎に置換するしかないですかね?
693デフォルトの名無しさん:2010/06/28(月) 09:34:12
>>692
つ素寅昆布
694デフォルトの名無しさん:2010/06/28(月) 09:34:31
はいいえ
695デフォルトの名無しさん:2010/06/28(月) 11:02:28
>>693
まんこの中見る器具!
696デフォルトの名無しさん:2010/06/28(月) 11:40:42
>>692
記号もカナも、半角に変換できる文字は全部変換してもいいんならStrconv
英数以外は変換したくないんなら1文字ずつやるしかない
697デフォルトの名無しさん:2010/06/28(月) 15:54:16
相互参照になった場合は?
698デフォルトの名無しさん:2010/06/28(月) 17:29:18
>>696
つ性器豹源
699デフォルトの名無しさん:2010/06/28(月) 19:45:41
二つの文字列で変換テーブルを構成して、
一文字ずつInStrで評価、ってのが定番か。
700デフォルトの名無しさん:2010/06/28(月) 20:28:34
一文字ずつifで回せばいいんでない?
701692:2010/06/28(月) 21:05:33
>>696
なるほど、文字列内に全角記号や全角カタカナもあるので一文字ずつの処理になりそうです

文字列に規則性がないので正規表現も微妙です

一度全てストラコンブで半角にしてから一文字ずつ半角カタカナの文字コードを
全角カタカナの文字コードに置換するのが早いのかなぁ
702デフォルトの名無しさん:2010/06/28(月) 21:14:02
素寅昆布 w
703デフォルトの名無しさん:2010/06/28(月) 22:06:57
頭悪そうだから止めようぜ
昭和の屋ンキーみたいだ
704デフォルトの名無しさん:2010/06/28(月) 23:24:29
>>701
1文字ずつやるとしても、文字コード使って判定させるよりは、
正規表現で判定させた方が楽でない?

1文字ずつ別の変数に格納していくルーチンで良いような気がする。
705デフォルトの名無しさん:2010/06/29(火) 02:34:43
1文字ずつループで回して、0-9a-zA-Zで文字の範囲を判定してからStrConv
706デフォルトの名無しさん:2010/06/29(火) 02:40:12
案ずるより産むが易し

For i = 1 To Len(str1)
  c = Mid(str1, i, 1)
  If "0" <= c And c <= "9" Or "a" <= c And c <= "z" Or "A" <= c And c <= "Z" Then Mid(str1, i, 1) = StrConv(c, vbNarrow)
Next
707デフォルトの名無しさん:2010/06/29(火) 08:56:46
>>706
文字列にイコール以外の比較演算子が使えるのは盲点でした
比較演算子の部分を正規表現でスマートにしてもいけそうですね
ありがとうございました
708デフォルトの名無しさん:2010/06/29(火) 11:35:22
教えてください。
以下のソースは、VBで書かれた、ネットワーク上のIPアドレスに対して、データ送受信をするものです。
これをExcel VBAで行うことはできるものでしょうか?
Excel VBA自身はちょくちょくやっているのですが、
ネットワーク関係はやったことがなくて、
VBならVBAでもできないかな?という安易な発想で質問をしています(すみません)
宜しくお願いします。

VBのソース(関係ない部分は削除しましたので、このままでは動きません)
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Text

Public Class Form1  ' 特にクラスを使わなくても良いです。
Private Sub sendcmd(ByVal ipstring As String, ByVal Rcmd As Byte・・・・
Dim Xpsocket As Socket
Dim xpstream As NetworkStream
Dim Binwriter As BinaryWriter
Dim Binreader As BinaryReader

Xpsocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Xpsocket.Connect(ipstring, 30704)
xpstream = New NetworkStream(Xpsocket)
Binwriter = New BinaryWriter(xpstream)
Binreader = New BinaryReader(xpstream)
Binwriter.Write(Sdat)
Binwriter.Flush()
Xpsocket.Close()
End Sub
End Class
709デフォルトの名無しさん:2010/06/29(火) 12:00:27
できる
710デフォルトの名無しさん:2010/06/29(火) 12:38:04
出来る
711デフォルトの名無しさん:2010/06/29(火) 12:40:40
わからん_| ̄|○
712デフォルトの名無しさん:2010/06/29(火) 12:55:34
出来る
713デフォルトの名無しさん:2010/06/29(火) 14:01:26
みなさん、ありがとうございました。なんか出来そうな感じで嬉しいです。

その後の調べで、「VB6のランタイムライブラリ」が必要 と言う情報を得ました。
私は、パソコン詳しくないし、VBは持っていないのでわからないのですが、
VB6のランタイムライブラリというのは、たぶんライブラリファイルですよね。
これはVB6を買わないといけない物なのでしょうか?
それとも、コピーしても違法じゃないよ、というものなのでしょうか?

ちなみにVB6って、売ってないんでしょうか。探しても見あたらないんです。
714デフォルトの名無しさん:2010/06/29(火) 14:17:33
ランタイムライブラリというのはコピーしても違法じゃないよ

>VB6のランタイムライブラリというのは、たぶんライブラリファイルですよね。

どっちかというと違う
715デフォルトの名無しさん:2010/06/29(火) 14:36:02
教えてください
XP + EXCEL 2000

長文のVBAをいじっていたら、formula bar と
heading欄(A B C D ...)の間に

  =============日
    ・
 E   F    G    H (heading欄)

上記(1)のようなオブジェクトがあらわれました。
日のなかの-(マイナス)をクリックすると
F欄が隠れて

    田

E   G    H

となります。+をクリックすると(1)に戻ります。

この動作をマクロで録ろうとしましたが記録できません。

このオブジェクトの消し方と、現しかたを教えてください。
716デフォルトの名無しさん:2010/06/29(火) 15:00:54
>>714
いや、合ってるだろ
717デフォルトの名無しさん:2010/06/29(火) 17:37:57
>>715にちょいと便乗。

きっと、グループ化のことだと思われる。
単純に機能として削除したいのなら、「データ」→「グループとアウトラインの設定」で設定できる。

マクロは全てを解除する方法しかわからん。
シート内の2番目のグループのみを開くっていう方法あったら誰か教えてください。
718717:2010/06/29(火) 17:58:08
ちなみに、グループ化解除は
Selection.ClearOutline
もしくは、Range(範囲).Ungroupでできる。

開く、閉じるっていう動作がわからんです。
719デフォルトの名無しさん:2010/06/29(火) 18:33:54
失礼します。range型変数にsetする際の挙動について教えてください。

Sub test()
Dim WB1 As Workbook
Dim WB2 As Workbook
Dim Rng1 As Range
Dim Rng2 As Range

Set WB1 = Workbooks.Open("c:\book1.xls")
Set WB2 = Workbooks.Open("c:\book1.xls")

'WB1.Activate 'アクティブにするとsetでエラー出ない
'Set Rng1 = WB1.Sheets(1).Cells(1, 1) 'Cells(1,1)ならエラー出ない

Set Rng1 = WB1.Sheets(1).Range(Cells(1, 1), Cells(3, 3))
Set Rng2 = WB2.Sheets(1).Cells(1, 1)
End Sub

このようなコードで、開いたブックのrangeをsetしようとしているのですが、
range(cells(1,1),cells(3,3))の時は、対象のブックをアクティブにしないとエラーが出ます。
rangeを使わず、cells(1,1) のみであれば、アクティブじゃなくてもきちんとset出来ます。

rangeを使って指定する場合だけアクティブである必要があるのでしょうか?
ヘルプを見ても分からなかったので、教えてくださいませ。
よろしくお願いします。

720デフォルトの名無しさん:2010/06/29(火) 20:28:32
>>719
Cellsの前になにもつけなければActiveSheetに対しての意味になる
 Cells(1, 1) と ActiveSheet.Cells(1, 1) は同じ

Set Rng1 = WB1.Sheets(1).Range(WB1.Sheets(1).Cells(1, 1), WB1.Sheets(1).Cells(3, 3))
とすべし

長くしたくなければ
With WB1.Sheets(1)
Set Rng1 = .Range(.Cells(1, 1), .Cells(3, 3))
End With



Set WS1 = WB1.Sheets(1)
Set Rng1 = WS1.Range(WS1.Cells(1, 1), WS1.Cells(3, 3))
721デフォルトの名無しさん:2010/06/29(火) 22:58:42
>>720
ああ、ActiveSheetが規定値と言うイメージなのですか。
これですっきりしました。
やはり、Activeにして実行すべき物だったんですね。

本当にありがとうございました。
722デフォルトの名無しさん:2010/06/29(火) 23:16:12
>Activeにして実行すべき物だったんですね。
違うだろ
スクリプトで記述するときはActiveSheetなどに依存せず、処理の対象を明に指定しとけってことだろ
723720:2010/06/30(水) 00:17:16
>>721
>Activeにして実行すべき物だったんですね。
ちがう

そもそものエラーの原因は
WB1.Sheets(1)のセル範囲(Range)指定に他のシート(ブック)のセルを使ってしまうからエラーになった

シート(ブック)を"明示したもの"と"指定しないもの"を 混在してしまうとエラーの原因になる
また今回のような他のシート(ブック)を扱う処理となると
ActiveSheetに依存してしまうとやはりエラーの原因になりうる

と言う事で
Set Rng1 = WB1.Sheets(1).Range(WB1.Sheets(1).Cells(1, 1), WB1.Sheets(1).Cells(3, 3))
と示したように
 WB1.Sheets(1) の Range(....
 WB1.Sheets(1) の Cells(....
という風に全てどこのシート(ブック)かを明示した方がよいと言う事
724デフォルトの名無しさん:2010/06/30(水) 02:33:48
Excel VBAのテキストエディタの
TABをタイプしても、4スペースになってしまうのですが、
TABはTABとして保持するように設定出来ないでしょうか?
725デフォルトの名無しさん:2010/06/30(水) 02:47:29
>>724
無理
726デフォルトの名無しさん:2010/06/30(水) 09:11:19
VBの設定で2文字にするか
タブコードを2文字に置き換えるか
727デフォルトの名無しさん:2010/07/01(木) 12:44:53
セルの範囲をString型変数に入れて利用する事が出来ないのですが、仕様何でしょうか?


Dim targetCell As String
targetCell = "Cells(8,1),Cells(30,83)"
Worksheets("Sheet1").Range(targetCell).Value = "マムコ"
728デフォルトの名無しさん:2010/07/01(木) 12:58:51
>>727
君は普段Excelで数式書くときもCells(8,1)なんて書いてるの?
729デフォルトの名無しさん:2010/07/01(木) 13:12:56
セル範囲って種類のバリアントですので仕様です
730727:2010/07/01(木) 13:13:50
>>728
ワークシートのセル上で他のセルを参照する時は(A8)等ですね
731デフォルトの名無しさん:2010/07/01(木) 13:16:58
>>730
じゃあtargetCell = "A8"って書けばいいんじゃないの??
"R8C1"でもいいけど。
732デフォルトの名無しさん:2010/07/01(木) 14:02:20
>>731
え?
733デフォルトの名無しさん:2010/07/01(木) 17:35:44
よろしくお願いします。
記号の評価・比較って、コツがあるのでしょうか?

前方一致をしたいのですが、以下で失敗します。
記号で開始するのは失敗する「##」で始まるものだけで、
英語・数字・日本語の比較は正常に行えます。
記号を利用する場合、何か特別な処理が必要なのでしょうか?
フィルタオプションでも、##から始まる文字列を取得することはできませんでした。

dim Str1,Str2 as string

Str1 = "##TTT*"
Str2 = "##TTTAAABBB"

If Str2 Like Str1 Then
MsgBox ("前方一致しています")
end if
734デフォルトの名無しさん:2010/07/01(木) 17:47:59
どうでもいいけど、Str1ってVariantになってない?

記号についてはコツとかではなく
Like演算子のヘルプ開けば分かるでしょ。
LikeにカーソルあわせてF1押しなさい。
735デフォルトの名無しさん:2010/07/01(木) 18:05:03
regexp使うのも良し
736デフォルトの名無しさん:2010/07/01(木) 18:15:41
>>733
ヘルプ読んだ?

Str1 = "[##TTT]*"
737デフォルトの名無しさん:2010/07/01(木) 20:43:10
>>729
なるほどCells自体が関数だからString型で呼び出せないんですね
つまり
Dim targetCellStart As String
Dim targetCellEnd As String
targetCellStart = "8,1"
targetCellEnd = "30,83"

'下のような指定の仕方なら可能って事ですね?
'Range.Cells(targetCellStart),Cells(targetCellEnd)="マムコ"


>>731
英字のセル指定を使わずに数字で指定したい理由は
その数字を利用してFOR文のカウンタを生成したいからです
英字から数字に変換するのが手間なので…
因みにわざわざ変数にしたい理由は、この座標がユーザサイドで指定できるようにする為です
738デフォルトの名無しさん:2010/07/01(木) 21:31:12
>>717, 718
ありがとうございます。
「データ」→「グループとアウトラインの設定」→ Clear Outline
で解消しました。

Shape オブジェクトのグループ化を何度も行うマクロをいじっていたので

すが、マクロのミスで列がグループ化されたということでしょうか・・・
739デフォルトの名無しさん:2010/07/01(木) 22:06:31
>>733
YOU、正規表現使っちゃいなYO!
740デフォルトの名無しさん:2010/07/01(木) 23:17:41
>>737
横から失礼します
実行してみた? 希望した結果にならないと思うけど

>英字から数字に変換するのが手間なので…
そんなに手間かな
  targetCellStart = "A8"
  Target_row = Range(targetCellStart).Row
  Target_col = Range(targetCellStart).Column
で変換できるけど

>英字のセル指定を使わずに数字で指定したい理由は
>その数字を利用してFOR文のカウンタを生成したいからです

指定した範囲に対して一セルづつ処理したいなら
 targetCellStart = "A8"
 targetCellEnd = "CE30"
 For Each TargetCell In Range(targetCellStart, targetCellEnd)
  '処理
 Next
ってのもできるよ
741740:2010/07/01(木) 23:25:44
補足
変数TargetCell は

 Dim TargetCell As Range
742デフォルトの名無しさん:2010/07/02(金) 05:30:02
>>737
英字から数字とか変なこと言うと思ったから、
R1C1形式も書いておいたのに…。
743733 :2010/07/02(金) 12:15:27
733です。

皆さんどうもありがとうございました。#はワイルドカードだったのですね。。

リストは社内にあるPCから集めたアプリケーション名で配列なのですが、
今回は#を置換して、Str1 = "[#][#]TTT*"とすることにしました。
データ内にどんな記号がいくつあるかも不定なので、?や*についても処理しておきたいと思います。

正規表現についても、時間を見て勉強したいと思います。
744デフォルトの名無しさん:2010/07/02(金) 13:08:44
>>740
一セルづつ処理をする部分で、どうやったら
そのセルの中身を取得できますか?

 Dim TargetCell As Range

 targetCellStart = "A8"
 targetCellEnd = "CE30"
 For Each TargetCell In Range(targetCellStart, targetCellEnd)
  '処理
 Next

745デフォルトの名無しさん:2010/07/02(金) 15:16:34
>>744
つ ローカルウィンドゥ










.Value
746デフォルトの名無しさん:2010/07/02(金) 17:15:10
デフォルトプロパティで.valueすらいらないな
747デフォルトの名無しさん:2010/07/02(金) 19:59:24
>>740
range型変数なのにsetしなくても良いの?
A1形式だと大丈夫とか?
良く分からないんで教えてほしいの。
748デフォルトの名無しさん:2010/07/02(金) 20:00:06
デフォルトプロパティは省略しない。
それが俺の流儀だーーーー!!!
749740:2010/07/02(金) 20:20:53
>>744
For Each を Excelのヘルプで調べてみよう(ぐぐってもいいけど)
>>747
上に同じ
750デフォルトの名無しさん:2010/07/02(金) 23:08:05
初心者で申し訳ありません、たとえば
A1〜A200に商品Aを作るための材料がそれぞれ記入、
B1〜B150に商品Bを作るための材料がそれぞれ記入されたデータがあります
商品A,Bの材料の中には共通するものがあり、それらを抜き出したいのです・・・

現段階で
@A1〜A200を切り取って、B150の下に貼り付け
AC1に=countif(C$1;C&350,C1)を入力させて、それをC350までオートフィル
Bオートフィルター使って、Aのcountifが"2"の値のやつだけ抜き出し、コピーしてD行に貼り付け
CD行について、advancedfilter使ってunique:=trueを指定し、重複したデータを一つとして扱ってE行に貼り付け
というのを作ったのですが、処理が多すぎて?非常に重く使い物になりません・・・

どなたかいいアイディアなどお持ちでないでしょうか?
751デフォルトの名無しさん:2010/07/02(金) 23:09:39
すみません、Aは=countif(C$1;C$350,C1)です
752デフォルトの名無しさん:2010/07/02(金) 23:48:52
>750
set d = createobject("Scripting.Dictionary")
for i = 1 to 200
 d(cells(i,1).value) = 1
next i

j = 1
for i = 1 to 150
 if d.exists(cells(i,2).value) then
  cells(j,3) = cells(i,2).value
  j = j + 1
 end if
next i
753デフォルトの名無しさん:2010/07/02(金) 23:52:31
>>750
VBAじゃないきがするけどこんなんいかが?
どこまで軽くなるかしらないけどね

@C1に =IF(ISNA(MATCH(B1,$A$1:$A$200,0)),0,1) を入力させて、それをC150までオートフィル
Aオートフィルター使って、C列が"1"の値のB列だけ抜き出し、コピーしてD行に貼り付け

考え方として B列の材料と同じ材料がA列にあるかどうか判定すれぱいいんだから
(もちろんその逆でもいいけど)
754デフォルトの名無しさん:2010/07/02(金) 23:56:16
(1)(4)しなくてもC1〜C150に=COUNTIF($A$1:$A$200,$B1)をオートフィルで
1のを抽出でいいんじゃない?
755デフォルトの名無しさん:2010/07/03(土) 00:18:37
全然VBAじゃないけど、ソートして空きセルに1つ上と同じかどうかの式を入れて
TRUEなもの抜き出すだけでは
756750:2010/07/03(土) 00:45:43
みなさんさまざまなお力添えありがとうございます
実際のデータはA1〜A10000やB1〜B20000などと桁数のずっと多いもので・・・
できたらcountifの記入やautofilterを使わないようなやり方があるといいのですが
757デフォルトの名無しさん:2010/07/03(土) 00:52:40
>>756
効率でいえば>752がベスト
758デフォルトの名無しさん:2010/07/03(土) 00:58:51
そんなに件数あるんなら DAO 使ってSQLで抽出した方が早いのでは
759デフォルトの名無しさん:2010/07/03(土) 01:23:17
A1〜A10000に商品Aのデータ
B10001〜B20000に商品Bのデータ
C列に=A1+B1と入れてC列でソート
この方法なら一瞬でできる
760750:2010/07/03(土) 03:00:21
>>752さんのプログラム使うと本当にあっという間に計算できました

set d = createobject("Scripting.Dictionary")
for i = 1 to 200
 d(cells(i,1).value) = 1
next i

j = 1
for i = 1 to 150
 if d.exists(cells(i,2).value) then
  cells(j,3) = cells(i,2).value
  j = j + 1
 end if
next i


上記のcells(i,1)やcells(i,2)の1や2を変数に変えて、A行ーB行以外でも任意の二行で行えるようにしたいのですが
Dim myrows As Integer
Dim myrows2 as integer
myrows = selection.rows
myrows2 = selection.offset(0,1).rows
の様に変数を宣言しても(?)、cells(i,myrows)やcells(i,myrows)の様には使えないようです
無知で申し訳ありません、もしよろしかったらご指導願えないでしょうか・・・?
761デフォルトの名無しさん:2010/07/03(土) 07:21:09
まず金輪際特別な理由がない限りIntegerを使うのを辞めなさい。
遅い上に最近のExcelだと行数すら桁あふれで格納できません。
代わりにLongを使いましょう。
762デフォルトの名無しさん:2010/07/03(土) 07:34:38
>>760
myrows = Selection.Row
myrows2 = myrows + 1
763デフォルトの名無しさん:2010/07/03(土) 09:47:43
列数に使用するカウンタ変数をintegerで宣言してるな、俺。
764デフォルトの名無しさん:2010/07/03(土) 11:34:07
Excelっていまでも
最大255列65535行
じゃないのかな
765デフォルトの名無しさん:2010/07/03(土) 12:18:49
どゆこと?
2007は16384列1048576行だよ
766デフォルトの名無しさん:2010/07/03(土) 12:29:53
Excelっていまでも
最大255列65535行
じゃないのかな
767デフォルトの名無しさん:2010/07/03(土) 12:34:55
VBAのデバッガでウォッチ式に変数を指定してオブジェクトの中身を見ようとしたとき
コンテナの要素数が一定数以上だとツリーに現れないみたいなのですが
全要素を見たい場合どこでデバッガの設定を変更すればよいですか?
768750:2010/07/03(土) 13:03:28
みなさんご迷惑お掛けしました
>>760で動かなかったのは、私がrowとcolumnを間違えていたからでした
以下の様に書き換えたところ、無事動かすことができました
本当にありがとうございました!

Sub 共通材料抜き出し()

Dim myrow As Long, myrow2 As Long, myrow3 As Long
Dim mycolumn As Long, mycolumn2 As Long, mycolumn3 As Long

myrow = Selection.Row
myrow2 = Selection.End(xlDown).Row
myrow3 = Selection.Offset(0, 1).End(xlDown).Row
mycolumn = Selection.Column
mycolumn2 = mycolumn + 1
mycolumn3 = mycolumn + 2

Set mydictionary = CreateObject("Scripting.Dictionary")

For i = myrow To myrow2
mydictionary(Cells(i, mycolumn).Value) = 1
Next i

j = myrow
For i = myrow To myrow3
If mydictionary.exists(Cells(i, mycolumn2).Value) Then
Cells(j, mycolumn3) = Cells(i, mycolumn2).Value
j = j + 1
End If
Next i
End Sub
769デフォルトの名無しさん:2010/07/04(日) 11:35:28
いまだに、range型変数をsetしないで良い原理が分からない。
770デフォルトの名無しさん:2010/07/04(日) 12:22:05
>>769
For Each のインデックス変数 のどこで SET を使えと?
771デフォルトの名無しさん:2010/07/04(日) 12:58:00
>>769
Excelヘルプ VBAリファレンスより抜粋

   For Each...Next ステートメント
   配列やコレクションの各要素に対して、
   一連のステートメントを繰り返し実行するフロー制御ステートメントです。

   次の方法は Range プロパティで返されるセルのコレクションと
   For Each...Next ループを組み合わせて操作します。
   For Each...Next ループでは、ループで繰り返されるたびに、
   オブジェクト型変数に次のセルが自動的に設定されます。
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
772デフォルトの名無しさん:2010/07/04(日) 13:33:13
Setなんてデフォルトプロパティのために
生まれた単なる代入時に出現する歪だから
必要のない部分では文法的に削れてて当然。
773デフォルトの名無しさん:2010/07/04(日) 19:44:53
>>744

 targetCellStart = "A8"
 targetCellEnd = "CE30"

で、range型変数に代入してるけど、setしてないんだけど、
これがOKとされてるのが分からないのよ。
イテレータでrangeコレクションを回してるなら、setの必要無いけど、
その前に、rangeに代入してる時にsetしてないのが凄く違和感あってさ。
774デフォルトの名無しさん:2010/07/04(日) 19:45:48
日本語がおかしかった。ごめんね。

×代入してるけど
○代入してるのに
775デフォルトの名無しさん:2010/07/04(日) 19:49:17
どうみてもStringに代入しているようにしか見えないが
776デフォルトの名無しさん:2010/07/04(日) 19:52:39
ぐは・・・俺がバカだった。
大恥晒してしまった・・・。

反省文レベルの大恥です。本当にお恥ずかしい。
スレ汚し、大変失礼しました。
777740:2010/07/04(日) 20:02:40
>>773,776
先日から
setしなくても良いのって聞いていたのこの事なの?
ずるって感じだわ
778デフォルトの名無しさん:2010/07/04(日) 20:06:09
いいんだ… 誰にだって間違いはある…
大切なのは間違いを繰り返さないことだ…



          ____
        /_ノ  ヽ、_\
 ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ    <Range型変数だっておwww
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒)
| / / /      |r┬-|    | (⌒)/ / / //  
| :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/
|     ノ     | |  |   \  /  )  /  
ヽ    /      `ー'´      ヽ /    /     
 |    |   l||l 从人 l||l      l||l 从人 l||l   バ   
 ヽ    -一''''''"〜〜``'ー--、   -一'''''''ー-、 ン
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒)) バ
                             ン
779デフォルトの名無しさん:2010/07/04(日) 20:12:00
>>776
晒し上げ

まぁ肩持つ訳じゃないけど、Stringに"A1"を代入するのは気持ち悪いね。
780740:2010/07/04(日) 20:17:49
>>779
気持ち悪いかもしれんが
もともとの質問者 >>737

>因みにわざわざ変数にしたい理由は、この座標がユーザサイドで指定できるようにする為です
って所から始まった事なので
781デフォルトの名無しさん:2010/07/04(日) 21:55:37
前に
Range("A1", Range("A65536").End(xlUp)).Copy
教えてくれた人にお礼言ってなかった、ほんとにありがとう!!!
782デフォルトの名無しさん:2010/07/05(月) 17:28:35
Excel2000がフォアグラウンドであれば動くんですが、
バックグラウンドにするとCPU使用率が0になり、止まってしまいます。
escキーで中断してみると
「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです」
という表示が出ます。

別のパソコンのExcel2003で試したところ、バックグラウンドにしても動くのですが、
escキーで中断してみると、やはり、同じ場所で同じエラーの表示になります。

下はエラーが再現する範囲で無駄を削ったマクロです。
ここをこうすれば良いとか、
そもそも、エラーがあるのになぜマクロが動くのか?
などについて、お気づきの点がございましたら教えてください。


Sub エラーがある部分()

 Dim i As Integer
 Dim U As Worksheet, S As Worksheet
 Dim PM As Variant

 Set S = Sheets("Sheet1")
 Set U = Sheets("Sheet2")

For i = 1 To 1000
 PM = Range(S.Cells(3, 1), S.Cells(502, 50)).Value
 Range(U.Cells(3, 1), U.Cells(502, 50)).Value = PM 'Escキーで中断するとここで止まる
Next i

End Sub
783デフォルトの名無しさん:2010/07/05(月) 18:04:27
>>782
Range(U.Cells... の部分を
U.Range(U.Cells... に修正する。
784デフォルトの名無しさん:2010/07/05(月) 18:09:07
PM = のところもPM = S.Range(に修正しておいてね。
785デフォルトの名無しさん:2010/07/05(月) 19:54:07
>>783>>784
レスありがとうございます。
しかし、残念ながら改善しませんでした…
786デフォルトの名無しさん:2010/07/05(月) 20:13:28
EXCELの最終ページ(印刷プレビュー時)数は、取得は可能でしょうか?
787デフォルトの名無しさん:2010/07/05(月) 20:45:37
Application.ExecuteExcel4Macro("get.document(50)")
788デフォルトの名無しさん:2010/07/05(月) 21:08:38
>>782
「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです」
これは コード自体が悪いというより

range(U.Cells(3, 1), U.Cells(502, 50)).Value = PM
の処理途中で(全部書込みが終わらないうちに)
ESC(中断)が押されたから 発生しているんじゃないかな。


>バックグラウンドにするとCPU使用率が0になり
ここはわからん
789デフォルトの名無しさん:2010/07/05(月) 21:14:54
左隣の行の最終列取得してそこまでオートフィル続けさせるの組んだんだけど、
データ数多くなるとかなーり重くなってしまう

Dim mysel As Object, mycol As Long, mylr As Long
Set mysel = selection
mycol = selection.column
mylr = selection.Offset(0, -1).End(xlDown).Row
selection.AutoFill Range(mysel, Cells(mylr, mycol))
End Sub

これ以上軽くするのは無理ですかね・・・?
790デフォルトの名無しさん:2010/07/05(月) 22:19:03
>>787
ありがとうございます!
791デフォルトの名無しさん:2010/07/05(月) 22:51:45
selectionをobject型にsetしても動くんだね。
知らなかったです。
792デフォルトの名無しさん:2010/07/06(火) 00:17:29
>>789
時間がかかってるのはAutofillの1行だけだから、これ以上軽くするのは難しいと思う
画面の書き換えを抑制しても変わらんだろうし
それよりも、変数myselの使い方が無駄すぎる
やるならせめて
mycol = mysel.Column
みたいにしないと
793789:2010/07/06(火) 10:35:54
文減らしてすっきりさせてみたけど、

sub テスト()
selection.AutoFill Range(selection, Cells(selection.Offset(0, -1).End(xlDown).Row, selection.column))
end sub

速度に特に変わりはなかったもうだめp
794デフォルトの名無しさん:2010/07/06(火) 10:40:17
オートフィルじゃなきゃ行けませんか?
オートフィルさせる内容は書けませんか?
内容が分かればオートフィル以外の代替案を出せる人が居るかも知れませんよ
795789:2010/07/06(火) 12:14:33
>>794
countifだったり、ifだったり、averageだったりいろいろあるからなぁ
汎用性あってサクッと動く奴だったら最高なんだが
796デフォルトの名無しさん:2010/07/06(火) 12:24:05
>>795
数式の内容によっては手動計算に切り替えてからオートフィルで少しだけ速くなるかもしれない
797デフォルトの名無しさん:2010/07/06(火) 13:59:17
2つのプログラムを別々のExcelファイルで起動すると機能するのに、
1つのExcelファイルでSheet1・2に入力し起動すると片方がエラーになってしまいます。
エラーコードは400
どうしてでしょうか?
詳しい説明、ソースが必要ならば晒します
798デフォルトの名無しさん:2010/07/06(火) 15:49:54
>>797
セル範囲を参照するときにワークシートの指定を忘れてる部分があるはず
799デフォルトの名無しさん:2010/07/08(木) 11:41:44
Sheet1のA行に商品名、B〜U行ぐらいまでそれぞれの商品に応じた数値データ(商品名、データはすべて埋まっていて、10000行くらいある)の表がある
Sheet2に、ある商品のリスト(1000人分くらい)があって、Sheet1からそれらのデータだけをオートフィルターみたいに抜き出したい

scripting.dictionaryってitemに20行も登録できたっけ?

800デフォルトの名無しさん:2010/07/08(木) 11:52:11
>>799
とりあえず行と列をちゃんと区別してくれないと、何の話かわからない。
801デフォルトの名無しさん:2010/07/08(木) 12:05:25
Sheet2を順次みていって、該当するSheet1の情報を転記するだけだろ
scripting.dictionaryをどうこうっていう意味がわからん

VBAでやる意味はわからんが、このスレ的に考えて
LOOKUP関数をVBAで実現したいってことじゃないのか?
802デフォルトの名無しさん:2010/07/08(木) 12:06:46
ごめん、行はA〜Uまで、列が10000だった
countifとかでもいいんだが、できたらSheet1は参照するだけでいじりたくない
803デフォルトの名無しさん:2010/07/08(木) 12:20:26
vlookupでもいいんだが処理に時間がk
804デフォルトの名無しさん:2010/07/08(木) 13:14:37
きちんと検索対象キーをソートして、
最後の引数をTRUEにすればVLOOKUPは早くなる。
805デフォルトの名無しさん:2010/07/08(木) 13:17:39
>>802

アルファベットは列、数字が行
806799:2010/07/08(木) 13:37:24
>>804
すまん、一度trueでやったんだが駄目だった
falseではうまくいった
807799:2010/07/08(木) 13:42:20
>>805
そうだった
日本語で躓いてたとは・・・
808デフォルトの名無しさん:2010/07/08(木) 19:42:58
列と行がごっちゃになった時は、メモ帳を思い出すと良いよ。
809デフォルトの名無しさん:2010/07/08(木) 20:01:38
列 って漢字に ||  が含まれてるから、列は縦に伸びる
行 って漢字に =  が含まれてるから、行は横に伸びる
810デフォルトの名無しさん:2010/07/08(木) 20:23:03
ただし、映画館やコンサート会場の座席表では列は横に伸びる
811デフォルトの名無しさん:2010/07/08(木) 20:27:18
横書きの世界は横が行
縦書きの世界は縦が行
812デフォルトの名無しさん:2010/07/08(木) 20:38:19
テキストは行
実世界は列
813デフォルトの名無しさん:2010/07/08(木) 21:18:10
爆走兄弟 列&行
814デフォルトの名無しさん:2010/07/08(木) 21:28:20
横一列にならんでください
815デフォルトの名無しさん:2010/07/09(金) 02:13:17
縦一列に並んで下さい
816デフォルトの名無しさん:2010/07/09(金) 02:32:08
横一列にならないでください
817デフォルトの名無しさん:2010/07/09(金) 07:30:32
高さ方向に並んで下さい
818デフォルトの名無しさん:2010/07/09(金) 08:16:38
丸刈りで
819799:2010/07/09(金) 09:07:05
なんかすみません・・・
820デフォルトの名無しさん:2010/07/09(金) 13:05:33
>>810
向きは違うけど列はアルファベットでしょ
821デフォルトの名無しさん:2010/07/09(金) 13:11:01
variant型の変数に二次元配列を格納してあって、
それをワークシートに一度に貼り付けると、量によっては時間がかなりかかるんだけど、
貼り付けの待ち時間にプログレスバーを表示したいのですが、どのような方法で実装すればよいのですか?

Sub 適当なサンプル()
Dim a(10000, 200) As Variant
Dim i As Long, j As Long
For i = 0 To 10000
For j = 0 To 200
a(i, j) = 1
Next
Next
Range("A1:GR10000") = a 'ここの処理の待ち時間にプログレスバー等を表示したい
End Sub
822デフォルトの名無しさん:2010/07/09(金) 13:12:26
はーいじゃあ二人組作っt
823821:2010/07/09(金) 13:16:25
どうでもいいことですが、
ループを0から始めてるので最後の貼付け範囲はRange("A1:GS10001")でしたorz
824デフォルトの名無しさん:2010/07/09(金) 13:50:14
>>821
たとえば

For row1 = 1 To 10000 Step 100
  Range("A" & row1 & ":GR" & row1 + 99) = a
  Debug.Print row1 / 100; "%"  'この部分で進行状況を表示
Next

みたいに、処理を100分割してイミディエイトウィンドウに進行状況をパーセント表示する
825デフォルトの名無しさん:2010/07/09(金) 13:52:31
あ、このサンプルはあくまでも例だから、実際は配列 a のサイズを変えなきゃいけないし
最後が10000じゃなくて10001だから端数が出た部分の処理は別にしなきゃいけない

どっちにしても単一の代入文の進行状況を表示するのは不可能だから、何かしら工夫が必要。
826デフォルトの名無しさん:2010/07/09(金) 13:58:28
プログレスバーコントロール使わないの?
827821:2010/07/09(金) 16:03:36
>>825
ありがとうございます。
処理を100分割してそれぞれの処理を実行するたびにプログレスバーに1加えていく(MAX100として)ってことですね。
確かに求めていたような動作にはなりますが、処理時間がかなり遅くなりそうな気がします。

イメージ的にはAPI等を使用して、Rangeに格納された容量(メモリ?)のようなものを取得し、
そのうちどれだけ処理が実行されたか、をプログレスバーに表示するようなことができないかと。
遅いPCで実行したときにエクセル下部のステータスバーに「フィル」というプログレスバーが表示されるのをフォームで実装できないかな、と思いました。
828デフォルトの名無しさん:2010/07/09(金) 16:20:29
>>827
Rangeオブジェクトの内部が公開されていないので、かなり難しいでしょうね。
APIをフックして、たとえばmallocあたりが呼ばれたかどうかを調べたとしても、
進行状況を線形に把握するのはたぶん不可能だと思います。

それに経験上、この規模の処理なら100分割してもそれほど速度は変わらないと思います。
なんなら簡単なプログラムでベンチマークしてみればよいでしょう。
829デフォルトの名無しさん:2010/07/09(金) 16:23:42
別の方法として、まず最初に簡単なベンチマークを実行し、
マシンの処理速度を把握した上で終了時刻を予測して、あとはタイマーで処理するという方法もあります。
不正確ですが利用者のイライラを低減させる効果はあるでしょう。

ファイルのコピーやダウンロードの残り時間の予想もけっこういいかげんですよね。
830デフォルトの名無しさん:2010/07/09(金) 17:41:24
>>829
ファイルのコピーやダウンロードの残り時間の予想は確かに不正確だけど、
> 別の方法として、まず最初に簡単なベンチマークを実行し、
> マシンの処理速度を把握した上で終了時刻を予測して、あとはタイマーで処理するという方法
こんな途方もないいい加減さとは違う。
831デフォルトの名無しさん:2010/07/09(金) 19:20:05
ダウンロード時間は刻々と変化する鯖の負荷等に左右されるから正確に予想するのは不可能
それと比べたら、パソコン内部だけで完結する処理の方が予想しやすい

ただし、あまりにも時間がかかって、その間に別の作業を始められてしまうとお手上げだけど
832デフォルトの名無しさん:2010/07/09(金) 20:13:13
CSVで書き出してデータの取り込みとか使ってみたら、
意外と早かったとか無いかなあ。単なる思い付きだけど。
833デフォルトの名無しさん:2010/07/09(金) 20:17:27
たぶんディスク経由するよりは配列から直接ワークシートに書き込んだ方が速いと思う
834821:2010/07/09(金) 20:30:14
大容量の二次元配列データをシートに書き込むには、>>821で記述したやり方が一番速いと思っています。
(貼付け速度のみ。配列へ格納する処理は除く。)
それでも砂時計マークが出て、当方のPCだと上記のような簡単な処理でも10秒ほどかかってしまいます。
もちろん、他の常駐ソフト等の設定により処理時間はさらに増減するものだと思われます。

そこで、視覚的に(錯覚的に)処理時間を短縮したかのように見せられないかと思い質問させていただきました。
835デフォルトの名無しさん:2010/07/09(金) 20:33:08
当然ながらApplication.ScreenUpdating=False程度はやった上の話だよね
836デフォルトの名無しさん:2010/07/09(金) 21:29:31
>>834
> 大容量の二次元配列データをシートに書き込むには、>>821で記述したやり方が一番速いと思っています。
そんなことはない。
excelの大規模データインポート処理は十分最適化されているのに対して、>821のような
軽い処理が大量に繰り返される処理はほとんど最適化されない。
837デフォルトの名無しさん:2010/07/09(金) 21:45:11
>>836
繰り返しループはただのテストデータの作成で
セルへの書き込みは最後の1行だけでしょ

200万セルの書き込みが10秒なら十分最適化されてると思うけど
838デフォルトの名無しさん:2010/07/09(金) 22:05:50
昔はクリップボード経由が速かったけど今は違うの?
839デフォルトの名無しさん:2010/07/09(金) 22:25:37
destination
840821:2010/07/10(土) 13:07:22
>>836
配列への格納の処理(for〜next)は適当に組んだだけです。
実際にはテキストファイル、CSVファイル等を加工したものを二次元配列に格納していますので、さらに大容量の場合もありますし、少ない場合もあります。
二次元配列を一気にワークシートへ貼り付ける方法についての話でした。

わかりにくかったようなので、再度書きます。
>>821の場合ですと、For〜Nextで配列を格納させる段階でプログレスバー(MIN0;MAX10000)のValueを1ずつ増加させることはできますが、
そのあとの
>Range("A1:GR10000") = a
の1行の実行で、また10秒ほど(当方のPCでは)待ち時間があります。

その待ち時間をプログレスバーで表現できないものかと思い質問させていただきました。
(イメージ的には貼付ける際に表示されるステータスバーのプログレスバーのようなものです。)
(ブックを保存しているときに出ているような)

【今までのまとめ】
>>829の方法
10秒という時間が固定であるなら、>>829のような方法で0.1秒ごとにValueを1増加させる(MAX100)方法もできるかとは思いますが、環境によっては大きくズレが出てしまいます。
また、取り込むファイルごとにベンチマークを行い時間を計らなければいけません。
>>825の方法
再度For、Loop等で数行ずつ、もしくは数セルずつ貼り付けていく場合は貼付け本来の処理が遅くなってしまいます。

そこで、二次元配列aに格納された容量のようなものを取得し、その値をMAXに設定し、どれだけ貼付け処理(?)が済んだかでValueを増加させていくことはできないかと思っています。
841840:2010/07/10(土) 13:08:52
書き直し、書き直しってやってたら逆に読みにくい文章に・・・orz
842名無しさん@そうだ選挙に行こう:2010/07/10(土) 13:39:10
改行コードが0D0Aじゃなくて0Aのファイルを1行単位にテキストファイルを
読み込んでセルに内容を反映したいのですが
どうしたらいいの?
843名無しさん@そうだ選挙に行こう:2010/07/10(土) 14:04:55
>>842
私ならファイル全部読み込んで配列に入れてなんとかする

varRecords = Split(.readall, vbLf)
844名無しさん@そうだ選挙に行こう:2010/07/10(土) 15:36:50
エクセルでデータを管理したいのですが、保存時にxlsで保存するとデータが大きくなるので、保存はcsv、開くときはエクセルのフォームで
開きたいのですが、できますでしょうか?

Private Sub CommandButton1_Click()

ファイル名 = "TTT" '※1"
ファイルの種類 = 6 '※4 xlTextPrinter
Application.Dialogs(xlDialogSaveAs).Show arg1:=ファイル名, arg2:=ファイルの種類
End Sub
---------------------------------------------------------------------------
Private Sub CommandButton2_Click()

フルパス = Application.GetOpenFilename("*.csv,*.xls") '※2
If フルパス = "False" Then Exit Sub '[キャンセル]ボタンがクリックされた場合
Workbooks.Open フルパス

End Sub

845名無しさん@そうだ選挙に行こう:2010/07/10(土) 15:39:13
できるかできないかでいえばなんでもできるが
できるからといってなんでもやってよいわけではない
846名無しさん@そうだ選挙に行こう:2010/07/10(土) 15:45:10
>>844
コメントが間違っている
※4は xlcsv

xlTextPrinter は 36
847名無しさん@そうだ選挙に行こう:2010/07/10(土) 16:02:19
>>846
どうしても元もフォーマット(罫線や幅)が無くなってしまいます。どうしたらいいでしょうか?
848名無しさん@そうだ選挙に行こう:2010/07/10(土) 16:49:20
csvではなくxlsで保存する。
849名無しさん@そうだ選挙に行こう:2010/07/10(土) 16:54:30
>>848
やはりフォーマットをそのまま残すにはxlsでないと駄目ですか?
850844:2010/07/10(土) 17:04:44
844ですが、例えば20行目〜30行目だけをcsvファイルに保存することはできないでしょうか?
何卒よろしくお願いします。
851842:2010/07/10(土) 17:09:30
>>843
いろい手段を考えてみましたが
結果そうしました、ドウモ
852名無しさん@そうだ選挙に行こう:2010/07/10(土) 18:37:07
>>847
XMLで保存すれば?
853844:2010/07/10(土) 19:19:17
>>852
データ容量がどうしても大きくなってしまうのでcsvで保存したいのですよ・・・
20行目から30行目だけcsvで保存して、読み込むときは入力どおりに出力したいのですよ・・・
854名無しさん@そうだ選挙に行こう:2010/07/10(土) 19:51:54
無理です。ZIP圧縮かけたほうがまだ健全。
855名無しさん@そうだ選挙に行こう:2010/07/10(土) 19:58:57
それならADOでデータ管理しとけと
アクセスデータベースをエクセル制御すれば、エクセルで使うデータ量程度なら十分
856名無しさん@そうだ選挙に行こう:2010/07/10(土) 22:08:50
>>853
854の言うとおり、ZIP圧縮が無難だな。
857名無しさん@そうだ選挙に行こう:2010/07/10(土) 22:20:28
>>853
xlsとcsvファイル2つにそれぞれ保存して
xlsファイルを開くときにcsvファイルを取り込むように組めばいいように思うけど?
858名無しさん@そうだ選挙に行こう:2010/07/10(土) 22:46:31
>>853
重いってのがどの程度を想定してるのか分からないけど、
XMLはテキストデータだから軽いかと思うよ。
859名無しさん@そうだ選挙に行こう:2010/07/10(土) 22:57:46
テキストデータだからこそ重そうなんだが。
開始タグ終了タグ積んでるXMLは重量級。

グダグダ言わずに測れば分かるか。
「あ」が336個罫線とともに敷き詰められたデータを
Excel2010(ベータ)で保存したらこうなった。

xlsx: 10.6KB
xml(Excel2003 SpreadsheetML): 26.9KB
860名無しさん@そうだ選挙に行こう:2010/07/10(土) 22:59:02
本当にデータ容量だけが問題なら
フォルダを圧縮フォルダにでもすればいい話だよ。
861名無しさん@そうだ選挙に行こう:2010/07/10(土) 23:34:23
ぶっちゃけた話、Excelで容量云々言ってる時点で、運用が間違ってると思うわ。
862名無しさん@そうだ選挙に行こう:2010/07/11(日) 00:01:22
どの程度大きくなった結果、困っているのか聞きたい所だな。
単に貧乏性なのか、本当に肥大化しまくっているのかいまいち判らん。
863名無しさん@そうだ選挙に行こう:2010/07/11(日) 08:35:27
>>844 程度のコーディングしかしたことないのかもしれないな
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_050.html

にあるようなコーディングすればいいのに
864名無しさん@そうだ選挙に行こう:2010/07/11(日) 12:11:36
>>859 そりゃxlsxはXMLをzip圧縮したものなんだからそうなるだろ
xlsxを解凍ソフトで解凍してみれ
865名無しさん@そうだ選挙に行こう:2010/07/11(日) 12:29:07
XMLで保存しろって言われたからそうしたまでであって
866名無しさん@そうだ選挙に行こう:2010/07/11(日) 12:38:06
もしかしてxlsxで保存したら解決じゃね?
867名無しさん@そうだ選挙に行こう:2010/07/11(日) 14:10:45
a-
a l
a l ←「a」の範囲だけ行を選択
a l
a-
b
a-
a l ←「a」の範囲だけ行を選択
a-
b

上のように「a」の範囲だけ行を選択したいです。
教えてください。
868名無しさん@そうだ選挙に行こう:2010/07/11(日) 14:58:06
日本語でどうぞ
869名無しさん@そうだ選挙に行こう:2010/07/11(日) 16:21:00
>>867
forで上から見て行って、ifで条件に合致した場合に処理をするのが基本だよ。
選択してから何をしたいのかが分からないけど、
unionのparramarrayに順次追加して、最後に処理するのはお勧め出来ない。

それをやりたがる人が多いんだけど、何か本とかに載ってるのかな?
870名無しさん@そうだ選挙に行こう:2010/07/11(日) 16:32:56
>>867
こんなのでいいんじゃないの

Dim eachRange As Range, filtered As Range
For Each eachRange In [A:A] ' ここは好きな走査範囲選んで
If eachRange = "a" Then
If filtered Is Nothing Then
Set filtered = eachRange.EntireRow
Else
Set filtered = Application.Union(filtered, eachRange.EntireRow)
End If
End If
Next
filtered.Select
871>>867:2010/07/11(日) 17:15:20
ちょっと考えたんですが、

1.上から「a」以外のセルの位置を吐き出す

2.6番目に「b」があったとすれば、1〜5番までの行を選択する

といったやりかたでいいでしょうか?

今までは「a」を見つけて、「a」のセルを順次選択していこうと思ってたのですが・・・。
872名無しさん@そうだ選挙に行こう:2010/07/11(日) 17:28:55
オートフィルタでaの行を選べばいいんじゃないの?
873名無しさん@そうだ選挙に行こう:2010/07/11(日) 18:04:08
右側に1行目に1、2行目に2と連番うって
その後にソートしてから、必要の行がまとまるので全部消せばよくね?
874名無しさん@そうだ選挙に行こう:2010/07/11(日) 18:44:44
オートフィルタが一番良いと思うよ
875名無しさん@そうだ選挙に行こう:2010/07/11(日) 21:53:23
場合にもよるが、適当にaやらbの列部分の範囲を選択して
aをアクティブセルにしてCtrl+Shift+\したのち、
Ctrl+9するっていう手もあるよ。
876デフォルトの名無しさん:2010/07/12(月) 11:55:11
選択したいって質問に対して、他のを削除するだの、非表示にするだの()笑
877デフォルトの名無しさん:2010/07/12(月) 11:59:02
>>869
Unionは分ってない人が一見スマートに見えるからよく使うだけ。
あんな幾何級数的に遅くなるもの普通の人は使わん。
まぁ選択するんだったらオートフィルターだが、その後何するか分らんがオートフィルターはほとんどの場合最善じゃねー
878デフォルトの名無しさん:2010/07/12(月) 23:22:15
やりたかったのはこういうことだったのだがね。
A1、A2を「データ→グループとアウトラインの設定からグループ化して」で表示・非表示を操作
bは表示したいからA3はそのまま
A4、A5も「データ→グループとアウトラインの設定からグループ化して」で表示・非表示を操作

前     後
 A      A
1 a     3 b
2 a  
3 b  →
4 a  
5 a

説明下手だから通じないかもしれないけど。
879デフォルトの名無しさん:2010/07/13(火) 05:23:09
FOR TO NEXT でやるべきと思うけどなぁ
だって、そのグループ化ってやつ、複数選択でやってみるとエラーになるし
880デフォルトの名無しさん:2010/07/13(火) 23:19:19
VBAで使用する正規表現はVBScript以外を使用する事はできるのでしょうか?
VBScriptだと正規表現の方言がJavaScript系なので弱い部分がある為、
別の言語で処理出来るようなライブラリ等があるのかなぁ、と思いまして
881デフォルトの名無しさん:2010/07/14(水) 00:26:33
>>880
DLLの呼び出し部分を自分で定義してやれば、たいていのライブラリが使える。
ただし日本語対応の正規表現ライブラリ自体が、あまり種類が多くない。
Bregexp.dllならドキュメントがけっこう充実しているのでそこそこ使いやすいと思う。
ttp://www.geocities.co.jp/SiliconValley-Bay/1992/excel/reg.html
882880:2010/07/14(水) 08:05:22
>>881
まんこの中見る器具!(性器表現)
こいつはいい…今まで知らなかったぜ!
派手に暴れてくる!マジ助かった、Thank you
883デフォルトの名無しさん:2010/07/14(水) 19:53:10
>>882
それはクスコ
884デフォルトの名無しさん:2010/07/14(水) 20:30:24
巣のつっこみがk
885デフォルトの名無しさん:2010/07/14(水) 23:06:05


ファイルという変数に画像を取り込んで、エクセルの任意の場所に張り付けたいと考えています。

次のように、L5を選択し、そこからOffsetで指定した分だけずらして張り付けたいのですが、全然関係のない部分に画像が張り付けられてしまいます。


Range("L5").Select
ActiveCell.Offset(Lc1_tate - 1, Lc1_yoko - 1).Select

ActiveSheet.Pictures.Insert(ファイル).Select
Selection.ShapeRange.LockAspectRatio = msoTrue
Selection.ShapeRange.Height = 50
Selection.Name = File_Name


ご教授をお願いします。

886デフォルトの名無しさん:2010/07/15(木) 00:01:57
>>885
オブジェクトの位置を指定するには
左端または上端からの距離(Leftプロパティ Topプロパティ)を指定する必要がある

これでどう?
Dim Taget As Range
Dim X As Long
Dim Y As Long

Set Target = Range("L5").Offset(Lc1_tate - 1, Lc1_yoko - 1)
X = Target.Left
Y = Target.Top

With ActiveSheet.Pictures.Insert(ファイル)
.ShapeRange.LockAspectRatio = msoTrue
.ShapeRange.Left = X
.ShapeRange.Top = Y
.ShapeRange.Height = 50
.Name = File_Name
End With
887デフォルトの名無しさん:2010/07/15(木) 00:10:17
おい!みんな来てここ(>>886) みてみろよ!
天才がいるぞ、天才が!

あ、ありがとうございます! >>886

ホントに涙が出てきた。。。
888デフォルトの名無しさん:2010/07/15(木) 00:32:40
おい!みんな来てここ(>>887) みてみろよ!
バカがいるぞ、バカが!

あ、ありがとうございます! >>887

ホントに尿が出てきた。。。
889デフォルトの名無しさん:2010/07/16(金) 19:12:08
確かに>>887の書き方じゃバカにしてるようにしか見えないなww
890886:2010/07/16(金) 20:40:02
スルーしてたけど
実際に 変数の定義が誤っているからしかたないかなと思ってたりする
891デフォルトの名無しさん:2010/07/16(金) 21:27:07
ここは表現の添削もしてくれるスレか? 馬鹿にしているんじゃなくて、馬鹿はお前だろ?
892デフォルトの名無しさん:2010/07/16(金) 21:39:04
>>891
アンカー付けて
893デフォルトの名無しさん:2010/07/16(金) 23:59:30
>>890
ここは表現の添削もしてくれるスレか? 馬鹿にしているんじゃなくて、馬鹿はお前だろ?
894デフォルトの名無しさん:2010/07/17(土) 01:07:27
日本語でおk
895デフォルトの名無しさん:2010/07/17(土) 01:45:07
うん、確かに、これは日本語でおkなレベルy
896デフォルトの名無しさん:2010/07/17(土) 14:38:35
関数vlookupで参照するとめちゃくちゃ重いんだが(行、列ともにデータが多い)
VBAでもっと軽くする方法ない?
具体的には
・参照したいデータ数1000(列)
・参照元のデータ数30000(列)、アイテム数50(行)から
897デフォルトの名無しさん:2010/07/17(土) 14:39:26
参照元はデータベースみたいになってます
898デフォルトの名無しさん:2010/07/17(土) 14:47:19
vbaを捨てる
899デフォルトの名無しさん:2010/07/17(土) 18:46:11
findで目的のセルをsetすれば良いんじゃない?
900デフォルトの名無しさん:2010/07/17(土) 18:57:27
ほほう
901デフォルトの名無しさん:2010/07/17(土) 19:13:06
自己解決
902デフォルトの名無しさん:2010/07/17(土) 19:46:08
もともとソフトウェア自身に容量はあっても重さなんてないんじゃない?
903デフォルトの名無しさん:2010/07/17(土) 20:49:31
重さは質量じゃなくて速度の意味で使われるね
904デフォルトの名無しさん:2010/07/17(土) 20:53:08
>>896
お前列と行を勘違いしてるだろ?
30000行50列だろうが。
50列もあるのにVLOOKUPなんて考えるやつ、Excelにたいする適性がないからやめた方がいい。
905デフォルトの名無しさん:2010/07/17(土) 20:56:09
>>899はまだ見込みがあるかもな。
Findで見つけてResizeでまとめてと考えてるだろうし。
906デフォルトの名無しさん:2010/07/17(土) 20:56:13
あきらめろっていう回答を待てるんじゃないんだよ。人だよじゃなくて、どうすればいいのか教えてやれよ。
907デフォルトの名無しさん:2010/07/17(土) 20:57:20
あきらめろっていう回答を待てるんじゃないんだよ。どうすればいいのか教えてやれよ。
908デフォルトの名無しさん:2010/07/17(土) 21:02:50
>>896は釣り質問っぽいからこれ以上はやめとくかw
909デフォルトの名無しさん:2010/07/17(土) 21:08:06
>>907
お前が教えてやれ。
910デフォルトの名無しさん:2010/07/17(土) 21:08:16
教えてください。

アドインで作ったマクロから

Worksheets.Add before:=Sheets(1)
Sheets(1).Select

上記マクロで作成したシートに

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
ws = Target.Value
MsgBox ws
End Sub

を適用させるにはどうしたら良いでしょうか?
911デフォルトの名無しさん:2010/07/17(土) 21:12:09
>>909
俺がわかるわけないだろ?
912896:2010/07/18(日) 00:03:43
荒れてるwwwwwwwwwごめんwwwwwww
参照先がラベル30000行、それぞれデータが50列くらいあってそれ全部参照するんだけど、しかたないからvlookupで作ってみた
自分が一度に調べるのは多くても5000ラベルくらいだからまあなんとかなりそうな感じ

Do
Dim i As Long
For i = 1 To mycolumn
ActiveCell.Offset(0, i).Value = Application.WorksheetFunction.VLookup(ActiveCell, myrange, i + 1, False)
Next i
ActiveCell.Offset(1, 0).Select
Loop While ActiveCell <> ""

みたいな感じで一応動いたから我慢するw
913デフォルトの名無しさん:2010/07/18(日) 00:18:07
うん、それで我慢汁
914デフォルトの名無しさん:2010/07/18(日) 00:28:31
>>910
アドイン側へ元となるコードを記述したモジュールを作成して
それを新規シートモジュールにコピーする方法はどうですか?

1)アドイン側へ作成 モジュール名:CopyModul
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
ws = Target.Value
MsgBox ws
End Sub

2)アドインで新規シート作成時
Set NewWs = Worksheets.Add(before:=Sheets(1)) '新規シート作成
Set OrgCM = ThisWorkbook.VBProject.VBComponents("CopyModul").CodeModule
Set NewCM = NewWs.Parent.VBProject.VBComponents(NewWs.CodeName).CodeModule
NewCM.InsertLines 1, OrgCM.Lines(1, OrgCM.CountOfLines)
915896:2010/07/18(日) 00:49:49
せっかくなのでもうひとつ質問させてもらってもいいですか?
vlookupの検索条件をfalseからtrueに変えると計算早くなるみたいなんですが、
近似値検索だと万が一でも間違った参照をしてしまうことってありますか?
ラベルがアルファベット+数字ごちゃまぜなんで、いざ間違ってても確認しにくいんです・・・
916デフォルトの名無しさん:2010/07/18(日) 01:35:05
>>914
わかり易く教えていただきありがとうございます。
CodeModuleの存在をはじめて知りました。
ただ・・・
「Visual Basic プロジェクトへのアクセスは信頼性に欠けます」というエラーを回避するようにしても、
低スペックのためか、なぜかエクセル自身のエラー→自動回復になってしまってうまく動きません・・・

この問題を解決して、教えていただいたマクロを利用しても良いのですが、自分だけでなく、会社で複数のPCに
アドインを入れたいと思っているので、アクセス許可がちょっと気になります。(デフォルトで許可にチェックが入っていないため)

アドインの中のマクロでシートを作成して、作成したシートをダブルクリックした時にvalueを返したいのですが、
他に良い方法はないでしょうか?
勉強不足のため、イベントプロシージャでしかできないのか、イベントプロシージャを作成するならCodeModuleを利用しないと
いけないのか判断できなくて申し訳ないのですが、教えていただけたらと思います。
917914:2010/07/18(日) 02:02:42
>>916
シートモジュールにコードを直接書込みたかったのでCodeModule使っただけ
普通は使わない
エラーでるなら止めておいたほうがいいかも
後は
アドイン内のクラスモジュールでイベントを拾えばいいんだろうけど
なにもしないと全てのシートに適用されしまうので新規作成したシートをどう識別するかが問題
918デフォルトの名無しさん:2010/07/18(日) 02:15:05
>>915
近似値なんだから、完全に一致はしていない行を参照する可能性は当然あるよ。
VLOOKUP+IFの二段構えでチェックとかすれば良いのだろうけど、
計算コスト的にどうなのかは一寸判らないな。
あと、検索アルゴリズムに二分探索を使うから予めソートされていないと駄目だな。
919914:2010/07/18(日) 02:42:13
>>916
別の視点から考えてみた
1)アドインブックへ新規作成状態のシートを作成
2)そのシートモジュールへ例のコードを記述
3)シート新規作成ではなくシートコピーする

ThisWorkbook.Sheets(1).Copy Before:=Sheets(1)
920916:2010/07/18(日) 11:47:55
>>919
本当、ありがとうございます!
許可も不要だし、イベントもうまく動作しました。
すばらしい発想でした。
自分ではとても思いつかなかったので、とても助かりました。

最後にもう一言。
ありがとうございました。
921デフォルトの名無しさん:2010/07/18(日) 13:09:44
ttp://www.dotup.org/uploda/www.dotup.org1034375.jpg.html
画像のような課題が出たのですが、どうしてもうまく出来ません。

ttp://www.dotup.org/uploda/www.dotup.org1034392.bmp.html
今こんな状態なんですが、どこが間違っているかすらも分からないので助けてください
922デフォルトの名無しさん:2010/07/18(日) 14:00:45
画像の時点で回答する気がなくなる
しかも課題だし
923デフォルトの名無しさん:2010/07/18(日) 14:39:06
本当に分からなかったもので・・・すいませんでした
924デフォルトの名無しさん:2010/07/18(日) 14:40:37
素直に電磁気学が分からないって言えよ
俺は位相とかもう完全に忘れた
925デフォルトの名無しさん:2010/07/18(日) 15:04:29
開いたら完全にふざけてるわ
926デフォルトの名無しさん:2010/07/18(日) 15:08:15
お前これ基礎すらわかってねえだろ
927デフォルトの名無しさん:2010/07/18(日) 15:14:24
   ∩___∩         |
   | ノ\     ヽ        |
  /  ●゛  ● |        |
  | ∪  ( _●_) ミ       j
 彡、   |∪|   |        J
/     ∩ノ ⊃  ヽ
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /
928デフォルトの名無しさん:2010/07/18(日) 15:21:23
私のせいで荒れちゃってホントにすいませんでした
929デフォルトの名無しさん:2010/07/18(日) 19:18:28
荒れてるの?

もう二度とレスしないか、ちゃんと書いて質問するかどっちかにしろ
930デフォルトの名無しさん:2010/07/18(日) 20:33:00
やなこった。偉そうにするんじゃねぇよ。一回も回答したことないくせに。
931デフォルトの名無しさん:2010/07/18(日) 21:53:16
なんで宿題代行してやんなきゃいけないんだよw
しかもただの計算だけじゃねーか
932デフォルトの名無しさん:2010/07/18(日) 22:06:12
なんでって、ここ、質問スレだろ?
お前にとっては、ただの計算かもしれんが、俺には難しんだよ。
答えられねぇくせにしゃしゃり出てくるんじゃねぇよ。
933デフォルトの名無しさん:2010/07/18(日) 22:12:59
ここは、Excel 「VBA」の質問スレ、な。
934デフォルトの名無しさん:2010/07/18(日) 22:13:37
>>932
悪いな、このスレ、三人用なんだ
935デフォルトの名無しさん:2010/07/18(日) 22:22:59
>>932
ファイト!w
936デフォルトの名無しさん:2010/07/18(日) 22:33:21
>>932
数式自体の意味が難しくて分からないなら
VBAどころか Excelうんぬん以前の問題
質問する場所が違うってことじゃね
937デフォルトの名無しさん:2010/07/18(日) 22:35:42
この間、回答なし。 
938デフォルトの名無しさん:2010/07/18(日) 22:39:01
>>933 わかってるよ。だからどうした?
>>935 いっぱ〜つぅ!
>>936 数式の意味はわかってるよ。 俺がわからないってどこに書いてあるんだよ。勝手に判断するな。
939デフォルトの名無しさん:2010/07/18(日) 22:39:24
っていうか出先で携帯だから読めない
逆ギレしちゃうお子チャマは2ちゃんしないでママのオッパイでもしゃぶってれ
940デフォルトの名無しさん:2010/07/18(日) 22:43:54
数式は分かってるけど
932>お前にとっては、ただの計算かもしれんが、俺には難しんだよ。
って事ね

本当に分かってるって言わないと思うけどね
941デフォルトの名無しさん:2010/07/18(日) 22:55:08
えーと
何をどうしたいの?
問題解いてやればいいの?
VBA書いてやればいいの?
構ってやればいいの?
942デフォルトの名無しさん:2010/07/18(日) 23:22:24
ホントスレチな質問しちゃったせいですいません
>>930とかは私じゃないです。変なの沸かせちゃってすいませんでした
943デフォルトの名無しさん:2010/07/18(日) 23:35:01
>>938

>>934 にもコメントしてやれよ。 なにが言いたかったのかは俺にも不明だが。

あと、アンカーも打てねぇやつは他で練習してから書き込めよ。

俺の質問は、他のスレで解をもらったから、すでにどうでもいいんだけどね。
ぐらいちゃんと打てるようになるまでROMってろよ
944デフォルトの名無しさん:2010/07/18(日) 23:39:54
>>941 良いから解けよ。
>>942 偽者乙。
>>943 俺の質問は、他のスレで解を貰ってないから、全くわからないんだけどね。
945デフォルトの名無しさん:2010/07/19(月) 00:15:11
ここまで俺の自演
946デフォルトの名無しさん:2010/07/19(月) 21:03:45
VBAでIE操作関係をググっていろいろ調べているんだが
三流君のサイトばっかでてきてうぜぇぇぇぇぇぇぇ(笑)
三流君のサイトはごちゃごちゃして結局問題解決したことないわw
947デフォルトの名無しさん:2010/07/19(月) 22:31:47
-"三流" オプション付けてぐぐればいいんだっけ
948デフォルトの名無しさん:2010/07/20(火) 03:59:00
2次元配列への代入について質問です。

例として、A列に大量のデータが存在するとします。
これをVariant変数使って一気に2次元配列に代入する場合なんですが、

Dim C as Variant
C = range("A1:A" & range("65536").End(Xlup).row)

上記で代入はできますが、A列に1セルのみ値が書き込まれている際にエラーが出てしまいます。
これを回避する方法が分かる方いましたらお願いします。
949デフォルトの名無しさん:2010/07/20(火) 07:48:52
配列にして数をセル数と合わせてからほおりこむ
950デフォルトの名無しさん:2010/07/20(火) 10:24:31
>>948
本当に動いているのか?
C = Range("A1:A" & Range("A65536").End(xlUp).Row)
A入れないと動かないと思うが・・・
951デフォルトの名無しさん:2010/07/20(火) 13:28:39
>>948
なんか響かないようだから949の補足だ
セル数が1個だったら
redim c(1 to 1,1 to 1)
c(1,1)=範囲.value
2個以上のときはc=範囲.valueとすりゃいい。
952デフォルトの名無しさん:2010/07/20(火) 17:34:23
みっしりデータが入ってるなら、
c = range("a1").currentregion.columns(1)
でいいのでは。
でも、なんで二次元配列に入れたいのだろうか。
953デフォルトの名無しさん:2010/07/20(火) 18:16:48
>>950
一応動くのですが、1セルの場合、空白の場合の処理を入れていない為
一つ一つ例外処理を入れていこうかと思いまして…

>>952
二次元配列=高速化とWebで見てしまった事とPCのスペックが低いので代入は2次配列で行っています。
データ量は10〜300行程度なのですが無駄なのでしょうか。

>>949>>951
初期化の際のエラーは出なくなりました、ありがとうございます。
ただ、ひとつ問題が発生してしまいまして、A列にデータが1つの場合ですが

Ubound(C,1)で『型が一致しません』のエラーが出てしまいます。
Msgbox C ではセルのデータは表示されるのですが。
A列に複数データの処理では問題なくコンパイルされました。

処理の流れですが、
@ワークシートに予め記載されているA列のキー値を配列に代入
Aワークシートには書式設定(セル結合など)がありエラーの元になると面倒なので、Cells.Clearで一旦削除
  ⇒ここで削除するため配列などにデータ全部格納しておきたいと思いました。
Bキー値を元に別シートから参照データ引っ張ってきています。
954デフォルトの名無しさん:2010/07/20(火) 18:28:35

君のその報告こそどうでもいい事なんだが
955デフォルトの名無しさん:2010/07/20(火) 20:21:48
>>953
お前>>949>>951の意味分ってるか?
こんなことだ
Dim c As Variant
With Range("A1", Range("A" & Rows.Count).End(xlUp))
  If .Count = 1 Then
    ReDim c(1 To 1, 1 To 1)
    c(1, 1) = .Value
  Else
    c = .Value
  End If
End With
For i = 1 To UBound(c, 1)
  '処理
Next

セル1個でもエラーにならないだろ?
それから結合セルの話はしないでくれな。
俺はアレルギーで蕁麻疹が出るから。
956デフォルトの名無しさん:2010/07/20(火) 20:41:56
すまん、セル結合を解除してたのか。
それは良いことだ。
957デフォルトの名無しさん:2010/07/20(火) 21:39:43
>>955
ぐあああ出来ました!!!
.Count使うとは思いませんでした。エラー対応が全くなかったので助かりました。
構文なども書いてもらえて自分との違いが分かり勉強になりました。
長文付き合って下さり本当にありがとうございました。
958デフォルトの名無しさん:2010/07/22(木) 00:41:16
はじめまして。

どうしてもわからなかったので質問させていただきます。
「閉じているブックのシート一覧を読み込む」です。

OpenFileName = Application.GetOpenFilename("Microsoft Ecel ブック,*xls")
で読み込んだファイルのシートをString型【str(配列数)】に読み込みたいです。

このサイトが近いかなぁ、と思ったのですが、うまく実装できませんでした。
http://officetanaka.net/excel/vba/tips/tips29.htm

よろしくお願いいたします。
959デフォルトの名無しさん:2010/07/22(木) 01:08:40
条件付き書式設定について質問です。

セルの値が〜 と 数式が〜の2つのパターンがあると思います。
以下、例としてですが

@セルの値が〜
 C2セルの値が あああ ならば、文字を赤色
 C2セルの値が いいい ならば、文字を青色 に設定し、

A数式が〜
 C2の値が あああ ならば、背景色を灰色
 C2の値が いいい ならば、背景色を青色

のような設定したいのですが、マクロですとどのように記述したらよいか
教えて頂けないでしょうか。
960デフォルトの名無しさん:2010/07/22(木) 01:09:30
>>959
操作を記録すれ
961デフォルトの名無しさん:2010/07/22(木) 01:19:25
とりあえずここら辺を参考にすればバイナリで読み込めるから。
http://www.cocoaliz.com/excelVBA/index/47/
あとはそのサイトを参考に頑張れ。
頑張れないなら素直に諦めた方が良い。割と難易度高めの処理だし。
962デフォルトの名無しさん:2010/07/22(木) 08:00:14
>>960
操作を記録してやってみましたが、どうしても記録したサンプル+Webだけですと
Rangeオブジェクトを使用したパターンで成功してくれません。

参照先を固定したRange("B2")とかではなく、オフセットの値によって
条件付き書式を設定したいのですが。

Dim rOb as Range

rObj.Offset(0, 1).Select

With Selection
.FormatConditions.Add Type:=xlExpression, Formula1:= _
''''ここで、基準セルの右のセルが文字列"あああ"であるならば、カラーを設定したいです。
  "=IF(rObj.offset(0,2)=""あああ"",1)"
.FormatConditions(1).Interior.ColorIndex = 15
end with
963デフォルトの名無しさん:2010/07/22(木) 08:59:44
オフセットだけの話なら別にVBAで頑張らなくても
INDIRECT(ADDRESS(ROW(), COLUMN()+2))
とかで現在セルから2つ右とかはみられるよ。
964デフォルトの名無しさん:2010/07/22(木) 10:21:10
最終セルからendxlup参照の話題何回出れば気が済むんだよw
965デフォルトの名無しさん:2010/07/22(木) 10:53:45
>>963
INDIRECT使う必要あるか?
A1の条件付書式なら=C1="あああ"とかで大丈夫だろ?
966デフォルトの名無しさん:2010/07/22(木) 12:35:32
>オフセットだけの話なら
>オフセットだけの話なら
>オフセットだけの話なら
967デフォルトの名無しさん:2010/07/22(木) 12:43:15
A1に対するC1もオフセットだがアホか?
数式でR1C1形式にしてみりゃすぐわかる。
968デフォルトの名無しさん:2010/07/22(木) 13:01:40
ん?反論がなければ俺の勝ちだが?
969デフォルトの名無しさん:2010/07/22(木) 13:43:48
夏休みだねぇw
970デフォルトの名無しさん:2010/07/22(木) 15:13:18
つぎすれまだー?
971デフォルトの名無しさん:2010/07/22(木) 18:51:58
>>967,968わろすww
972962:2010/07/23(金) 02:05:42
>>963
回答ありがとうございます。
試してみたのですが、条件付き書式設定をした基準セルを元に
数か所の行、列のセルを判定させる予定でしたので断念しました。
情報提示不足で申し訳ないです・・・

条件付き書式について理解不足だったのもあり失礼しました。
無意味に色々機能を使ってると実感しましたので少々勉強してみます。
973デフォルトの名無しさん:2010/07/23(金) 12:05:16
別のエクセルシートで作ったVBAコードをコピーして一括管理のシートに移し替えたんですが、
コンパイルエラー、Function または変数が必要です。って出るようになって使えない

元のシート上のやつはちゃんと動くのに、どういうことですかね・・・?
subを変えてみたりもしたんですがだめでした
974デフォルトの名無しさん:2010/07/23(金) 12:48:21
コード晒すのが早道純
975デフォルトの名無しさん:2010/07/23(金) 14:40:25
守秘義務があるのでできません
976デフォルトの名無しさん:2010/07/23(金) 14:44:42
はぁそうですか。ご愁傷様です。
977デフォルトの名無しさん:2010/07/23(金) 14:47:39
>>973みたいなのって、
そんなことの原因も割り出せないでどうやって暮らしてきたの?
質問に答えなくて悪いけど素直に疑問。
978デフォルトの名無しさん:2010/07/23(金) 14:50:13
>>973
会社の同僚に聞け。
聞く奴がいなけりゃ自分で勉強しろ。
979デフォルトの名無しさん:2010/07/23(金) 15:03:42
エスパー
他のモジュールを写してない
980デフォルトの名無しさん:2010/07/23(金) 15:08:59
エラーが出た箇所と同じところを元のものから探してポイントし、Shift+F2を押す。
981デフォルトの名無しさん:2010/07/23(金) 16:06:18
それよりラップトップで無限ループ陥った時の脱出方法頼む
Ctrl+Break無いし、Esc押しても止まらんし、しかたなく強制終了したら作ってたの全部消えたorz
982デフォルトの名無しさん:2010/07/23(金) 16:18:09
Windows+U → ソフトウェアキーボード
983デフォルトの名無しさん:2010/07/23(金) 17:19:18
それ便利だな。
いつも×ボタン連打とかタスクマネージャーから頑張ってころしてた。
984デフォルトの名無しさん:2010/07/23(金) 20:46:15
たぶん、よくみればbreakキーがみつかる
985デフォルトの名無しさん:2010/07/24(土) 00:54:24
ラップトップならBreakキーはどこかにあるはず
ネットブックだと本当に省略されてるから困る
986デフォルトの名無しさん:2010/07/24(土) 09:40:08
次の実行結果を教えてくれ。
OSとExcelのバージョンもよろしくな。
できるだけ色々なバージョンの結果を求む。

Sub 並び替え()
With Range("A1:A4")
.Value = [{"一番"; "一〇番"; "一番"; "一〇番"}]
.Sort key1:=.Item(1), order1:=xlAscending, Header:=xlNo, _
Orientation:=xlTopToBottom, SortMethod:=xlStroke
End With
End Sub

Vista & Excel2007は下だが2003とかも同じか?
一〇番
一〇番
一番
一番
987デフォルトの名無しさん:2010/07/24(土) 10:40:27
一番
一〇番
一番
一〇番

xp+2003
988デフォルトの名無しさん:2010/07/24(土) 10:54:05
一〇〇番
一〇〇番

daskin
989デフォルトの名無しさん:2010/07/24(土) 11:14:14
それを言うならduskin
990デフォルトの名無しさん:2010/07/24(土) 11:41:59
>>987
サンクス、やっぱそうなるのか。
>>988
ダスキンは俺も使ってるけど、俺のダスキンで掃いてもそうならないなぁ。

誰か他の組み合わせ求む。
OSは関係無しかも知れないけどXP+2007とかVista+2003とかいない?
991デフォルトの名無しさん:2010/07/24(土) 12:07:27
1.ExcelAにあるVBAでファイル選択ダイアログを出し、任意ExcelBファイルを開いて貰う
2.画面に開いたExcelBが表示
3.ExcelBに対して処理を実行する
4.(処理内容)各セルの値を調査する(この処理は実装済み)

1〜3を実装するにはどうすればいいでしょうか?
992デフォルトの名無しさん:2010/07/24(土) 13:07:50
>>990
7(x64)+2007 では >>986 と同じになったよ
993デフォルトの名無しさん:2010/07/24(土) 15:09:29
>>991
ダイアログで選択してもらう時に、対象のブックを変数に代入しておけばいい。
そうすりゃ開くだけじゃなくて、処理対象も、閉じる対象も全部明確化出来る。
994991:2010/07/24(土) 23:38:56
肝心なところが抜けてました
選択したブックを変数にして処理をするのは理解できました

しかし、その選択したExcelファイル内のシートもユーザに選択させたいのですが、
何かいい手はありますでしょうか?
該当ブックのシート名を全て取得し、選択ダイアログ等にするのは微妙です
ユーザに普段Excelを使う時のように各シートを自由に開ける(遷移する)ようにした上で
該当シートでマクロを再開(メイン処理)させたいのです
流石に再開させるトリガフラグが不明確過ぎで無理ですかね?
例えばユーザが各シートに切替えた時に「このシートに対してメイン処理を実行しますか?」とダイアログが
毎回出るようなトリガフラグ判定とかできませんかね?
995デフォルトの名無しさん:2010/07/24(土) 23:58:49
>>994
最初に外部Excelを開くとき、

「まず使用するシートを選択し、次にXXX(呼び出し元プログラムのどこかのボタン)を押してください」

みたいなメッセージを表示するだけじゃだめなの?
ボタンが押されたら現在アクティブなシートを処理するだけ
996991:2010/07/25(日) 00:42:38
>>995
なるほど、処理を最初から2つに分けて
1つ目の処理はファイル選択ダイアログとアラートのみで
2つ目の処理でアクティブシートにメイン処理ですか

この2つの処理って、1つ目の処理でのファイル選択ダイアログで開かれたファイル名を
2つ目の処理のトリガが発生する前に2つ目の処理に引数として渡すって事ですか?
そんな事出来るんですか?
997デフォルトの名無しさん:2010/07/25(日) 01:11:43
次スレたて
たのみます
998デフォルトの名無しさん:2010/07/25(日) 17:19:08
 
999デフォルトの名無しさん:2010/07/25(日) 17:19:13
 
1000デフォルトの名無しさん:2010/07/25(日) 17:19:33



次スレ案内



Excel VBA 質問スレ Part16
http://pc12.2ch.net/test/read.cgi/tech/1280045912/





10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。