●EXCEL・VBA質問スレ Part2●at TECH
●EXCEL・VBA質問スレ Part2● - 暇つぶし2ch1:デフォルトの名無しさん
07/05/27 00:06:58
・まじめにExcelの機能を追及してみようと思う奇特なひと
・スキルがないのに無理やりVBAの仕事を押し付けられた普通のひと
・VBAなんていまさらやりたくないのに業務で仕方なく使っているひと
・とにかく漏れにこんな仕事まわすなと怒っているひと
そんなM$大好きなひとからアンチM$なひとたちまで幅広くカバーするスレです

前スレ
スレリンク(tech板)

2:デフォルトの名無しさん
07/05/27 00:07:52
      ,..,,_             ハ
     ,r'   `l         ,.-‐' `、
  _ ○ _,. -‐丶‐ 、       )    ゝ
   / |/       ~\       ̄ヽ_/
   ノ /l  /l      トー-、_
   `l`'イ__/ |       \    ̄`ー―--、_  
    ト、_   `ヽ,   |  l           `Y" ヽ
    〈   `ー、 |  i  ;'           人_,..ノ
    ヽっ_ /  丿 r'`ー、        _ノ
       ( └l-'  ̄|   ト---─‐'" ̄
        `ー ’   `、_,/

3:デフォルトの名無しさん
07/05/27 00:35:10
>>1
乙。

エクセル2007になって拡張子が変わった。変なことしてくれるよな。
そのブックを他のブックからVBAで参照してるとも知らずに拡張子を変えて
くれたために、動かなくなった。

4:デフォルトの名無しさん
07/05/27 00:38:34
.NETに移行していってる中でいつまでも続くVB6ベースのVBA。
変数宣言と同時に初期化してしまったりする。
いつまでVB6ベースなんだろ。


5:デフォルトの名無しさん
07/05/27 07:15:06
>>1
Part3の間違い。次スレはPart4ね

6:デフォルトの名無しさん
07/05/27 18:21:25
乙>1

んで結局前スレ971=976は消えちゃったのか?
スレリンク(tech板:971番)
スレリンク(tech板:976番)


7:デフォルトの名無しさん
07/05/27 20:17:43
次スレはモーグに立ててね

8:デフォルトの名無しさん
07/05/27 23:31:11
>>4
VB6はVista環境でもOKだからな、終わりなのは.NET1.1なんだよな

9:デフォルトの名無しさん
07/05/28 01:27:22
▼━過去スレを見たい人━━━━━━━━
o2onで気長にまってたら落ちてくるかも。

o2on・・・2chのdatファイルを共有するP2Pソフトです。
現段階ではまだαバージョンですので、マターリいきましょう。

公式サイト
URLリンク(o2on.net)


10:デフォルトの名無しさん
07/05/28 02:09:10
複数の文字列変数tmp(g))がcells(l,4)に存在するか調べています。
out(syutu)が複数個あるにもかかわらず②では1つしかみつかりません。
②のやり方で動作させたいのですがうまく動作しないので
①でがまんしています。②のなにがいけないでしょうか。。。


Do Until tmp(g) = ""
For l = 1 To 2000
If tmp(g) = Cells(l, 4) Then
out(syutu) = Cells(l, 1) & "," & Cells(l, 2) & "," & Cells(l, 3) & "," & Cells(l, 4)
syutu = syutu + 1
End If
Next l
g = g + 1
Loop


Do Until tmp(g) = ""
l = 1
Do Until Cells(l, 4) = ""
If tmp(g) = Cells(l, 4) Then
out(syutu) = Cells(l, 1) & "," & Cells(l, 2) & "," & Cells(l, 3) & "," & Cells(l, 4)
  syutu = syutu + 1
End If
l = l + 1
Loop
g = g + 1
Loop

11:10
07/05/28 02:26:56
すんません
原因わかりました
途中でNULLのセルがありました。
しつれいしました。

12:デフォルトの名無しさん
07/05/28 02:40:55
セルにURLが書かれていて、HTMLの<title>から</title>までの間の文字列を取得して、
そのURLの1つ横のセルに入力するマクロを教えてください。

13:デフォルトの名無しさん
07/05/28 02:54:30
>>12
マルチウザイ

14:デフォルトの名無しさん
07/05/28 02:56:18
マルチじゃありませんよ。あれだけ探したのに

15:デフォルトの名無しさん
07/05/28 03:08:00
全く同じ質問を別のスレでもしてる>14

16:デフォルトの名無しさん
07/05/28 04:20:53



★VBAについて
 VBAとは、『Visual Basic for Application』の略で
  Application
  ├Workbooks
  |└Workbook
  |  ├Worksheets
  |  |└Worksheets
 というApplication以下のオブジェクトを、VB言語で操作するものを指します。 
 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。




17:デフォルトの名無しさん
07/05/28 09:19:17
質問です。ユーザーフォームのテキストボックスに
整数のみ(小数点も除く)入力させる制限方法って
何かいい方法ありますかねぇ?
IMEDisableだと英語も入力できてしまうし・・・
鬱になりそう・・・

18:デフォルトの名無しさん
07/05/28 09:32:35
入力制限なんていくらでもアルゴリズム解説やサンプルソースが転がってるだろ

19:デフォルトの名無しさん
07/05/28 10:04:35
>>18
(´・ω・`)ググってサンプルソースとかないからココに来たのに・・・

20:デフォルトの名無しさん
07/05/28 10:26:15
excelで、
500件以上のデータの中から同じ文字列のやつを探し出して、
抽出ではなく、1つを残して他は行ごと消去する。
というのはできますでしょうか?

説明わかりにくいので一応簡単な例も…
A  B   C   D
1 お肉  10k 1000円
2 野菜  10k 500円
3 菓子   5k  680円
4 お肉  7k  700円
5 お肉  3k  300円
6 菓子  4k  450円
7 アイス   1ケース  800円

の結果が
A  B   C   D
1 お肉  10k 1000円
2 野菜  10k 500円
3 菓子   5k  680円
4 アイス   1ケース  800円

というようになる感じです。
B列の文字から判断して値段、数量は関係なしで大丈夫です。

だれか、ご教授お願いします。
そんな僕は経理担当者。。。

21:デフォルトの名無しさん
07/05/28 11:32:43
B列をUniqで抽出してその行を選択、どっかに避難してから残りを削除ってところかな。

22:デフォルトの名無しさん
07/05/28 11:45:01
>>21
ありがとうございます。
さっそくやってみます。

23:デフォルトの名無しさん
07/05/28 11:59:15
>>19
言葉は正しく使おうね

× 無い
○ 検索仕方が悪いから見つけられてない

24:デフォルトの名無しさん
07/05/28 12:23:50
>>17
VBAは初心者? ググればすぐに見つかりますよ?
一応書いとくけど。
TextBoxのKeyPressイベントに次のコードを書けばOK。

If KeyAscii>=Asc("0") And KeyAscii<=Asc("9") Or KeyAscii=ASC(".") Then
  Exit Sub
 else
  KeyAscii=0
 End If


25:デフォルトの名無しさん
07/05/28 17:39:21
Printers コレクションとPrinter オブジェクトを使って
用紙名から用紙IDを導くことは可能でしょうか?

サンプル等があれば宜しくお願いします。


26:デフォルトの名無しさん
07/05/28 21:01:15
最近は質問だけして去っていくのが多いな~。
ググる手間が省けてるんだから、解決したら解決したことぐらい報告しろよな~。

>>25
用紙IDって?

27:デフォルトの名無しさん
07/05/28 21:12:48
自分用語かな?
~がしたいから、~が知りたいと書けばヒントになるんだがな。

28:デフォルトの名無しさん
07/05/28 21:18:00
>>17
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If Chr(KeyAscii) < "0" Or Chr(KeyAscii) > "9" Then
KeyAscii = 0
End If
End Sub


29:デフォルトの名無しさん
07/05/28 21:44:56
>>28
をいをいw

30:デフォルトの名無しさん
07/05/28 21:45:49
>>28
>>24が答え言ってるし、小数点も入力させるって言ってるし。

31:デフォルトの名無しさん
07/05/29 07:47:15
Set addshape = ActiveSheet.Shapes.AddLine(10, 10, 20, 20)
と描いたばかりの、オートシェイプがShapesコレクションの何番目か(index)や、

オートシェイプやコントロールの名前が分かっている時に、
それがそれぞれのコレクションの何番目か(index)を知るにはどうしたら良いのでしょうか?

よろしくお願いします。

32:25
07/05/29 10:03:33
>>26
「用紙ID」は判り辛かったですか。すいませんです。
つまり、A4=9 A3=8 という内部の番号です。

これをPrinterオブジェクトで指定して、
出力毎に用紙サイズを選択してレポート出力をしたいのですが、
既定(B5,A4,A3等)の用紙の番号はHELP等で明記されているので可能なのですが、
サーバプロパティで作成したユーザ定義の用紙サイズ番号が設定したPC毎に違うので、
指定ができないのです。

ですからユーザ定義の「サイズ名」を各PC同じにする事によって、
「サイズ名」から内部の番号を割り出して一覧化して
初期処理として用紙選択の一覧に加えるロジックを形成したい考えております。

検索しましたが、同じ考えを抱えている人は多いみたいですが、
約1名を除いて挫折してるみたいです。
その一名のサンプルデータは消滅していました。

URLリンク(www.accessclub.jp)
内のURLリンク(www.accessclub.jp)

どうぞ宜しくです。


33:デフォルトの名無しさん
07/05/29 14:06:50
EXCELのVBAをつかって一つのグラフエリアに2つのグラフを描きたいのですが教えてください。

34:デフォルトの名無しさん
07/05/29 15:33:59
>>33
系列1と系列2を書きたいということ?

35:デフォルトの名無しさん
07/05/29 15:43:41
>>31
配列のindexとは意味合いが違うが仕様に気をつければzorderposisionが使える

36:デフォルトの名無しさん
07/05/29 17:08:30
>>32
↓これを同期させればどう
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Print\Forms
それかWidthとHeightをVB側で指定してPagerSize=256でできないか

37:デフォルトの名無しさん
07/05/29 22:28:42
>>32
サーバプロパティとか相変わらず俺様用語だし、
そもそもPrintersコレクションって…

根 本 的 に ス レ 違 い

38:デフォルトの名無しさん
07/05/29 22:39:34
cells(1,1)=あいうえお
cells(2,1)=かきくけこ
cells(3,1)=さしすせそ
とあるとき
文字列"きく"とか"すせそ"など上の3つのセルに含まれるかを
簡単に調べる方法、関数ってありますか?

考えたのは"きく"の場合
cells(1,1)ではまず"きく"は2文字なのであい、いう、うえ・・・と順に調べていく
とゆう方法。不細工すぎて泣きそうなのでいい方法をお聞きしたく。



39:デフォルトの名無しさん
07/05/29 22:57:21
前スレでやったばっかりだけど、InStrじゃダメ?

InStr(cells(1,1),"きく") > 0

40:デフォルトの名無しさん
07/05/29 23:01:57
>>38
前スレでさんざん出てきた話だぞ?
具体的にどんな風か教えて。調べてどうしたいとか。
エクセル関数ならFIND、VBAならInstr。
>cells(1,1)ではまず"きく"は2文字なのであい、いう、うえ・・・と順に調べていく
検索対象行が10000行あったらどんだけ時間がかかると思ってるんだ…

41:デフォルトの名無しさん
07/05/29 23:16:01
>>39,40ありがとう
いるかくんとかぐぐったけど
そうゆう便利なのinstrは出てこなかったから。。

42:デフォルトの名無しさん
07/05/29 23:17:12
初歩的なこととは思いますが質問させてください…
自身のファイルがあるディレクトリとファイル(ブック)名を
知る方法がわかりません…

目的は、ブックのセーブと同時に、ブックと同じディレクトリに
hetml形式で保存(強制上書き)させたいのです。
何も考えずに
ActiveWorkbook.SaveAs _
FILENAME:="./" + ActiveWorkbook.Name + ".htm", _
FileFormat:=xlHtml
ってやったら、MyDocumentoに吐き出されてしまいました(´・ω・`)


43:デフォルトの名無しさん
07/05/29 23:25:22
ThisWorkbook.Path

44:デフォルトの名無しさん
07/05/29 23:28:51
>>42
With ActiveWorkbook
ActiveWorkbook.SaveAs _
FILENAME:= .Path & "\" & Mid(.Name, 1, Len(.Name) - 4) & ".htm", _
FileFormat:=xlHtml
End With

てか、ディレクトリ指定しなきゃThisWorkbookと同じ場所に保存されなかったっけ?
よくおぼえてねーや

45:デフォルトの名無しさん
07/05/29 23:33:11
エクセルのA列をまとめてコピーして、別途開けたノートパッドに貼り付け

これどうするの?
print #1,a
のaに列単位とかは指定できないっぽくて困ってます


46:デフォルトの名無しさん
07/05/29 23:41:53
>>45
print #なんて初めてしった。

使ったことないから知らないけど、
ForEachとかでまわして文字列で渡せば?

47:デフォルトの名無しさん
07/05/29 23:53:42
普通にA列選択してコピペすればいいじゃん
何いってるの?

48:デフォルトの名無しさん
07/05/29 23:55:03
<<46
200行くらいの大量なデータなので、ちょっとくどいかなぁと。
セルの切れ目でテキスト上改行するよう制御する必要もあるかもしれないし。
普通にマウス使えば(notepad起動・A列コピー・貼り付けで)直ぐなのですが、
諸般の事情により自動化させたいのです。

printはここで調べました。
URLリンク(www2.moug.net)

49:デフォルトの名無しさん
07/05/30 00:13:05
> 200行くらいの大量なデータなので
1個1個タイプするぐらいがちょうどいい

50:46
07/05/30 00:34:24
>>48
リンク先に答え書いてあんじゃん

>'指定範囲だけを出力したいときは .UsedRangeを _
> 指定範囲に代えればいいです。

これでできたよ。


クリップボード使えばいいのか。勉強になった。ウヒョー

51:デフォルトの名無しさん
07/05/30 00:54:02
コンパイルエラーがでる
ユーザー定義型は定義さていませんだって。

どうも
'Microsoft Forms 2.0 Object Library への参照設定が必要 _
参照設定リストに↑が無いばあいは、プロジェクトに _
いったんUserForm を挿入してすぐ解放してください。 _
これで、クリップボードとのやりとりをするDataObject _
が使用可能になります。
という箇所がわかっていないらしい

52:デフォルトの名無しさん
07/05/30 00:58:07
で?

53:46
07/05/30 01:05:44
>>51
VBEで、挿入→ユーザーフォーム
するとプロジェクトにフォームが表示されるから
右クリックで「UserFormの開放」でおk

確認は、ツール→参照設定で
Microsoft Forms 2.0 Object Libraryにチェック入ってればおk
参照設定で直接チェックいれてもおk


ついでに、

>Open myTextname For Output As io

だと上書きされるっぽいから追記したい場合は
Output → Append
に変更

いいこと教えてもらったからサービスな(はぁと
あとは自分で試行錯誤してくれぃ

54:デフォルトの名無しさん
07/05/30 01:09:55
>>46さんいろいろありがとう。
早速試してみます。

55:デフォルトの名無しさん
07/05/30 16:22:12
Type T
code As Integer
End Type

Sub abc()
Dim a As T, c As New Collection
c.Add Item:=a
End Sub

↑のコードを実行するとc.Addの行で
「コンパイルエラー:パブリックオブジェクトモジュールで定義されたユーザー定義型に限り、
変数を割り当てることができ、実行時バインディングの関数に渡すことができます。」
というエラーになってしまう。

いろいろ調べてみたところCollection側からTの型情報を取得できない?のがエラーの
原因でTを構造体ではなくてクラスにしてObjectとして渡せばOKというのはわかったんですが
構造体が必要なたびにいちいちクラスモジュールを追加するのは正直面倒くさいです
Collectionに構造体を素直にAddできる何かうまい方法ってないんでしょうか?



56:デフォルトの名無しさん
07/05/30 18:40:42
>>35
助かりました。ありがとうございます。

57:デフォルトの名無しさん
07/05/30 19:49:34
>>55
構造体管理クラス作って構造体毎にセッタゲッタ作ればいいんじゃね?

58:デフォルトの名無しさん
07/05/30 20:02:05
Enum T
code = 1
hoge = 2
hage = 3
End Enum

Sub abc()

Dim a(T.hage), c As New Collection
c.Add Item:=a

End Sub


59:デフォルトの名無しさん
07/05/30 23:42:10
エクセルを使って各セルの画素の色の
数値データ(#FFFFFFといったRGB)を
色に変えるマクロなのですが
URLリンク(uploader.fam.cx)
これだと一応動くのですが256色になってしまいます。
フルカラーで出力させるプログラムは
どのようにすればいいのでしょうか?

まったくもって初心者なので
完成されたマクロを出してくれるとありがたいです。
どなたかよろしくお願いします。

60:デフォルトの名無しさん
07/05/31 00:13:02
>>59
仕様

61:デフォルトの名無しさん
07/05/31 08:33:51
Excelは計算ソフトなので、色数は区分けに使える分だけあれば充分ということで
多くの色数を使えることよりも、使える色数減らして軽快に動くように作られてる

つまり、やろうとしてることからして、Excel使うのが間違い

62:デフォルトの名無しさん
07/05/31 09:39:27
>>59
htmlでも出力したら?

63:デフォルトの名無しさん
07/06/01 10:16:09
質問です。下記のようにコードを書いたのですが、エラーが出て
先へ進めません。修正箇所のご指摘とできれば修正後のものをお願いします。
内容はワークシートの中身をプリントするかしないかだけなのですが。

Public Sub PrintWorksheets2()
'declare variables and assign address
Dim intPrint As Integer, intCount As Integer, wkbHours As Workbook, shtCurrent As Worksheet
Set wkbHours = Application.Workbooks("t9-ex-e9.xls")
'ask user if he or she wants to print the worksheet
shtCurrent = wkbHours
For intCount = 1 To wkbHours.Worksheets.Count
intPrint = MsgBox(prompt:="Print " & shtCurrent.Name & "?", Buttons:=vbYesNo + vbExclamation)
If intPrint = vbYes Then 'if user wants to print
shtCurrent.PrintPreview
End If
Next intCount
End Sub

64:デフォルトの名無しさん
07/06/01 10:35:34
83265 2007/5/29 20:00 17.206 41.677  *
83267 2007/5/29 20:00 17.206 41.677  *
83268 2007/5/29 20:10 17.162 41.635
83269 2007/5/29 20:20 17.157 41.638
83271 2007/5/29 20:30 17.162 41.642
83273 2007/5/29 20:40 17.147 41.625
83275 2007/5/29 20:50 17.153 41.637  **
83277 2007/5/29 21:10 17.16 41.645  **

こういった10分ごとのデータが大量にあります。
*の列にあるように、重複データがあったり、
**の列のように間が飛んだりしていいます。
*は重複を削除、**には空白行を挿入して、
完全な10分置きの時系列データにしたいのですが。

数か月分をやれといわれたのですが、一つずつ目で
追ってる状態です。この初心者厨に
書いていただけませんか?
スレ違いなら、スレ教えてくださいませ。


65:デフォルトの名無しさん
07/06/01 11:43:03
行数分の配列用意して、
1行取得して、foreachで重複行チェック、
同じのがあったら配列のフラグたてる
データの行数分繰り返す。

あとは配列チェックしながら
削除するなり転記するなりでいいのでは?

66:デフォルトの名無しさん
07/06/01 11:44:54
これじゃあ、空白行に対応してないわな。スマソ

67:デフォルトの名無しさん
07/06/01 12:19:48
>>63
どこからつっこもうかと….
まず間違い箇所.
>shtCurrent = wkbHours ←型が違う上にオブジェクトにはSetステートメントがいる.
>intPrint = MsgBox(prompt:="Print " & shtCurrent.Name & "?", Buttons:=vbYesNo + vbExclamation)
shtCurrent.Name て…

一応プログラムはWorkbooks("t9-ex-e9.xls") の全部のシートを対象にしてるみたい
なので,修正を書いておくね.

68:デフォルトの名無しさん
07/06/01 12:22:07
Public Sub PrintWorksheets2()
'declare variables and assign address
Dim intPrint As Integer, wkbHours As Workbook, shtCurrent As Worksheet
Set wkbHours = Application.Workbooks("t9-ex-e9.xls")
'ask user if he or she wants to print the worksheet

For Each shtCurrent In wkbHours.Worksheets
 intPrint = MsgBox(prompt:="Print " & shtCurrent.Name & "?", Buttons:=vbYesNo + vbExclamation)
 If intPrint = vbYes Then 'if user wants to print
 shtCurrent.PrintPreview
 End If
Next
End Sub

ちなみにWorkbooks("t9-ex-e9.xls")がそのマクロが含まれているブックなら
ThisWorkBookでOK. もっと短くなる。

69:デフォルトの名無しさん
07/06/01 12:25:24
2024/7/5または45478の値を
2007/05/24または39226に変換するにはどうしたらいいですか?

70:デフォルトの名無しさん
07/06/01 12:30:22
>>64
列の構成がどうなっているかわからないよ?どこまでが一つの列なのか。
あとは、最初の83265とかの意味も。
もう一つは重複している場合、その列は必ず連続しているか、10行あとに
あったりするのかとか。

>>69
???
意味が不明。 2007/05/24→39226に変換という意味じゃなさそうだね?

71:69
07/06/01 12:39:54
>>70
2024/7/5→24/7/5
年/月/日→日/年/月になっていて
ほんとは07/05/24なんです


72:64
07/06/01 12:48:39
>>70
説明がまったくもって馬鹿でした。
*列、**列ではなく、*行、*行でしたすみません。
重複している場合は必ず連続しています。

2007/5/29 20:00 17.206 41.677  *
2007/5/29 20:00 17.206 41.677  *
2007/5/29 20:10 17.162 41.635
2007/5/29 20:20 17.157 41.638
2007/5/29 20:30 17.162 41.642
2007/5/29 20:40 17.147 41.625
2007/5/29 20:50 17.153 41.637  **
2007/5/29 21:10 17.16 41.645  **

こういった10分ごとのデータが大量にあります。
*の行にあるように、重複データがあったり、
**の行のように間が飛んだりしています。
*は重複を削除、**には空白行を挿入して、
完全な10分置きの時系列データにしたいのですが。

数か月分をやれといわれたのですが、一つずつ目で
追ってる状態です。この初心者厨に
書いていただけませんか?
スレ違いなら、スレ教えてくださいませ。


73:デフォルトの名無しさん
07/06/01 12:51:35
>>71
日/年/月の並びは面白いね…。
それを直せるエクセル関数はないかってこと?
それともVBA?

74:デフォルトの名無しさん
07/06/01 12:54:52
>>72
64で書いていた最初の83265とかは無視していいの?
あと、どこまでが一つのセル?


75:デフォルトの名無しさん
07/06/01 12:56:17
>>72
とりあえず重複なんか
フィルタ使えばいーだろ

わからなきゃ「Excel フィルタ 重複」とかでググれ

76:デフォルトの名無しさん
07/06/01 13:04:55
>>74

83265 2007/5/29 20:00 17.206 41.677  *
83267 2007/5/29 20:00 17.206 41.677  *
83268 2007/5/29 20:10 17.162 41.635
83269 2007/5/29 20:20 17.157 41.638
83271 2007/5/29 20:30 17.162 41.642
83273 2007/5/29 20:40 17.147 41.625
83275 2007/5/29 20:50 17.153 41.637  **
83277 2007/5/29 21:10 17.16  41.645  **
    I       I   I    I     I

の値ごとにセルが分かれています。
データによってセルが増えるデータもあるのです。
最初のは整理番号なのでやはりあったほうがよいです。

77:デフォルトの名無しさん
07/06/01 13:24:30
MyDate = Format(Sheets("Sheet1").Cells(GYOU1, 1), "mm/dd/yy")
Sheets("Sheet1").Cells(GYOU1, 1) = "20" & MyDate

78:デフォルトの名無しさん
07/06/01 14:15:30
>>76
どっちの整理番号を残すとかは考えずにいきます.
このスレ的には問題あるかもしれないけど,一応動くので.
Private Sub Sample()
Dim targetCell As Range
Dim date1 As Date,date2 As Date,date3 As Date
Dim intervalMin As Integer

Set targetCell = Range("B1")  ←最初に日付が入っているセル
Do Until targetCell.Cells(2,1)=""
 date1=targetCell+CDate(targetCell.Cells(1,2))
 date2=targetCell.Cells(2,1)+CDate(targetCell.Cells(2,2))
 interval = DatePart("n",date2-date1)
 If interval=0 Then
  Rows(targetCell.Cells(2,1).Row).Delete
  ElseIf interval>10 Then
   Rows(targetCell.Cells(2,1).Row).Insert
   date3=DateAdd("n",10,date1)
   targetCell.Cells(2,1)=Format(date3,"yyyy/M/d")
   targetCell.Cells(2,2)=Format(date3,"hh:mm")
 End If
 Set targetCell=targetCell.Cells(2,1)
Loop
End Sub

79:78
07/06/01 14:21:54
4行目,Dim interval As Integerの間違い
この場合,重複している時間のデータは2番目のデータが消える.

80:デフォルトの名無しさん
07/06/01 14:24:59
>>64
Sub NURUPO()
Sheets("Sheet2").Range("A1:E65536").ClearContents
LastRow = Sheets("Sheet1").Cells.SpecialCells(xlLastCell).Row
GYOU2 = 1
For GYOU1 = 1 To LastRow
If Sheets("Sheet1").Cells(GYOU1, 3) <> Sheets("Sheet1").Cells(GYOU1 + 1, 3) Then
For RETU = 1 To 5
Sheets("Sheet2").Cells(GYOU2, RETU) = Sheets("Sheet1").Cells(GYOU1, RETU)
Next RETU
GYOU2 = GYOU2 + 1
End If
If Sheets("Sheet1").Cells(GYOU1 + 1, 3) - Sheets("Sheet1").Cells(GYOU1, 3) >= 0.006945 Then
GYOU = Fix((Sheets("Sheet1").Cells(GYOU1 + 1, 3) - Sheets("Sheet1").Cells(GYOU1, 3)) / 0.006944)
GYOU2 = GYOU2 + GYOU - 1
End If
Next GYOU1
End Sub

81:デフォルトの名無しさん
07/06/01 14:32:00
>>78さん。
わざわざありがとうございました。動きました。
しかし、わたしの方の説明が悪く…。

83277 2007/5/29 21:10 17.16  41.645  
    I       I   I    I     I

ではなく

83277 2007/5/29 21:10 17.16  41.645  
    I           I    I     I

でした。日付と時刻は同一セルです。
申し訳ないです。見捨てずお願いします。


82:78
07/06/01 15:05:11
>>81 それを早く(ry  そっちの方が簡単だから。
Private Sub Sample()
Dim targetCell As Range
Dim date1 As Date, date2 As Date, date3 As Date
Dim interval As Integer

Set targetCell = Range("B1") 'Range("B1")の所は最初の年月が入っているセル
Do Until targetCell.Cells(2, 1) = ""
 date1 = CDate(targetCell)
 date2 = CDate(targetCell.Cells(2, 1))
 interval = DatePart("n", date2 - date1)
 If interval = 0 Then
  Rows(targetCell.Cells(2, 1).Row).Delete
  ElseIf interval > 10 Then
   Rows(targetCell.Cells(2, 1).Row).Insert
   date3 = DateAdd("n", 10, date1)
   targetCell.Cells(2, 1) = Format(date3, "yyyy/M/d hh:mm")
   Set targetCell = targetCell.Cells(2, 1)
  Else
   Set targetCell = targetCell.Cells(2, 1)
 End If
  targetCell.Select
Loop
End Sub


83:78
07/06/01 15:09:14
下から3行目のtargetCell.selectはあってもなくてもいい。
ちなみにこれは同時刻だったらあとのデータが一緒でもそうでなくても
消す。時刻以外の値も重複していないといけないのなら>>80さんのを参考に。

で、念のためシートをコピーしてそのシートで試したほうがいいよ。
マクロの画面でF8キーを押していくと動作をその都度動きを確認できる。
その場合はtargetCell.selectはあったほうがいいけど。

84:デフォルトの名無しさん
07/06/01 15:22:19
>>78
ありがとうございました。しっかり動きました。
今までは、一時間に144データなので
隣の列に1~144を貼り付けて目で追ってました。

ホント感謝します。ペコリ。

>>80さんもありがとうございます。
次への参考とさせてもらいます。

85:デフォルトの名無しさん
07/06/03 10:45:26
いつもお世話になっています。
>>78さん、快適に動いています、
が、少し問題が出ました。

パターン1
84017 2007/6/1 9:50 17.111 41.619
84032 2007/6/1 12:00 16.977 41.501
分が連続していたらここは認識してくれない。

パターン2
84090 2007/6/1 16:50 17.056 41.605
2007/6/1 17:00
84099 2007/6/1 18:10 17.206 41.71
時間以上の欠落は無視する。

です。もしよろしければ教えてください。お願いします。



86:78
07/06/03 13:19:43
>>85
休日にお疲れです。
えっと、>>82の「interval = DatePart("n", date2 - date1)」の部分を
       「interval = DateDiff("n", date1, date2)」に変えてください。
少なくとも俺のパソコンではうまくいってる。 ちょっとミスってしまった。スマソ。


87:デフォルトの名無しさん
07/06/03 16:52:49
>>78さん

重ね重ねありがとうございます。
ばっちり動きました。がっつり空いたデータ間に
あっというまに行が空けられる所を見ていると、
とてもうれしげです。

ありがとうございました。ペコリ。

88:デフォルトの名無しさん
07/06/03 18:58:35
すいません。質問です。
Linuxの改行コードを記述する方法はないでしょうか。
Linuxが出力したcsvファイルをWindows(excel)でFSOを用いて
加工しているのですが、改行コードが異なるようで、
読み込んで別のファイルに出力するとサイズが変わります。

excelで加工後、ファイルによってはもう一度Linuxに戻すため、
できればLinuxの改行コードを挿入したいのですが、方法が
ありましたら教えてください

89:デフォルトの名無しさん
07/06/03 19:17:43
>>88
日本語とか入ってたら文字コード自体も変換しないとだめなんでは?
変換はlinuxのnkfなどでできる


90:デフォルトの名無しさん
07/06/03 19:24:51
LinuxだとLFかな?
WriteLineを使わずに Fso.Write(string & vblf) とするとか。

91:デフォルトの名無しさん
07/06/03 19:25:47
改行コードはWinの方が1バイト多いからLinuxなら読めるでしょ
余分なコードつきで

92:デフォルトの名無しさん
07/06/04 14:34:37
すいません、ちょっと質問なんですが、EXCEL2007ってFileSearch使えないんですか?

93:デフォルトの名無しさん
07/06/04 17:53:35
マクロ記録してみれば?

94:デフォルトの名無しさん
07/06/06 01:06:41
透過画像(GIF)を表示させてデスクトップとかフォームの下が見えるようにしたいんですが、
フォームにGIFを表示させても単にフォームを透過するだけで、意図した表示ができません。

要するにフォーム自体を透過させる必要があるんだと思いますが方法が分かりません。
どなたかご教授願います。

95:デフォルトの名無しさん
07/06/06 01:46:31
>>94
シェイプでやったらどうでしょう
今から変更は大変だろうけど
やり遂げた達成感はかなり得られるでしょう

96:デフォルトの名無しさん
07/06/06 06:51:22
他のドロー系ソフトを使ってGIF→WMFもしくはEMF化すれば大丈夫か。
メタファイル系ならオートシェイプと同じ扱いになるので

試しに「GIF WMF 変換」や「GIF EMF 変換」でぐぐってみたら
フリーソフトが結構あるな。

97:デフォルトの名無しさん
07/06/06 16:18:34
APIがあるんだけど難しいよ

98:デフォルトの名無しさん
07/06/06 21:38:45
>>95-97
シェイプが何かすらわからないド素人ですが、何から始めたら良いかも
分からないと言う状況だったのでググって探す取っ掛かりになりました。

時間は掛かると思いますが挑戦してみます。

99:デフォルトの名無しさん
07/06/08 10:27:05
ググってもわかりませんでした。教えてください。

テキストに
AA a: 01 b: 01,02,03,04 c:
AB a: 01,02 b: c:01





と書いてあるものがあります。
AA,ABともに、aの後に続く数字が全部でいくつあるのが、
bの後に続く数字がいくつあるのかという風に抜粋して、
数えた数字をエクセルに書き換えたいのですが
どうもがいてもわかりません。

どなたかおしえていただけませんでしょうか?
説明下手でごめんなさい。




100:デフォルトの名無しさん
07/06/08 12:02:43
>>99
もう少し具体的なテキストと、その場合の要求する結果のサンプルをよろしく。

101:デフォルトの名無しさん
07/06/08 12:56:28
Excel関係なく、単純なテキストファイル解析でしょ。
単にその結果をExcelシートに出力するってだけの話なので、セルへの代入以外はVBAの分野じゃないよな。>>16

ということで、このスレの範疇の部分だけ答えると、セルへの代入は、代入するセルのRangeオブジェクトに対して
「.Value = 代入値」ですよ、ってことで終わりだな。あとはスレ違いなのでよろしく。

他の人にも言っておくが、Excel付属のVBAでやるにしても、Excelのインスタンス使わずにVBScriptでもVB6でも出来るようなことは、
 VBA = [VB]言語による[A]pplication(Excel)操作
の分野ではなく、VB言語の分野なので、ここではスレ違いになるってことを覚えておいてね。
>>1に書いてある通り、VBA分野の話ならどんな事情でVBA使ってようと構わないけど、VBAの分野じゃないことをあえてVBAでやってるだけの奴はNGね。

102:デフォルトの名無しさん
07/06/08 13:03:14
頭固いなぁ

103:デフォルトの名無しさん
07/06/08 13:10:35
いや、そうでもないか

104:デフォルトの名無しさん
07/06/08 13:11:12
>>99

まずテキストのまま正規表現使って全ての数字を消すと
AA a: b: ,,, c:
AB a: , b: c:
のようになる
エクセルにコピーして区切り文字を":"にすると
AA a|  b|,,, c|   |
AB a|, b|  c|   |
とセルが分かれ後は","の数を数えて+1する関数をVBAで
作ればOK

105:デフォルトの名無しさん
07/06/08 14:43:43
>>104
それじゃ最初から数字がない場合と
数字が一つだけでカンマなしの
区別つかなくね?

106:デフォルトの名無しさん
07/06/08 17:49:21
>>105
それではこんな感じで
a:->:に変換
[a-z]:->:

エクセルにコピーして区切り文字を":"にすると
|01  |01,02,03,04|   |
|01,02|        |01 |

Sheet2に
=CountData(Sheet1!A1)
=CountData(Sheet1!A2)
ドラッグして必要なとこまで埋める

関数
Function CountData(a As String)
sa = Split(a, ",")
b = UBound(sa)
If b < 0 Then
CountData = 0
Else
CountData = b + 1
End If
End Function


107:デフォルトの名無しさん
07/06/10 18:48:31
Vista Ultimate, Excel2007です。

コントロールのボタンを作成(貼付け)したところ、
マクロ名を入力するダイアローグが出てきて、マクロ名を入力しました
(そのボタンに対応する処理のマクロを事前に作っていたので)。

その後、TextBoxの処理をする必要が出てきたため、
Private Sub CommandButton1_Click()の編集画面を表示するために
開発→デザインモードをクリックして、ボタンをクリックしたのですが
Private Sub CommandButton1_Click()の編集画面が表示されません。

どういう操作をすれば
Private Sub CommandButton1_Click()の編集画面が表示されるのでしょうか。

よろしくお願いします。



108:デフォルトの名無しさん
07/06/11 00:57:26
複数列のセルをフーリエ解析したいのですが、
A列からD列まで一列一列手動でやってマクロを記録したら下記のようになったのですが、
これをA列からIV列まで一気に行いたい場合にはどうまとめれば良いですか?


Application.Run "ATPVBAEN.XLA!Fourier", ActiveSheet.Range("$A$1:$A$256") _
, ActiveSheet.Range("$A$258"), False, False
Application.Run "ATPVBAEN.XLA!Fourier", ActiveSheet.Range("$B$1:$B$256") _
, ActiveSheet.Range("$B$258"), False, False
Application.Run "ATPVBAEN.XLA!Fourier", ActiveSheet.Range("$C$1:$C$256") _
, ActiveSheet.Range("$C$258"), False, False
Application.Run "ATPVBAEN.XLA!Fourier", ActiveSheet.Range("$D$1:$D$256") _
, ActiveSheet.Range("$D$258"), False, False

End Sub


109:デフォルトの名無しさん
07/06/11 01:57:51
普通にやればいいだけだよ

110:デフォルトの名無しさん
07/06/11 07:58:33
VBAでFREQUENCY関数を使いたいのですが、
キーボード入力の時の”配列数式の入力”は、
VBAでは、どう記述すれば良いのでしょうか。

よろしくお願いします。


111:デフォルトの名無しさん
07/06/11 08:05:38
つ FormulaArray

つーかVBAヘルプを 配列数式 で検索してみたらトップに出てくるじゃん

112:110
07/06/11 14:09:22
>>111

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


113:107
07/06/11 14:48:11
現象の追加情報です。

デザインモードにして、コントロールにカーソルを合わせると、
ラベルやテキストボックスは、
カーソルが矢印付きの十字(コントロールを移動できる表示)に
変わるのですが、ボタンについては指の形のままです。

このデザインモード(ラベルにカーソルを合わせると矢印付きの十字に
変わる状態)のまま、カーソルをボタンの上に持って来てクリックすると
ボタンに関係付けられたマクロが実行されます。

これって正常な動作なんでしょうか?




114:デフォルトの名無しさん
07/06/11 20:40:20
どうでもいい

115:デフォルトの名無しさん
07/06/12 01:28:42
質問です。
Excel2000で以下のようにあるブックから新しいブックを作り
セルをCopyメソッドを使用してコピーしようとすると
「RangeクラスのCopyメソッドが失敗しました」と
エラーになってしまうのですが
CopyとPasteメソッドをつかってそれぞれのブックを
Activateにしてコピーしないと無理でしょうか?


Dim xlsApp As Excel.Application
Set newBook = Excel.Application

With newBook

Set newBk = .Workbooks.Add

~編集処理~

Workbooks(ブック1名称).Activate

Workbooks(ブック1名称).Application.Worksheets(シート名).Range("A1:A20").Copy _
.Workbooks(ブック2名称).Application.Worksheets(シート名).Range("A1")

End With

116:デフォルトの名無しさん
07/06/12 02:40:26
>>115
Set newBk = Workbooks.Add

Workbooks(ブック1名称).Worksheets(シート名).Range("A1:A20").Copy _
newBk.Worksheets(シート名).Range("A1")

こういうことか?


117:デフォルトの名無しさん
07/06/12 17:02:19
Excel2007です

新規ブックでシート上にシェイプを作成し、そのシェイプにマクロを登録します。
シェイプに登録したマクロはこれです。
sub a
thisworkbook.close
end sub

このシェイプをクリックするとエクセルが終了してしまいます。
「問題が発生したため・・・・」

この問題を回避する方法はありますか?


118:項目によるセルの参照ないし選択?
07/06/12 19:21:52
Excel2000のユーザーでVBAの入門者です。

[表]
列に最高気温、最低気温、平均気温という三つの項目を入れ 行に日付の項目を入れた表を
つくりました。下記はその具体例です。
A2 = "2007年1月1日", A3 ="2007年1月2日", A4 = "2007年1月3日",....(以後果てしなく続く)
B1 = "最高気温", C1 = "最低気温", D1 = "平均気温"

[VBAでやりたいこと]
例えば、2007年1月1日の最高気温の値をVBAで入力する場合に、A列の行から"2007年1月1日"
という値の入っているセル番号を探し、"最高気温"の項目と交わるセルをセレクトしたい。
セル番号で直接参照して選択させる方法だと汎用性がないので、項目によって参照させたいんです。

119:デフォルトの名無しさん
07/06/12 19:54:23
>>117
そのマクロを実行しない

120:デフォルトの名無しさん
07/06/12 20:05:58
>>118
A2を選択して
データ->フィルタ->オートフィルタ

121:項目によるセルの参照ないし選択?
07/06/12 22:32:41
>>120
助言して下さって、どうも有難う御座います。私の説明が間違っていたんでしょうか、
オートフィルタは私のやりたいこととはかなり違う気がします。
アクティブではなく「セレクト」という表現を使ったのがまずかったかもしれません。
正確な用語法が分からなくてすみません。

122:デフォルトの名無しさん
07/06/12 22:59:16
>>121
セル番号で直接参照して選択させる方法って何?

項目で参照させたいならセルに名前をつければ?

123:デフォルトの名無しさん
07/06/13 00:43:57
>>118
Find メソッドを使う
ワークシート関数のINDEX 、VLOOKUPを使う

124:デフォルトの名無しさん
07/06/13 09:07:26
どなたかご存じでしたら教えてください。

VBAからJAVAのクラスを使用するための手順を
ご存じでしたら教えてください。
(JAVAのアプリを実行する手順ではないっす)
JNIを使ってJAVAを呼び出すのでしょうか?

当方、VBAもJAVAも初心者なもんで、一連の流れを書いてくれると
ありがたいです。

スレチだったらスンマセン

125:デフォルトの名無しさん
07/06/13 09:22:55
>>124
スレ違いなのでさようなら
参考までに>>101の後半読んでおいてね

126:ここでナット
07/06/13 09:49:13
ちょっとアホな質問かもしれないですが、

VBAのフォームのソースだけを変更して、

それ以外の標準モジュールやシートの内容は

そのままにする事をプログラム化する方法は

ありますでしょうか?

※ボタンを押すだけでソースだけ更新みたいな事です。



127:デフォルトの名無しさん
07/06/13 09:59:13
VBAでグラフを描きたいのですが、第2軸の目盛の最大、最小の指定は
どうすれば良いのでしょうか。
(下記は主軸の場合ですが、どのように変えれば良いのでしょうか)

With .Axes(xlValue)
.MinimumScale = 0
.MaximumScale = 1
End With

よろしくおねがいします。

128:デフォルトの名無しさん
07/06/13 10:17:52
>>127
操作をマクロに記録して睨めっこ。

129:デフォルトの名無しさん
07/06/13 10:37:42
どこで聞いて良いかわからなかったんだが、
膨大な量の乗車案内を検索かけたいんだが、何か良い方法はないだろうか?
東京→上野
東京→新宿
東京→池袋
東京→・・・
   ・
   ・
   ・

130:117
07/06/13 10:40:04
>>119
ありがとうございます。
現在はその回避方法を採用するつもりです。

ただ、その現象が当方の環境によるものかが判断できません。
みなさんの所でも同じ現象が起こりますでしょうか?

また、他の回避方法もありましたらお教えください。

131:デフォルトの名無しさん
07/06/13 11:44:24
>>126
具体的には?

132:ここでナット
07/06/13 11:59:54
>>131

ソースに不具合があったので、ソースだけ更新を行いたいです。

エディター画面を開いてソースを書き換える作業すれば良い事なのですが

その作業を行える人がいないので、簡単にソースだけを書き換える方法を探してます。

例えば、別のExcelマクロを用意してその中に新しいソースを入れて、

ボタンを押して実行すると、変更先のExcelマクロのソースだけが更新するみたいな

事がやれたらいいなと思っています。



133:デフォルトの名無しさん
07/06/13 18:15:41
>>130
当該ブックのみ終了。再現しません


134:デフォルトの名無しさん
07/06/13 18:26:31

>>132
 . . .
具体的には?

URLリンク(dictionary.goo.ne.jp)


135:デフォルトの名無しさん
07/06/13 19:08:08
>>132
エクスポートインポート

136:デフォルトの名無しさん
07/06/14 01:29:13
教えてください。
ボタンを押すと、C→File→にあるdata.csvを開いて処理開始なんですが、
データが無い場合にエラーメッセージを表示するよう仕組んでと言われまして。

ChDir "C:\File\data.Csv"
Workbooks.Open Filename:= _
"C:\File\data.Csv"

とこのあと、if then 文を書けばいいと思うのですが、
If Dir("C:\File\data.Csv") = "" Then
MsgBox "DataBook.xlsは見つかりません"
End If
Exit Sub
こんなん書いたんですが、勿論動きません。
IF文以下お教え願います。


137:デフォルトの名無しさん
07/06/14 01:31:43
すみません、表記間違ってました。

MsgBox "DataBook.xlsは見つかりません"

  ↓

MsgBox "data.csvは見つかりません"  の間違いです


138:デフォルトの名無しさん
07/06/14 01:35:16
あとじゃなくて先にしろ

139:デフォルトの名無しさん
07/06/14 06:08:04
If Dir("C:\File\data.Csv") = "" Then
 MsgBox "data.csvは見つかりません"
 Exit Sub
End If
 ファイルオープン処理

動かなければどこのコードで動かないのか確認してから考えた方が…。


140:127
07/06/14 10:54:26
>128

レスありがとうございます。それしかないですか^^;



141:デフォルトの名無しさん
07/06/14 11:08:33
EXCEL2007のVBAで、複合グラフ(折れ線)を描いたのですが、
グラフの描画領域が、指定したセル範囲をオーバーして描かれます。
指定したセル範囲に収まるようにするには、どうすれば良いのでしょうか

列(縦)方向はぴったり合うのですが、
行(横)方向に幅がオーバーします(左端も少しセルの左端からズレます)。

<コード>
Dim dataRg As Range, graphRg As Range
Sheets("DATA1").Select
Set dataRg = Sheets("DATA1").Range(Cells(data_row_from, data_col_from), Cells(data_row_to, data_col_to))
Set graphRg = ActiveSheet.Range(Cells(graph_row_from, graph_col_from), Cells(graph_row_to, graph_col_to))
Sheets("CHART").Select

With ActiveSheet.ChartObjects.Add(graphRg.Left, graphRg.Top, graphRg.Width, graphRg.Height).Chart
.SetSourceData Source:=dataRg, PlotBy:=xlColumns
.ChartType = xlLine
.HasTitle = False
.Axes(xlCategory, xlPrimary).HasTitle = False
.Axes(xlValue, xlPrimary).HasTitle = False
.HasLegend = False

.SeriesCollection(1).Border.ColorIndex = 41
.SeriesCollection(2).Border.ColorIndex = 53
.SeriesCollection(2).AxisGroup = xlSecondary
End With


142:デフォルトの名無しさん
07/06/14 13:39:11
>>140
With ActiveChart.Axes(xlValue, xlSecondary)
.MinimumScale = 0
.MaximumScale = 1
End With

143:117
07/06/14 13:52:30
>>133
そちらの環境では再現しませんでしたか。
情報ありがとうございます。

もう一台、2007をインストールしたPCを用意したのですが、
そちらでも100%再現しました。

マクロを直接実行した場合は問題なく当該ブックのみ終了するのですが、
そのマクロをシェイプに登録し、そのシェイプをクリックすると
ブックが閉じたあとにExcelが異常終了してしまいます。

ブックを変更していた場合、保存を確認するダイアログがでますが、
「キャンセル」を選択した場合は問題なく、「はい」「いいえ」を
選択した場合は異常終了となります。

ただ、他のブックを開いている場合は当該ブックのみ終了し、
Excelの異常終了はありません。

前回質問時はUpdateしてませんでしたが、Updateした環境でも
同様でした。

とりあえず、他の掲示板などでも同じ質問をしてみてから
マイクロソフトに問い合わせをしてみようと思います。

ありがとうございました。

144:デフォルトの名無しさん
07/06/14 15:20:06
>>132
VBE.CodeModuleのInsertLines(), DeleteLines(), ReplaceLine()あたり。
VBEを使うには、なにか制限なり手順なりがあったような気もする。
実行も、セキュリティレベルを下げる必要があるかも。

まぁ、そのような状況にならないように、アプリはアドインで作った方がいい。

145:デフォルトの名無しさん
07/06/14 15:33:12
>>143
他の環境でも再現するんだ
何か共通でインストールしてるものに影響されてるのかな?

146:144
07/06/14 15:37:08
URLリンク(sourceforge.jp)から、vbaunitというのをダウンロードして、
新規Bookを開き、参照設定でVBAHelper.xlaと「Microsoft Visual Basic for Applications
Extensibility 5.3」を参照する。
新規にモジュールを作成し(Module1)、次のコードを貼り付け実行すると、3行目が修正される。
Option Explicit

Sub foo()
Dim cm As CodeModule
Set cm = VBAHelperModule.VBAHelperLookupCodeModule("Module1")
cm.ReplaceLine 3, "Sub bar()"
End Sub


147:117
07/06/14 18:15:07
>>145
こちらのテスト環境ですが、どちらも XP Pro SP2 で Office 2007 Enterprise です。
ただ、一方は Virtual PC 上の XP に Excel2007 のみをインストールした状態です。

今のところ考えられる条件は
・シェイプにマクロを割り付けてクリックで実行
・現在のブックのウインドウが閉じられる
・他のブックのウインドウが開いていない

thisworkbook.close 以外にも、これらのコードでもだめでした。
 workbooks(1).close
 window(1).visible = false

148:デフォルトの名無しさん
07/06/14 19:01:36
>>147
なるほど、おそらく2007固有の現象ということですな
2007持ってないんで他の持ってる人に試してもらいたいね

149:140
07/06/15 09:13:16
>>142
レスありがとうございます

150:デフォルトの名無しさん
07/06/15 16:13:53
Rangeの最初の位置を(左上)得たいのですが、どうするのが簡単なんでしょ。

ActiveSheet.Range("テーブル[列]").Offset(0, 0)

Offsetでよいのかな?うまくいっているみたいですけど

151:デフォルトの名無しさん
07/06/15 16:19:45
ActiveSheet.Range("テーブル[列]")(1)

など



152:150
07/06/15 16:26:32
Excel2007です。
>>151
サンクスです。

でじつは、Rangeオブジェクトを for で回そうと、

Dim StartCell As Range, LastCell As Range
Set StartCell = ActiveSheet.Range("テーブル[列]").Offset(0, 0)
Set LastCell = ActiveSheet.Range("テーブル[列]").End(xlDown)

' 資産に関連するもの更新
For i = StartCell.Row To LastCell.Row
   CalculateTable (ActiveSheet.Cells(i, 4))
Next i

としていたのですが、もっと簡単な書き方はないでしょうか?

Dim Cell As Range
For Each Cell In ActiveSheet.Range("テーブル[列]")
   CalculateTable (Cell)
Next
とすると、 CalculateTable (Cell) で、オブジェクトが必要です、と怒られてしまいます。 orz


153:150
07/06/15 16:30:12
>>152
うああああ、
   CalculateTable (Cell)
じゃなくて、
   CalculateTable Cell
にしたら、エラーでなくなった orz
マジVBAわかんねえええええ。

なんだこら

154:デフォルトの名無しさん
07/06/15 16:37:34
関数単体で引数()でくくるとなりますね

155:デフォルトの名無しさん
07/06/15 21:01:14
たぶん配列とまぎらわしいからだろ

156:初心者
07/06/17 13:50:18
はじめまして、VBAをやり始めたばっかりで全然わからないので教えて下さい。

(1)1+2+3+…+10を計算する
(2)1+3+5+…+19を計算する
(3)1+4+9+…+100を計算する
と言う問題で以下の空欄にあてはめるものを答える問題です。

Sub ex()
Dim x As Integer, sum As Integer
sum = 0
For x = 1 To 10
(空欄)
  Next x
Msgbox "合計=" & sum
End Sub

長々とすみません。よろしくお願いします。

157:デフォルトの名無しさん
07/06/17 13:58:01
>>156
宿題だとばれると教えてもらえないから、もう少し、利き方変えた方がいいぞ

あと「よろしくお願いします」って、お前他力本願スギ。
どこが、わからなくて、どこで詰まっているかを質問しよう。

158:デフォルトの名無しさん
07/06/17 14:01:01
(1) sum = sum + x
(2) sum = sum + (2*x -1)
(3) は自分で考えろ馬鹿

159:初心者
07/06/17 15:52:53
すいません。(3)がわかりません

160:デフォルトの名無しさん
07/06/17 16:36:26
sum = sum + (5*x -1)

161:初心者
07/06/17 17:02:14
なぜそうなるのでしょうか?

162:デフォルトの名無しさん
07/06/17 17:12:23
>>160
ワロタ

163:デフォルトの名無しさん
07/06/17 17:48:13
>>161
悪いことは言わん。
算数からやり直せ。

164:デフォルトの名無しさん
07/06/17 18:14:15
なんでまたVBAのスレに質問してくるの?
VBAどころか、ただのアルゴリズム…いや、算数か。の問題だろ。

法則を考えろよ…。

165:デフォルトの名無しさん
07/06/17 18:27:48
言っておくけど160のは違うぞ。

ヒント。
sum=1+4+9+16+25+36+49+64+81+100
これで分からなければ終わってる。

166:デフォルトの名無しさん
07/06/17 18:41:58
気がつかなかった俺オワタw

167:デフォルトの名無しさん
07/06/17 18:46:23
わからない。答え教えてもらえないですか?

168:デフォルトの名無しさん
07/06/17 18:56:47
(3)は
sum=sum+(x*x)


169:デフォルトの名無しさん
07/06/17 18:57:32
>>156
(2)
For i = 1 To 19 Step 2: sum = sum + i: Next: Exit For

(3)
Select Case x
Case 1: sum = sum + 1
Case 2: sum = sum + 4
Case 3: sum = sum + 9
Case 4: sum = sum + 16
Case 5: sum = sum + 25
Case 6: sum = sum + 36
Case 7: sum = sum + 49
Case 8: sum = sum + 64
Case 9: sum = sum + 81
Case 10: sum = sum + 100
End Select

これでいーだろ







まじめに(3)のヒントだすなら「^2」


170:デフォルトの名無しさん
07/06/17 19:06:07
コーディングより1+4+9+…+100が全くわからなかった。
オワテルwww

171:デフォルトの名無しさん
07/06/17 19:30:52
をいをい…。

つうか>>156、その問題は学校の問題か?職場の問題か?

172:デフォルトの名無しさん
07/06/17 20:30:10
>>169
ヒント:「For x = 1 To 10」部分は固定

173:169
07/06/17 21:01:49
>>172
ん?
(2)のことならxでループさせてないんだけど?
試してないからわからんけど、ネストされたForで答えでない?

意味取り違えてたら堪忍

174:初心者
07/06/17 21:49:26
2乗はどうあらわしたらいいのですか?

175:デフォルトの名無しさん
07/06/17 21:55:05
>>174
>>169

176:デフォルトの名無しさん
07/06/17 23:10:44
>>173
Sub ex()
Dim x As Integer, sum As Integer
sum = 0
For x = 1 To 10
(空欄)
  Next x
Msgbox "合計=" & sum
End Sub

の中で変えて良いのは(空欄)の部分だけ
単に(1)(2)(3)の計算ルーチンを作れば良いだけではなく
1 To 10のxのループを使った上で解かなければならないという条件

177:デフォルトの名無しさん
07/06/18 00:10:28
偉そうに答えてる人の方がネタに見える…
(1) sum = x + sum
(2) sum = x * 2 - 1 + sum
(3) sum = x ^ 2 + sum


178:デフォルトの名無しさん
07/06/18 00:55:34
>>177

ありがとうございました!独学なんで分からないところがたくさんですm(__)m

179:デフォルトの名無しさん
07/06/18 01:03:28
>>178
Excelより先に算数の勉強をし直した方が良いぞ。

180:169
07/06/18 01:14:50
>>176
あ~ごめん
xを必ずループさせろとは書いてなかったから

ちなみに
俺が書いた(2)が空欄に入れるものだってわかってるよね?
sum = 0
For x = 1 To 10
For i = 1 To 19 Step 2: sum = sum + i: Next: Exit For
Next x
Msgbox "合計=" & sum
End Sub
ってことね

答えが先にかかれてたからふざけてみたんだけど
ふざけすぎたかw
普通なら当然>>177だわなw


181:デフォルトの名無しさん
07/06/18 04:00:12
ネタなのはわかるがiはどこから出てきたんだw

182:デフォルトの名無しさん
07/06/18 16:22:16
EXCEL2003です。
半角アルファベット文字列の先頭だけ大文字にしたいのですが、
適切なものが見つかりません。

ググってProperを見つけましたが、これは先頭を大文字にするだけでなく
先頭以外の大文字を小文字にしてしまいますよね。

helloWorld → HelloWorldとしたいのですが、適切な方法を
教えていただけますか?

183:デフォルトの名無しさん
07/06/18 16:54:13
最初の一文字を取り出して大文字にすれば?

184:デフォルトの名無しさん
07/06/18 17:31:56
s = "helloWorld"
Mid$(s, 1, 1) = UCase$(Mid$(s, 1, 1))


185:デフォルトの名無しさん
07/06/18 21:59:57
Midステートメント使う人久しぶりに見た気がする
Midステートメント自体は自分で使いまくってるからよく見てるが
公開されたソース見ても、こういうところの回答見ても
使ってる人殆ど居ないからなぁ

ところで、Leftステートメントは無いから代入左辺はMidでいいが
右辺の関数はMidではなくLeftの方がいいのでは?
つ Mid$(s, 1, 1) = UCase$(Left$(s, 1))

まあ実はMidもLeftも無くてもOKなんだけどね
Midステートメント側で置換文字数指定していれば、何文字代入しようと指定文字数以外は置換されない
つ Mid$(s, 1, 1) = UCase$(s)

逆に代入する文字数を指定しておけば、置換する文字数は指定しなくても問題なかったりする
つ Mid$(s, 1) = UCase$(Left$(s, 1))

186:デフォルトの名無しさん
07/06/18 22:32:41
>>185
横レスだが、勉強になった

187:デフォルトの名無しさん
07/06/18 22:41:49
つかMidって参照だけかと思ってたw

188:デフォルトの名無しさん
07/06/18 23:11:52
MSbasicからの伝統で、mid$は関数版とステートメント版がある。

189:デフォルトの名無しさん
07/06/19 12:08:51
エクセルソフトを持ってないので、フリーソフトのOPENOFFICEを使用
ダウンロードしてVBAは作成できるんでしょうか?

190:デフォルトの名無しさん
07/06/19 13:18:08
>>189
アレ使えばね
具体的な話はスレ違いなので伏せるけど

191:デフォルトの名無しさん
07/06/19 14:45:55
日本語で書け

192:デフォルトの名無しさん
07/06/19 14:54:14
全くだ
質問内容は察せるが、日本語じゃないよな

193:デフォルトの名無しさん
07/06/19 21:26:28
みなさん、こんばんは。

とある事情により、エクセルのワークシート内に三角波のデータを埋め込みたくなりました。
サインカーブのデータだったら、sin関数でデータを作ったことはありますが、
三角波の場合、どうしたらいいですか?

私がエクセル上でやろうとすると、くどい if文のネストになりそうです。

どなたか、あっさりしたもの、できませんでしょうか?








194:デフォルトの名無しさん
07/06/19 21:46:07
汎用アルゴリズムの話はスレ違い
VBAどころかVBも関係ないし

195:デフォルトの名無しさん
07/06/19 21:58:39
ワークシート埋め尽くす方法ぐらい教えてあげたらw

196:デフォルトの名無しさん
07/06/19 22:13:28
フーリエ展開してしまえw

197:デフォルトの名無しさん
07/06/19 22:48:00
>>189
>エクセルソフトを持ってないので

ちょwww、当たり前だwww

エクセルソフト
URLリンク(www.xlsoft.com)

198:デフォルトの名無しさん
07/06/19 23:24:31
インテルのコンパイラ高いな

199:使えない子
07/06/20 14:59:47
上司からいきなり「調べといて」
キタ──ヽ(´Д`;)ノ──!!!

既存ブックのシート構成は、
(シート1)・書類のテンプレ
(シート2)・いろんな調査項目
という感じで、シート2を開いてマクロを実行すると、
いろんな調査項目が大分類ごとに分けて、
書類のテンプレに記入してそれぞれシートを作る、
ということをしています。

今度は、それらの作られる大分類ごとのシートを
新しいブックに作りたい、ということです。
手作業であれば、
[シートの移動またはコピー]のダイアログで、
[移動先ブック名]に「(新しいブック)」を指定し、
[コピーを作成する]にチェックを入れて[OK]ですが、
これをマクロでやりたい、というのです。

[新しいマクロの記録]をしても記録されないので、
困ってしまいました。
マクロやVBA等でやるには、どうしたらよいでしょうか。
どなたかお力添えください。m(_ _)m


200:デフォルトの名無しさん
07/06/20 15:33:41
>>199
やってみたら記録されたけど?
Sheets("Sheet1").Copy

201:デフォルトの名無しさん
07/06/20 18:34:08
記録を停止してない
なんてオチだったりしてW

202:デフォルトの名無しさん
07/06/21 00:02:18
前任の作ったエクセルファイル+VBAを別ファイルで再構築しているのですが、
errors(0).description の部分でエラー「コレクションが存在しません」になります。
元のファイルでは正常に動いているのですが、
新しいファイルではどのようにしたら回避できるのでしょうか。

203:デフォルトの名無しさん
07/06/21 00:09:31
参照設定

204:202
07/06/21 00:42:58
レスどもです。Excelは2000で、
Microsoft DAO 3.6 Object Libraryの参照設定はチェック済なのですが
それでもエラーが出てしまいます。
他にも必要な参照があるのでしょうか。

205:デフォルトの名無しさん
07/06/21 00:46:51
エラーなければerrorsコレクションはないだろ
まずファイルの問題か環境の問題かはっきりさせること

206:202
07/06/21 01:30:40
確かにそうですね。
言われてみればそもそもここはエラートラップなので
他の部分に問題がある可能性大です。切り分けに挑戦して見ます。

207:193
07/06/21 02:00:10
>三角波のデータ

自分で作りました。
作ったのは関数です。(セルに直接記述するのでVBAとは関係ないですね...)

割とあっさりめの形になったと思います。

言わば、sin関数になぞらえるなら、三角波関数みたいなもんです。

1/(2π)*arcsin(sin(t/T*2π))/(1/4)


自分で自分を褒めてやりたいです。


208:デフォルトの名無しさん
07/06/21 08:37:41
うわ、重そう。つーか、頭悪そう。

209:デフォルトの名無しさん
07/06/21 14:47:30
お聞きしたいんですけど
コンボボックスのプロパティのLinkedCellに値が入らないのですが
どうやって入れるのか教えてください

210:デフォルトの名無しさん
07/06/21 20:48:44
普通に=で代入するか、プロパティウィンドウに入力するかだよ
間違った値入れてなければそれでOK

211:デフォルトの名無しさん
07/06/22 00:02:30
>>208

頭わるいやつに作れるわけねーだろ。

おめぇ、つくってみ?
ってか、つくれる?


212:デフォルトの名無しさん
07/06/22 00:04:35
>>211
本人乙。

213:デフォルトの名無しさん
07/06/22 00:38:54
>>211
煽ったら作って貰えると思って必死だな。
今宵は枕が涙で濡れてるんぢゃねぇの?

214:デフォルトの名無しさん
07/06/22 00:48:37
バイナリーファイル(テキスト形式でないファイル)を開いて、
nバイト目の数字を読み込むっていうプログラムを組みたいのですが、
VBAでできますか?


215:デフォルトの名無しさん
07/06/22 00:56:55
よゆう

216:214
07/06/22 11:34:20
ちょっとしたヒントだけでも教えてつかわさい。


217:デフォルトの名無しさん
07/06/22 12:47:31
open filename for random as #filenumber len=1
get #filenumber, n, buf

218:214
07/06/22 15:54:48
えっ、まじですか。
N88BASICとまったく同じぢゃ・・・


219:デフォルトの名無しさん
07/06/22 15:56:42
そりゃぁ、MicrosoftBasicの派生だからねぇ。どっちも。

220:214
07/06/22 18:54:47
わしもスレに貢献しよう
arcsin(sin(t/T*2π))
って
t/T*2π
と同じでしょうw

つりか・・・まじか?


221:デフォルトの名無しさん
07/06/22 23:32:39
教えて頂きたいです。△にぶつかった後に円を描くようにしたいのですが・・・
難しくて。ご教授下さい。
Sub seven() ' 弾けるボール
ActiveCell.Offset(5, 0).Value = "手" ActiveCell.Offset(5, 1).Value = "○"
ActiveCell.Offset(5, 7).Value = "▲" For i = 1 To 6 For J = 1 To 500
ActiveCell.Offset(5, i).Value = "○" ActiveCell.Offset(5, i).Value = ""
ActiveCell.Offset(5, i + 1).Value = "" ActiveCell.Offset(5, i + 1).Value = "○"
Next J ActiveCell.Offset(0, i + 1).Value = ""
Next i ActiveCell.Offset(5, 7).Select.Value = "☆"
For i = 1 To 3 A = ActiveCell ActiveCell = ""
ActiveCell.Offset(-1, 1).Activate For J = 1 To 500
ActiveCell = A Next J Next i For i = 1 To 3
A = ActiveCell ActiveCell = "" ActiveCell.Offset(1, 1).Activate
For J = 1 To 500 ActiveCell = A Next J Next i
For i = 1 To 3 ActiveCell = "" ActiveCell.Offset(1, -1).Activate
For J = 1 To 500 ActiveCell = A Next J Next i
For i = 1 To 3 A = ActiveCell ActiveCell = ""
ActiveCell.Offset(-1, 1).Activate For J = 1 To 1000
ActiveCell = A Next J Next i End Sub


222:デフォルトの名無しさん
07/06/22 23:51:21
>>220
前者は周期関数になる。元レスは、それを使って三角波にできると悦に入っていたらしい。

223:デフォルトの名無しさん
07/06/23 08:35:42
>>221
スレ違い。>>16

224:デフォルトの名無しさん
07/06/23 13:52:35
>>223
スレ違いで拒否るのもいいが、いい加減過疎ってないか?このスレ
あと質問に答えても質問者もほったらかし多いし・・・
俺はわからんから答えんだけだが

225:デフォルトの名無しさん
07/06/23 15:11:42
> いい加減過疎ってないか?このスレ
この板はこんなものだよ
一応ここは過疎板だから

当然、この板にもここより賑わってるスレはあるが
このスレでも平均以上どころか勢い上位1割に入るほど
もっと静かでもいいくらいだ

226:デフォルトの名無しさん
07/06/24 08:44:32
あるRangeの一番左上のセルの情報を得たいのですが、
どうしたらよいでしょうか?
Offsetだと、Range全体が取得されてしまいます。
左上のセルのRangeだけを得たいのですが・・・

ActiveSheet.Range("資産表[資産]").Offset(0, 0).Select

227:デフォルトの名無しさん
07/06/24 08:47:10
>>226
自己解決しました。

ActiveSheet.Range("資産表[資産]").Cells(1, 1).Select

Cellsでした。Rangeにないかと思ってました。

228:デフォルトの名無しさん
07/06/24 09:49:10
すみません、質問です。

商品NO 値段 日付 ~
100 20 5/1
101 21 5/1

といったデータが600まである表があります。
修正や訂正をするため、月一で直さなければいけないんですが
一回別シートに抽出して,そこで変更をし、元あった行に上書きをする
そのように作れと上司にいわれてしまいました。

抽出し、別シートに移すことは出来たのですが、それを元の所に
上書きするのには、どうしたらいいのでしょうか?
切実に困っています。教えていただけたら嬉しいです。

229:デフォルトの名無しさん
07/06/24 10:20:48
抽出した行と元の行を関連づければいいでしょ
方法はいくらでもあるけど
一番簡単なのは別のシートの同じ行に抽出するやり方かな

230:デフォルトの名無しさん
07/06/24 12:15:43
>>228
商品Noをkeyにして.findメソッドで検索して
コピーするVBAをつくる

231:デフォルトの名無しさん
07/06/24 12:16:46
同じ行への抽出だとわざわざ抽出する意味がないと言われます
関連付けっていうのはどのようにやるのですか?

232:デフォルトの名無しさん
07/06/24 12:37:17
すみません、書き込みしている最中に書き込んで頂いてたみたいです。
わかりました、まだKeyとかFindメソッドの使い方が上手ではないのですが
月曜日にがんばってみます。

もしまた解らなかったら書き込みしにきます。
そのときもよろしくお願いします。
ありがとうございました。

233::
07/06/25 23:05:08
マクロ使って初心者でも簡単に作れるプログラムって何かあります?
課題でなんでもいいから作ってこいって言われたんですけど何を作ればいいのやら。
参考書買うしかないんすかね~お勧めのWEBサイトありますか?

234:デフォルトの名無しさん
07/06/25 23:07:54
MsgBox "Hello World!"

235:デフォルトの名無しさん
07/06/26 00:59:48
>>1の2番目です!
しつもん!
vlookupのプロパティ?に変数を使いたいんですがうまくいきません
どうすればいいでしょうか?

↓こんなふうにしたい

for count=1 to 10
   Cells(count,4).select
   Activecell.Value = "=Vlookup("count"1,B:C,2,False)
next count

A列とB列を比較して、同じのがあったらC列をD列にコピー、みたいな?
BC列も本当はRange("B65536").End(xlUp).Selectで取得した値を使いたいです。

というかそれ以前にRangeで変数を使う方法すらわからない・・・

236:235
07/06/26 01:07:09
書きまちがいを発見

× Activecell.Value = "=Vlookup("count"1,B:C,2,False)
△ Activecell.Value = "=Vlookup(1"count",B:C,2,False)"
○ ?

ところで="~"で書くのとApplication.WorksheetFunction .VLookup使うのって何か違うのでしょうか?


237:デフォルトの名無しさん
07/06/26 01:08:48
ExcelVBAで、サブルーチンのネストはできますか?

238:デフォルトの名無しさん
07/06/26 01:19:37
>>235
悪い、したいことが分からない。
>A列とB列を比較して、同じのがあったらC列をD列にコピー、みたいな?
これってVLOOKUPか?

ちなみに
ActiveCell.Value="=SUM(B2:B4)"
ActiveCell.Value=Application.WorkSheetFunction.Sum(Range("B2"),Range("B4"))
との違いは、最初の方は、マクロ実行後にB2からB4のセルの値が変われば、ActiveCell
の値も変わる。でも、下の方は変わらない。
それだけじゃないけどな。

239:235
07/06/26 01:33:37
>>238
説明悪くてすまん

まずA1のセルを選択
B列のどこかにA1と同じデータがあったら(B10とする)C10をD1にコピー
これをA10まで繰り返し

vlookupじゃないの?


当初↓みたいなことをやってたのですが、データが各1万行とかになったら速度が恐ろしいことになりまして。
どうにかこれを高速化したいのです。

for count1=1 to Range("A65536").End(xlUp).Select
  for count2=1 to Range("B65536").End(xlUp).Select
    if Cells(count1,1).value = Cells(count2,2),value then
      Cells(count1,4).value = Cells(count2,3).value
    end if
  next count2
next count1

240:デフォルトの名無しさん
07/06/26 01:47:48
>>239
ああ、確かにVLOOKUPだな。
この感じだと、セルD4に 「=VLOOKUP(A1,B:C,2)」って入るよな。
それをセルD10まで下にコピーするのじゃいけないの?



241:235
07/06/26 01:58:26
>>240
各1万行くらいで行数が不定なのです
まとめて出来る(で、forより早い)方法があればvlookupでなくてもなんでもいいのですが


242:デフォルトの名無しさん
07/06/26 02:17:26
>>241
もう頭が働かないんで…
とりあえず235で質問してたRangeを変数に代入する方法
 Dim targetRange As Range 
 Set targetRange = Range("A65536").End(Xlup)

これでtargetRange.Rowで最終行が何行目か分かる。

ちなみにforでも一万行くらいならあまり時間かからないような気がする。
forのネストにする意味が分からない。一致したらExit For でFor文を
抜ければいいのに。



243:デフォルトの名無しさん
07/06/26 03:15:16
>データが各1万行とかになったら速度が恐ろしいことになりまして

実行中の画面描画をOFFにしてないんじゃない?
そこ変えるだけで解決することもあるよ

244:デフォルトの名無しさん
07/06/26 03:20:47
Application.ScreenUpdating = False
処理の終了段階でTrueに戻して下さい。

Application.EnableEvents = False
処理の終了段階でTrueに戻して下さい。

Application.Calculation = xlCalculationManual
処理の終了段階でxlCalculationAutomaticに戻して下さい。

マクロ動作中にEscキーで止められるのを抑制する。
マクロ動作中に一切のキーやマウス操作を制限する。
Application.Interactive = False
処理の終了段階でTrueに戻して下さい。

但し、この状態で何らかの理由でマクロが停止してしまうと、Excel自体は何も操作できない状態になってしまい、タスクマネージャで強制終了させなければならなくなります。この記述だけは確実に動作検証が終わってから設定して下さい。

マクロ動作中はマウスカーソルを「砂時計」にする。
Application.Cursor = xlWait
処理の終了段階でxlDefaultに戻して下さい。

URLリンク(www.asahi-net.or.jp)


245:デフォルトの名無しさん
07/06/26 04:00:51
>>235
Range("D1").Resize(Cells(Rows.Count, "A").End(xlUp).Row).Formula = _
"=VLOOKUP(A1,B$1:C$" & Cells(Rows.Count, "C").End(xlUp).Row & ",2,FALSE)"

>>244
>何も操作できない状態になってしまい、タスクマネージャで強制終了させなければならなくなります。

イミディエイトウィンドに
Application.ScreenUpdating = True
で、エンターキー

246:デフォルトの名無しさん
07/06/27 00:07:51
 A     B    C       D
東京  東京  東京  =LOOKUP(A1,B:B,C:C)
     大阪  大阪
     愛知  名古屋
     福岡  福岡
     北海道 札幌


とするとD1が名古屋になるんだけど気のせい?

247:235
07/06/27 01:06:07
>>242,243,244,245さん、ありがとうございます。

>>242
逆でして、
for i=1 to Range("A65536").End(Xlup)
Range("A"i).select
next i
みたいなことがしたかったのです。

>>243,244,245
本日ぐぐりまくってとりあえずそこらへんの設定をしました。

やりたいことを綴ってたらえらい長くなってしまったので表にしました(とりあえずodsとxml)
見ていただければ幸いです
URLリンク(bebe.run.buttobi.net)

248:デフォルトの名無しさん
07/06/27 01:10:52
2003personalだとエラーが出て開けない

249:235
07/06/27 01:21:05
うゆー

ってか、今更xlsを発見した。すまねぇ
URLリンク(bebe.run.buttobi.net)

250:デフォルトの名無しさん
07/06/27 01:27:13
なんか昔、これの横バージョンを総合相談所のほうでコード書いた気がする…

251:デフォルトの名無しさん
07/06/27 01:52:19
横バージョンじゃなくて、似たような表の作成だった。
相談所55の部品表のをいじればなんとかなるんじゃないかな。
実行速度もシートをメモリに読み込んですれば大丈夫だろう。
もう寝る。

252:245
07/06/27 17:46:50
'Microsoft Scripting Runtime を参照設定
'結果はG,H,I列の1行目以下に出力

'結果出力用配列 出力行数を上回る行数を確保。下回るとエラー
Dim ans(5000, 2) As String

Dim d As New Scripting.Dictionary
Dim v() As Variant
Dim buf As Variant
Dim vv As Variant
Dim i As Long
Dim n As Long

v = Range("D1", Cells(Rows.Count, "E").End(xlUp)).Value

For i = 1 To UBound(v)
  If d.Exists(v(i, 1)) Then
    d(v(i, 1)) = d(v(i, 1)) & vbTab & v(i, 2)
  Else
    d.Add v(i, 1), v(i, 2)
  End If
Next i

v = Range("A1", Cells(Rows.Count, "B").End(xlUp)).Value

253:245
07/06/27 19:00:43
For i = 1 To UBound(v)
  If d.Exists(v(i, 1)) Then
    buf = Split(d(v(i, 1)), vbTab)

    For Each vv In buf
      ans(n, 0) = v(i, 1)
      ans(n, 1) = v(i, 2)
      ans(n, 2) = vv
      n = n + 1
    Next vv
  Else
    ans(n, 0) = v(i, 1)
    ans(n, 1) = v(i, 2)
    n = n + 1
  End If
Next i

Set d = Nothing
Range("G1").Resize(n, 3).Value = ans

254:デフォルトの名無しさん
07/06/27 21:42:09
をいをいw

255:デフォルトの名無しさん
07/06/27 23:38:13
>>254
どうした?

256:デフォルトの名無しさん
07/06/28 09:32:06
>>252
>>245関連ではないのだが、

> 'Microsoft Scripting Runtime を参照設定
> Dim d As New Scripting.Dictionary

これってなに?VBAから、WSHのオブジェクトを呼び出しているわけ?


257:デフォルトの名無しさん
07/06/28 17:31:08
すいません。質問です。
シート1のあるA1に「A」、A2に「B」、B1に「1」、B2に「2」が入っています。
シート2にはA1に「A」、A2に「3」、B1に「B」、B2に「4」が入っています。
シート1のA1の「A」を検索した上でその下のセルにある「1」をシート2の「A」の横にあるセルに入力し、且つそのセルにあった数値(ここでは3)を右にシフトしたいのです。
VBではどうすればいいですか?

258:デフォルトの名無しさん
07/06/28 19:38:54
Shift:=xlToRight

259:235
07/06/29 00:17:52
相談所55が見つからなかったので自力で作ったよ!

よく考えたら別に一枚のシートじゃなくていいじゃん、ということに遅まきながら気付いたので

for i,j=1 to 各行数
  If Cells(i,1).value = Cells(j,4).value then
    k=k+1
    Sheet("Sheet2").Cells(k,1).value = Cells(i,1).value
  Next j
  ~(マッチしなかったときの処理とか)~
Next i

的な流れで完成したお!
遅いお!

>>252
何これ!チョー早い!
意味が全然分からないけど今から修行する!さんくす!


ところで=minute(now())とかsecond(now())とか並べてるとyear(now())だけ変になるんだけど何故?


260:デフォルトの名無しさん
07/06/29 00:24:35
値のコピー貼付をワークブック間で行いたいのですが、
' ①コピー元
Workbook("").Sheets("").Activate
Range("").Copy
' ②コピー先
Workbooks("").Sheets("").Activate
Range("").Select
Selection.Pastespecial Paste:=xlValues

ファイルをまたぎ、かつ値貼付の場合このような段階を踏まないとエラーになってしまいます。
同シート内での値コピーに使える Range("").Copy Range("").Pastespecial
またはRange("")=Range("") のような簡潔な記入法は無いものでしょうか?

261:デフォルトの名無しさん
07/06/29 00:42:07
ですてぃねーしょん


262:デフォルトの名無しさん
07/06/29 01:05:23
すみませんが、ひとつ教えてください。
階乗を計算する関数を作成したくて、
以下のようなプログラムを書いたのですが、
戻り値が0です。
なぜでしょうか?
(ちなみに、xxをkfactにすると、正常に動くようです)
ぜひ、ご回答お願いいたします。

Public Function kfact(n As Integer) As Integer

Dim i As Integer
Dim xx As Integer

i = 1
xx = 1
Do While i < n
xx = xx * i
i = i + 1
Loop

End Function


263:デフォルトの名無しさん
07/06/29 01:26:15
>>262

Public Function kfact(n As Integer) As Integer

Dim i As Integer
Dim xx As Integer

i = 1
xx = 1
Do While i < n
xx = xx * i
i = i + 1
Loop
'↓これ追加(戻り値)
kfact = xx
End Function

ちなみに階乗なら=fact()って関数あるけど
それじゃダメなん?
VBAで使うならApplication.WorksheetFunction.Fact()ね

264:デフォルトの名無しさん
07/06/29 16:35:16
>>256
わけ。特に珍しい手法ではない。

Dictionaryやfsoは便利なので結構良く使うと思う

265:デフォルトの名無しさん
07/06/29 20:11:27
エクセル2003、ウィンXPです。
以下の様なマクロを作成しました。
データの抽出後に、可視セルの値を順に特定セルに入れて、
印刷したいのですが、思った様に動作しません・・・。
どなたか、お知恵を!


Sub 抽出と印刷()

'書類作成用にデータを抽出。
'シート1のBP列がゼロで無いものを抽出。

Sheets("シート1").Columns("BP:BP").AutoFilter Field:=1, Criteria1:=">0", Operator:=xlAnd

'抽出されたリストのBP列の値をシート2のD68に順番に入れて、2枚ずつ印刷する。
‘抽出から除外された行は印刷からも除外したいので、可視セルだけで処理したい。

Dim i As Long
For i = 2 To Worksheets("シート1").Cells(Worksheets("シート1").Rows.Count, 1).End(xlUp).SpecialCells(xlCellTypeVisible).Row
Worksheets("シート2").Range("D68").Value = Worksheets("シート1").Cells(i, 1).SpecialCells(xlCellTypeVisible).Value

'印刷処理をします。
Sheets("シート2").PrintOut copies:=2, Collate:=True, preview:=True

Next i

End Sub


266:デフォルトの名無しさん
07/06/29 20:28:14
>>256,264
> これってなに?VBAから、WSHのオブジェクトを呼び出しているわけ?
正確には違う
Microsoft Scripting RuntimeはWSHのインストーラーパッケージに含まれてはいるが
Scripting.DictionaryはWSHのオブジェクトではなく、ActiveXの汎用コンポーネントに含まれるオブジェクト
WSHのオブジェクトじゃないから、WSHから使う場合もWSHのオブジェクトであるWScriptオブジェクトみたいに
いきなり使うことは出来ず、CreateObjectなどで外部参照してやる必要がある

267:デフォルトの名無しさん
07/06/29 23:03:58
ShowしたUserFormってどうやって閉じていますか?

UserForm1.Close

こんなのないよね?

Unload Meってのはいまいち分からない。不便。

268:デフォルトの名無しさん
07/06/29 23:08:07
Unload UserForm1

269:デフォルトの名無しさん
07/06/29 23:24:03
>>268
サンクス

270:デフォルトの名無しさん
07/06/29 23:25:06
>>265
どこが思ったように動作しないのか説明がないけど
抽出したあとCopy使えばいいよ

>>267
UserForm1.Hide

271:デフォルトの名無しさん
07/06/30 00:04:38
>>270
Hideは見えなくなるだけ

272:デフォルトの名無しさん
07/06/30 00:46:27
>>271
うん、でも>>268の人がもう答えてたから他のを書いた
あと一応はShowとHide、LoadとUnloadが対応になってるかなと思ってるし

273:デフォルトの名無しさん
07/06/30 01:35:58
Accessではclose使えるのに
どうしてExcelではだめなのでしょう?

274:262
07/06/30 01:50:26
263
ありがとうございます。
ワークシート関数ってオーバーフローするイメージがあるので、あんまり好きじゃないのです。


275:デフォルトの名無しさん
07/07/01 00:50:52
>>92
Application.FileSearchは削除されたよ。
以前から挙動不信だったんで、存在そのものを抹消したのだと思われ。

276:デフォルトの名無しさん
07/07/01 03:23:57
5人で30回じゃんけんをして、出した手をB~Fに書き込み、勝敗をG~Kに
書き込むマクロを短めで作りたいのですが、勝敗パターンを作る以外の方法が思いつきません。
よろしくお願いします。


277:デフォルトの名無しさん
07/07/01 04:25:41
>>276
>>16
さようなら

278:デフォルトの名無しさん
07/07/01 08:47:13
>>275
あー確かに挙動不振だな

279:デフォルトの名無しさん
07/07/01 09:19:11
置換について質問です。
以下の様にすると、"さんま"という文字列を"魚"に置換できるのですが、
"さんま"、"タイ"、"いわし"のいずれかの場合に"魚"に置換する場合はどうやって指定しますか?

Selection.Replace What:="さんま", Replacement:="魚"

280:デフォルトの名無しさん
07/07/01 09:31:10
>>279
with Selection
.Replace What:="さんま", Replacement:="魚"
.Replace What:="タイ", Replacement:="魚"
.Replace What:="いわし", Replacement:="魚"
end with


281:デフォルトの名無しさん
07/07/01 09:38:53
>280
ありがとうございます!

282:デフォルトの名無しさん
07/07/01 10:13:19
>>276
総合で訊いてる奴だよな?

283:280
07/07/01 10:20:13
>>281
ぉぃ! まさか、こんなこと訊いてるんじゃないよなぁ...と思いながら、
答えてみたんだが、解決かよ(-_-#);


284:デフォルトの名無しさん
07/07/01 10:57:24
釣りだろ

285:デフォルトの名無しさん
07/07/01 11:57:26
シートAに以下のマクロ実行するボタンがあります。
シートBを選択した状態だと問題なく動作するが、
シートAから実行するとエラーがでます。
最終的にシートA以外は不可視にしたいので、
Worksheets("シートB").select
をしたくないです。
何か良い方法有りますか?

Worksheets("シートB").Range(Cells(1, 1), Cells(100, 100)).Sort Key1:=Range("a1"), Key2:=Range("d1"), Header:=xlYes

286:デフォルトの名無しさん
07/07/01 14:11:49
Set ws = Worksheets("シートB")
With ws
.Range(.Cells(1, 1), .Cells(100, 100)).Sort Key1:=.Range("A1"), Key2:=.Range("D1"), Header:=xlYes
End With


287:デフォルトの名無しさん
07/07/01 15:26:32
>286

有難うございます。
試してみましたところ、シートBが選択された状態では動作しました。
シートAが表示された状態で実行すると、
「アプリケーション定義またはオブジェクト定義のエラーです」となります。

288:デフォルトの名無しさん
07/07/01 19:25:16
Σ(゚∀゚;) ?

289:デフォルトの名無しさん
07/07/01 19:45:48
285です。
解決しました。

Worksheets("シートB").Range(Worksheets("シートB").Cells(1, 1), Worksheets("シートB").Cells(100, 100)) _
.Sort Key1:=Worksheets("シートB").Range("a1"), Key2:=Worksheets("シートB").Range("d1"), Header:=xlYes


290:デフォルトの名無しさん
07/07/01 20:52:21
>>289
これって>>286と何が違うん?

291:デフォルトの名無しさん
07/07/01 22:42:36
Excel2003なのですが、
VBエディターで編集したマクロをリロードするための
ファンクションキーってありますでしょうか?


292:デフォルトの名無しさん
07/07/01 23:01:44
エクセルの2つのシートを比較するマクロを作っているのですが、
行と列のサイズが大きくなると処理が重くなります。

1000*256ぐらいで処理が重くなります。
これは、仕様なんでしょうか。

For i=0 To 65536  
  For j=0 To 256
    比較
  Next
Next

使われているシートの範囲を読み取るとか
範囲を設定するとかすればいいと思っています。
指摘などありましたらよろしくお願いします。

293:デフォルトの名無しさん
07/07/01 23:19:53
>>292
Dim s As Range
Set s = ActiveCell.SpecialCells(xlLastCell)
MsgBox s.Column & " " & s.Row


294:デフォルトの名無しさん
07/07/02 20:40:46
arry(あ,い,う,え,お)
を、
ExcelのセルA1~E1に
一気に貼り付ける方法てないですかね。

For文で順番に
セルA1に「あ」を入れて
セルB1に「い」を入れて…
というのは分かるんですが。
なんかもっとこう効率良いやり方ないかな。

295:デフォルトの名無しさん
07/07/02 21:05:35
>>294
おしい、そこまでいけて何故できないw
Range("A1:E1") = Array("あ","い","う","え","お")

是非感想を。

296:デフォルトの名無しさん
07/07/02 21:14:58
>>295
で、できたー!!

ありがとう。これでよかったのか…
Pasteにばっか気をとられてたわ。

297:デフォルトの名無しさん
07/07/03 00:16:07
VBAのコードを含んだブックを余所にあげたりするとき、デジタル署名とか
どうしてますか?

律儀にベリサインから買ったりしてるんでしょうか?

298:デフォルトの名無しさん
07/07/03 06:33:52
SelfCert
外に出すときは、署名壊れたとき用に対応策(向こうで再署名)を書いておく
# ソースは見られるが管理者だけなら問題なかろう
2000ならこれでOK

それ以降なら我慢して使ってもらうしか。
一応、毎回署名を確認してもらう事に…

既に署名を持っているならともかく、予算的にExcelの為に申請なんて出せないし。

299:デフォルトの名無しさん
07/07/03 09:15:58
売る場合はともかく、あげる場合は向こうで勝手に対応してもらう

300:デフォルトの名無しさん
07/07/03 11:31:57
Set objIE = CreateObject("InternetExplorer.application")
で、IEを起動しています。
なんらかの操作で、IEのウインドウが最小化された場合に備えて、それを「元のサイズに戻す」の
処理を行いたいのです。
検索してみたところ、VBでは、SW_SHOWNA の利用で良いみたいですが、
同様の処理をVBAで行いたいのです。
ojbIEに対して処理を加える方法は無いでしょうか?
他に考えたのは、API32を参照しobjIEとは関係なく処理を行うですが、そうした方が良いのでしょうか?
よろしく御願いします。


301:デフォルトの名無しさん
07/07/03 12:10:35
>>300
>>16

302:デフォルトの名無しさん
07/07/03 12:41:01
厳しいなあw

303:300
07/07/03 16:21:57
Declare Function ShowWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long

If objIE.Top < 0 Then
ShowWindow objIE.hWnd, 9 'SW_RESTORE アクティブにもなる。
End If

で解決しました。objIE.Top < 0 は怪しいですが、良しとします。

304:デフォルトの名無しさん
07/07/03 18:42:33
>>295
それ、A1:E1ならできるけど
A1:A5だとうまくいかない。なんでだろ?

305:デフォルトの名無しさん
07/07/03 20:17:56
>>302
× スレ違い指摘が厳しい
○ 質問者がVBAの範疇を理解してない

306:デフォルトの名無しさん
07/07/04 17:34:35
VBAというか、プログラミングの初心者です。
変数のスコープ(有効範囲?)のことでハマッっています。

UserForm1のなかの冒頭でPublicとして宣言した変数aの値を
(この値は同じくUserForm1内にPublicとして記述されたプロシージャによって代入される)
UserForm2のなかのプロシージャ内でmsgbox(a)として表示しようとするのですが、
値が空白になってなにも表示されません。
UserForm1 UserForm2のすべてのプロシージャをPublicにしても同じです。

こんなボケに対する、どなたかツッコミをお願いします。

307:デフォルトの名無しさん
07/07/04 17:47:03
Msgbox(UserForm1.a)

理由:ユーザフォームはモジュールではなくクラスだから

308:304
07/07/04 19:03:53
自己解決。
これでいけた。

Range("A1:A5") = Application.Transpose(Array("あ", "い", "う", "え", "お"))

309:306
07/07/04 22:42:37
>>307
助言くださったとおり、うまくいきました。理由を書いてくださったのがヒントになり、
Public変数をUserFormではなく標準モジュールのほうで宣言すればいいことに
気がつきました。どうも有難うございました。


310:デフォルトの名無しさん
07/07/05 12:37:25
>Public変数をUserFormではなく標準モジュールのほうで宣言すればいい

死ね

311:デフォルトの名無しさん
07/07/05 21:18:05
あの子ったら、また私のパンティを……。
 
息子の康彦を学校へ送りだし、洗濯にかかろうとした美沙緒は、
洗濯機のなかに無造作に放りこまれた自分のパンティを見て、大きく溜め息をついた。

困ったわ。どうすればいいのかしら?……
 パンティを手に持ったまま、美沙緒は考えこんでしまった。
 
康彦は十四歳の中学二年生。七つ年上のいまの夫と大恋愛に落ちた美沙緒が、
周囲の猛反対を押しきって、十八歳のときに産んだ子だ。
 
その康彦の不可解な行動に美沙緒が最初に気づいたのは、もう一年近くも前のことになる。

312:デフォルトの名無しさん
07/07/05 21:23:27
小学生の頃、同じクラスのヤシんちに行った。ソイツの姉ちゃんは高校生でキレイだった。

化粧してるのをボケーと見てた。
「何で見てるの?」
やさーしく微笑んでくれた。
「ち、ちゅーしたい!」
おいら、とっさに言った。
姉ちゃん、頭なぜなぜして、オデコにちゅーしてくれた。
「口紅ついちゃったわね」
コットンでキレイにしてくれた。
おいら、コットンを奪って逃げた。

次の日、姉ちゃんに告った。
「お姉ちゃん、彼氏いるの」
おいら「ならば、貴様を殺して永遠に我と共に」
姉ちゃん「よかろう。来るが良い」
虚空を突き破る轟音。空気を切り裂く甲高い音。
おいらの口から鮮血があふれ出す。
おいらの拳は僅かに届かず、逆に手刀が胸に突き刺さっている。崩れ落ちるおいら。
おいら「・・・これで、貴様は俺を忘れないだろう。ぐ・・」
姉ちゃん「忘れはせぬ。貴様の魂我が心と共に。悲しき男よ。誰よりも愛深く、拳でしか愛を語れぬゆえに」
死してなおその男の顔に浮かぶ表情は喜びであったか悲しみであったか。
その時、一陣の風が吹いた。
愛に死んだ修羅の魂を運び去るように。

313::
07/07/06 22:24:01
     00年  01年 02年 03年
     売上高 

キャベツ 500  400 300  200
ニンジン 600  300 400  500
トマト  400  400 500  400
レタス  300  500 600  300

年代別に最も多い売上高の野菜を調べるためのアルゴリズムってどうすればいいんですか?
上の例で言うと00年の売上高がもっとも高いのはニンジンなのでマクロをつかって00年
ニンジン、01年レタスというようにセルに順番に出していきたいんですがどうすればいいんで
しょうか?

314:デフォルトの名無しさん
07/07/06 23:04:40
>>313
VBAを使うまでもない。よってスレ違い。

315:デフォルトの名無しさん
07/07/06 23:18:00
>>310
>死ね

って、どういう意味ですか?

316:デフォルトの名無しさん
07/07/06 23:24:52
>>315
つ[辞書]
つ[goo.ne.jp]

317::
07/07/07 01:04:04
>>314
課題でどうしてもVBAを使ってやらないとだめなんです。
まだはじめたばかりで普通にやったほうが早いんですけど。
せめてどのような文法を使ったらいいのかだけでも教えてもらえませんか?


318:デフォルトの名無しさん
07/07/07 01:54:03
>>317
ここは宿題スレじゃない

319:デフォルトの名無しさん
07/07/07 11:55:37
     00年  01年 02年 03年
     売上高 

キャベツ 500  400 300  200
ニンジン 600  300 400  500
トマト   400  400 500  400
レタス   300  500 600  300
      ニンジン レタス レタス ニンジン



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch