Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


315 / 3841 ページ ←次へ | 前へ→

【76126】Re:Do Whileの使い方について
回答  独覚  - 14/10/2(木) 17:18 -

引用なし
パスワード
   ▼スパニングツリー さん:
Do While
は条件が真の間繰り返す、ですよ。

条件が真になるまで(偽の間)繰り返すは
Do Until
です。
・ツリー全体表示

【76125】Do Whileの使い方について
質問  スパニングツリー  - 14/10/2(木) 16:55 -

引用なし
パスワード
   下記プログラムを作りました。
私の想定ではjは4になるのですが、jは1のままです。

tData = 15
sData = "2,4,6,10,20,50,51,52,53,100"
tOne = Split(tData, ",")

For i = 0 To UBound(tOne)
sOne = Split(sData, ",")
j = 1
Do While CInt(sOne(j - 1)) < CInt(tOne(i)) And CInt(tOne(i)) < CInt(sOne(j))
j = j + 1
Loop
Next i
MsgBox j

下記の1行がおかしいからというのは分かるのですが、
2 < 15 And 15 < 4 で条件式を満たしていないからjに1加算されていくと思っているのですが、
いかがでしょうか。考えても詰まってしまいました…。
教えていただけると幸いです。
Do While CInt(sOne(j - 1)) < CInt(tOne(i)) And CInt(tOne(i)) < CInt(sOne(j))
・ツリー全体表示

【76124】Re:階段状の連続計算
発言  kanabun  - 14/10/2(木) 14:56 -

引用なし
パスワード
   ▼トキノハジメ さん:

ループで数式入れてくのならできますけど?

最初のほうは、1セルずつ式を書き出してみると
'  [A9].FormulaR1C1 = "=SUM(R2C:R[-2]C)"
'  [B9].FormulaR1C1 = "=SUM(R3C:R[-2]C)"
'  [C9].FormulaR1C1 = "=SUM(R4C:R[-2]C)"
'  [D9].FormulaR1C1 = "=SUM(R5C:R[-2]C)"
'  [E9].FormulaR1C1 = "=SUM(R6C:R[-2]C)"
'  [F9].FormulaR1C1 = "=SUM(R7C:R[-2]C)"
だから、
ループで書き出すのなら、
Sub Try1()
 Dim i&
  For i = 1 To 6
   Cells(9, i).FormulaR1C1 = "=SUM(R" & (i + 1) & "C:R[-2]C"
  Next
End Sub


いっぽう
>(I1:O1).Formura=(80/B1)
>(I2:N2).Formura=(80/C2)
>(I3:L3).Formura=(80/D3)
>・・・
>・・・
>G6まで
のほうは、(7セルでなく 6セルだと思う)

'  [I1:N1].FormulaR1C1 = "=80/RC[-7]"
'  [I2:M2].FormulaR1C1 = "=80/RC[-6]"

だから

Sub Try2()
 Dim i&
  For i = 1 To 6
   Cells(i, "I").Resize(, 7 - i).FormulaR1C1 = "=80/RC[-" & 8 - i & "]"
  Next
End Sub

数式に強い人なら、R1C1式の中に関数式を入れ子にして一行で書けるのかも
知れないけれど?
・ツリー全体表示

【76123】Re:階段状の連続計算
お礼  トキノハジメ  - 14/10/2(木) 10:39 -

引用なし
パスワード
   ▼ど素人 さん:▼独覚さん
有難うございます。参考にしてがんばってみます。
又、解らなければ質問させてください。
有難う御座いました。
・ツリー全体表示

【76122】エクセルVBAを使ったVISIOの操作
質問  K  - 14/10/1(水) 13:31 -

引用なし
パスワード
   フォルダ内のvsdファイルを開き文字列検索を行い該当文字列があった場合ファイルパスをエクセルに表示するVBAを書きたいと思っています。
現在、vsdファイルを開いて閉じるとこまでできたのですが、文字列を検索するVBAが解りません。
教えてもらえないでしょうか。よろしくお願いします。
・ツリー全体表示

【76121】Re:階段状の連続計算
発言  ど素人  - 14/9/30(火) 16:40 -

引用なし
パスワード
   ▼トキノハジメ さん:
たまたま似たようなものを作っていたのでこれを改変すれば一応できるかと


Sub 対戦表ー三角行列上部() '進行方向が↓
'

  Dim 横 As Long 'その行がいくつの列を持っているか  最初から作るときは1
  Dim 縦 As Long '作成する列の数
  Dim 変数_1 As Long
  Dim 変数_2 As Long

 
   横 = 1
  
   縦 = 5
   
   For j = 1 To 縦
 
  
        For i = 1 To 横
        Cells(i, j + 1).Value = 変数_1 '入力する値
          変数_1 = 変数_1 + 1
          
          変数_2 = 変数_2 + Cells(i, j + 1)
       
        Next i
    Cells(9, j + 1) = 変数_2

      横 = 横 + 1
    Next j


End Sub


Sub 対戦表ー三角行列下部_4() '進行方向が↑
'

  Dim 横 As Long 'その行がいくつの列を持っているか  最初から作るときは1
  Dim 縦 As Long '作成する列の数
  Dim 変数_1 As Long
  Dim 変数_2 As Long
  Dim 変数_3 As Long
  Dim n As Long


   横 = 5
   n = 横
   縦 = 5
   
   For j = 1 To 縦
 
  
        For i = 1 To 横
        
         変数_2 = 0
  

           Cells(n - i + 1, j + 1).Value = 変数_1 '表に入力する値
            変数_1 = 変数_1 + 1
          
            変数_2 = 変数_2 + Cells(n - i + 1, j + 1)
       
        Next i
       Cells(9, j + 1) = 変数_2

      横 = 横 - 1
      
    Next j


End Sub
・ツリー全体表示

【76120】Re:シート上の図形の再描写
お礼  ど素人  - 14/9/30(火) 14:40 -

引用なし
パスワード
   ▼独覚 さん:
返信が遅くなってしまいすいません。
回答して下さりありがとうございました。 
引き続き作成していきます。

その後、いったん始点で矢印を出したりして変化させ、変化したX座標を取得すればbeginXを取得できるのではないかと思い調べましたが見つけられませんでした。


一応太さについては修正したものを貼っときます。

Sub 要素書き出し3_Case()

  Dim 要素数 As Integer
  Dim 中身 As Variant
  Dim left As String
  Dim top As String
  Dim width As String
  Dim Height As String
  Dim obj As String
  Dim line_weight As Variant

  要素数 = 1
    For Each 中身 In ActiveSheet.Shapes


      '--------------------プロパティー表示-----------------------'
         Cells(要素数 + 2, 1) = 中身.Name
         Cells(要素数 + 2, 2) = 中身.AutoShapeType
         
  
      Select Case True
'==================コネクター================================================================
  
           Case 中身.Connector
           
            
        '--------------------プロパティー取得-----------------------'
              obj = 中身.Type
              left = 中身.left
              top = 中身.top
              width = 中身.width + 中身.left
              Height = 中身.Height + 中身.top
              line_weight = 中身.Line.Weight
     '--------------------プロパティー表示----------------------'
               Cells(要素数 + 2, 7) = 中身.Line.Weight
               
                
               If 中身.Line.BeginArrowheadStyle = msoArrowheadTriangle Then
                
                    Cells(要素数 + 2, 8) = "msoArrowheadTriangle"
                 End If
                 
               If 中身.Line.EndArrowheadStyle = msoArrowheadTriangle Then
                
                    Cells(要素数 + 2, 9) = "msoArrowheadTriangle"
                 End If
             '--------------------図形書きだし-----------------------'

                 ActiveSheet.Shapes.AddConnector(obj, left, top, width, Height).Select
                   Selection.ShapeRange.Name = "test 図形" & 要素数
                 Selection.ShapeRange.Line.Weight = line_weight
 Dim wk_中身 As Variant
                  
                    Set wk_中身 = ActiveSheet.Shapes.AddConnector(obj, left, top, width, Height)
                       wk_中身.Line.BeginArrowheadStyle _
                       = 中身.Line.BeginArrowheadStyle
                       wk_中身.Line.EndArrowheadStyle _
                       = 中身.Line.EndArrowheadStyle


'================円============================================================================


'================その他========================================================================

         
            Case Else
            '--------------------プロパティー取得-----------------------'
                obj = 中身.Type
                left = 中身.left
                top = 中身.top
                width = 中身.width
                Height = 中身.Height
                line_weight = 中身.Line.Weight
            ' --------------------図形書きだし-----------------------'
            ActiveSheet.Shapes.AddShape(obj, left, top, width, Height).Select
                Selection.ShapeRange.Name = "test 図形" & 要素数
            '    Selection.ShapeRange.Line.Weight = line_weight 何故かエラー多発のためコメントアウト


         End Select
  
  '--------------------プロパティー表示----------------------'
      Cells(要素数 + 2, 2).Value = obj
      Cells(要素数 + 2, 3).Value = left
      Cells(要素数 + 2, 4).Value = top
      Cells(要素数 + 2, 5).Value = width
      Cells(要素数 + 2, 6).Value = Height
      Cells(要素数 + 2, 7).Value = line_weight
      要素数 = 要素数 + 1
          
    Next
   
End Sub
・ツリー全体表示

【76119】Re:階段状の連続計算
質問  トキノハジメ  - 14/9/29(月) 14:48 -

引用なし
パスワード
   ▼独覚 さん:

>=SUM(A2:A7)
>とするのが一般的です。

早速のお返事有難うございます。
指摘のように=SUM(A2:A7)のようにはしています。
私としては、結果が知りたいのですが、コードを一つずつ記述していると、
行、列が多くなると、コードが増えるので、まとまった記述の方法がしりたいのですが。
宜しくお願い致します。
・ツリー全体表示

【76118】Re:階段状の連続計算
質問  トキノハジメ  - 14/9/29(月) 14:39 -

引用なし
パスワード
   ▼独覚 さん:
さっそくのお返事ありがとうございます。

私としましては結果を計算したいのですが、列、行がおおくなると1行ずつコードをかいているとコードが多くなるので、まとめた記述が出来れば教えていただきたいのですが、  宜しくお願いいたします。
・ツリー全体表示

【76117】Re:階段状の連続計算
発言  独覚  - 14/9/29(月) 14:23 -

引用なし
パスワード
   ▼トキノハジメ さん:
おこないたいことを具体的に書いてくださいね。

>A9=SUM(A2+A3+A4+A5+A6+A7)
>B9=SUM(B3+B4+B5+B6+B7)
>C9=SUM(C4+C5+C6+C7)
>・・・
>・・・
>F9まで
>
>(I1:O1).Formura=(80/B1)
>(I2:N2).Formura=(80/C2)
>(I3:L3).Formura=(80/D3)
>・・・
>・・・
>G6まで
セルに数式を入れたいのか計算結果の値を入れたいのかどちらでしょうか?

あと、
>=SUM(A2+A3+A4+A5+A6+A7)

=A2+A3+A4+A5+A6+A7

=SUM(A2:A7)
とするのが一般的です。
・ツリー全体表示

【76116】階段状の連続計算
質問  トキノハジメ  - 14/9/29(月) 10:12 -

引用なし
パスワード
   いつもお世話になります。
下図のような表の計算をスマートにできるのでしょうか。

  A  B  C  D  E  F  G
1  *  1  2  3  4  5  6
2  1  *  7  8  9 10 11
3  2  7  * 12 13 14 15
4  3  8 12  * 16 17 18
5  4  9 13 16  * 19 20
6  5 10 14 17 19  * 21
7  6 11 15 18 20 21 *

A9=SUM(A2+A3+A4+A5+A6+A7)
B9=SUM(B3+B4+B5+B6+B7)
C9=SUM(C4+C5+C6+C7)
・・・
・・・
F9まで

(I1:O1).Formura=(80/B1)
(I2:N2).Formura=(80/C2)
(I3:L3).Formura=(80/D3)
・・・
・・・
G6まで

* でくぎられております。
どうかよろしくお願いいたします。
・ツリー全体表示

【76115】Re:フォルダー内の複数のエクセルあるセ...
発言  kanabun  - 14/9/28(日) 18:41 -

引用なし
パスワード
   外部参照式のサンプルで こんなアーカイブがありました。

ht tp://web.archive.org/web/20080206002249/ht tp://www2.moug.net/bbs/exvba/2008013100022.htm

(↑ ht と tp のスペースをとるとURLになります)

そこの
> Sub Try3()
を参照ください。
・ツリー全体表示

【76114】Re:フォルダー内の複数のエクセルあるセ...
発言  kanabun  - 14/9/28(日) 18:36 -

引用なし
パスワード
   別法で、
もっと簡単に、セルに外部参照式を書いておいてもいいですね。

他のブックのセル範囲への外部参照
ht tp://office.microsoft.com/ja-jp/excel-help/HP010102338.aspx
・ツリー全体表示

【76113】Re:フォルダー内の複数のエクセルあるセ...
発言  kanabun  - 14/9/28(日) 16:54 -

引用なし
パスワード
   ▼ペンネーム船長 さん:

>   For Each F In FSO.GetFolder(FolderName).Files
>     MsgBox F.Worksheets("あ").Cells(4, 4).Value  'NG
>   Next

Worksheetsプロパティは Bookのプロパティです。
そのファイルF をExcelで開いてWorkbookとして扱わないと使えません。

代わりに、
 ブックを開かないで読む

ってのはどうでしょう?

ht tp://officetanaka.net/excel/vba/tips/tips28.htm
・ツリー全体表示

【76112】フォルダー内の複数のエクセルあるセルの...
質問  ペンネーム船長  - 14/9/28(日) 15:06 -

引用なし
パスワード
   【質問】
デスクトップの『test』フォルダーの中に複数のエクセルがあり、そのエクセルには全て『あ』シートがあります。それらエクセルのシート『あ』のRange(”D4”)に書いてある内容を順次表示させたい。

下記のコードでは上手く行きません。ご教授お願いします。

Private Sub CommandButton1_Click()
Dim FolderName As String
Dim FSO As Object, F As Object
   FolderName = "C:\Users\○●\Desktop\test"
   Set FSO = CreateObject("Scripting.FileSystemObject")
   For Each F In FSO.GetFolder(FolderName).Files
     MsgBox F.Worksheets("あ").Cells(4, 4).Value  'NG
   Next
End Sub
・ツリー全体表示

【76111】Re:CSVの読み込みについて
お礼  勉強中です。  - 14/9/26(金) 23:44 -

引用なし
パスワード
   早速のご回答ありがとうございました。
大変参考になりました。
もう少し勉強もしてみます。
・ツリー全体表示

【76110】Re:CSVの読み込みについて
発言  kanabun  - 14/9/26(金) 23:23 -

引用なし
パスワード
   たとえば、あるCSVファイルをQueryTablesで取り込むマクロ記録を
とりますと以下のようになりますが、

Option Explicit

Sub Macro1()
' Macro recorded 2014/9/26 by kanabun
'
  With ActiveSheet.QueryTables.Add(Connection:= _
    "TEXT;H:\(Data)\FData\F_Data.Csv", Destination:=Range("A1"))
    .Name = "F_Data"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 932
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = True
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(2, 2, 2, 1, 1, 1, 1, 1, 5, 1, 5)
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
  End With
End Sub

最初の
>  With ActiveSheet.QueryTables.Add(Connection:= _
>    "TEXT;H:\(Data)\FData\F_Data.Csv", Destination:=Range("A1"))

部分のCSVファイル名のところを
>  'カレントディレクトリ変更/今回はデスクトップに変更
>CreateObject("WScript.Shell").CurrentDirectory = >CreateObject("WScript.Shell").SpecialFolders("Desktop")
>  
>  ' 「ファイルを開く」のダイアログでファイル名の指定を受ける
>  xlAPP.StatusBar = "読み込むファイル名を指定して下さい。"
>  vntFileName = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, _
>                    Title:=cnsTITLE)
>  ' キャンセルされた場合はFalseが返るので以降の処理は行なわない
>  If VarType(vntFileName) = vbBoolean Then Exit Sub
>  strFileName = vntFileName

を使って 変数 strFileName に取得すれば、

With ActiveSheet.QueryTables.Add(Connection:= _
    "TEXT;" & strFileName, Destination:=Range("A1"))

と書き替えて一般化できます。

また
>   .TextFileColumnDataTypes = Array(2, 2, 2, 1, 1, 1, 1, 1, 5, 1, 5)
のところは 列ごとのデータ型を設定しているところで、
2 は 文字列データ、
5 は 日付(YMD型) データ
としている部分ですので、読み込むCSVデータの列に合わせて適宜設定してください。

また、最後の

>    .Refresh BackgroundQuery:=False
>  End With

のところは、インポートしたら元のデータとの接続をCUTするため、

>    .Refresh BackgroundQuery:=False
     .Delete
>  End With

の一行を加えるといいでしょう。
・ツリー全体表示

【76109】Re:CSVの読み込みについて
発言  kanabun  - 14/9/26(金) 23:08 -

引用なし
パスワード
   ▼勉強中です。 さん:

>私としては,エクセルのセルとして,一つのセルの中に「りんご,みかん,すいか」を格納したいのですが,以下の記述をどのように変えればそのようにできるのかがわかりません。

そのプログラムはExcel上で作動仕様としているのに、別のExcelを立ち上げて
いますが、どうしてその必要があるのでしょう?

コードを読めば判るように、
カンマで項目に分割しているだけです。

>    ' 行単位にレコードを読み込む
>    Line Input #intFF, strREC                    ' 1.
>
>    ' LineInputより自分で半角カンマを探しCSV→項目分割させる

"あ,い,う"
というデータがあっても、ダブルクォートに配慮していません。

[データ]-[外部データの取り込み]-[テキストファイルのインポート]メニュ−より
カンマ区切りを指定して取り込む QueryTables を利用しましょう。
そのマクロ記録を編集すれば、VBAコードができます。
・ツリー全体表示

【76108】CSVの読み込みについて
質問  勉強中です。  - 14/9/26(金) 22:19 -

引用なし
パスワード
   どなたかご教示ください。

現在下記の内容の記述をし,任意のCSVファイルをエクセルに取り込めるようになっています。記述については,ネット上で探したものをそのまま使用しており,恥ずかしながら細かく理解できていません。

あるCSVのセル(※エクセル形式で開けているので,セルごとになっています。)には,セル内で「,」で区切られたものがあり(例えば,一つのセル内で「りんご,みかん,すいか」のように),このセルがエクセルに出力された際には,「りんご」「みかん」「すいか」と別々のセルに出力されてしまいます。
私としては,エクセルのセルとして,一つのセルの中に「りんご,みかん,すいか」を格納したいのですが,以下の記述をどのように変えればそのようにできるのかがわかりません。

どなたかお分かりの方,ご教示いただけないでしょうか。
どうかよろしくお願いいたします。

Sub READ_TextFile()
  Const cnsTITLE = "テキストファイル読み込み処理"
  Const cnsFILTER = "CSV形式ファイル (*.csv),*.csv,全てのファイル(*.*),*.*"
  Dim xlAPP As Application    ' Applicationオブジェクト
  Dim intFF As Integer      ' FreeFile値
  Dim strFileName As String    ' OPENするファイル名(フルパス)
  Dim vntFileName As Variant   ' ファイル名受取り用
  Dim X() As Variant       ' 読み込んだレコード内容
  Dim IX1 As Long         ' CSV項目カラムINDEX
  Dim GYO As Long         ' 収容するセルの行
  Dim lngREC As Long       ' レコード件数カウンタ
  Dim strREC As String      ' レコード領域
  Dim POS1 As Long        ' レコード文字位置INDEX
  Dim POS2 As Long        ' レコード文字位置INDEX

  ' Applicationオブジェクト取得
  Set xlAPP = Application
  
  'カレントディレクトリ変更/今回はデスクトップに変更
CreateObject("WScript.Shell").CurrentDirectory = CreateObject("WScript.Shell").SpecialFolders("Desktop")
  
  ' 「ファイルを開く」のダイアログでファイル名の指定を受ける
  xlAPP.StatusBar = "読み込むファイル名を指定して下さい。"
  vntFileName = xlAPP.GetOpenFilename(FileFilter:=cnsFILTER, _
                    Title:=cnsTITLE)
  ' キャンセルされた場合はFalseが返るので以降の処理は行なわない
  If VarType(vntFileName) = vbBoolean Then Exit Sub
  strFileName = vntFileName

  ' FreeFile値の取得(以降この値で入出力する)
  intFF = FreeFile
  ' 指定ファイルをOPEN(入力モード)
  Open strFileName For Input As #intFF
  GYO = 1
  ' ファイルのEOF(End of File)まで繰り返す
  Do Until EOF(intFF)
    ' レコード件数カウンタの加算
    lngREC = lngREC + 1
    xlAPP.StatusBar = "読み込み中です....(" & lngREC & "レコード目)"
    ' 行単位にレコードを読み込む
    Line Input #intFF, strREC                    ' 1.

    ' LineInputより自分で半角カンマを探しCSV→項目分割させる
    POS1 = 1
    IX1 = 0
    ReDim X(IX1)        ' 配列を初期化
    Do While POS1 <= Len(strREC)                  ' 2.
      POS2 = InStr(POS1, strREC, ",", vbTextCompare)       ' 3.
      If POS2 < POS1 Then
        POS2 = Len(strREC) + 1
      End If
      ReDim Preserve X(IX1)  ' 配列要素数を再設定
      X(IX1) = Trim$(Mid$(strREC, POS1, POS2 - POS1))       ' 4.
      ' シングルクォーテーション、ダブルクォーテーションで囲まれている場合は
      ' 両端文字を取り除く
      If (((Left$(X(IX1), 1) = """") And (Right$(X(IX1), 1) = """")) Or _
        ((Left$(X(IX1), 1) = "'") And (Right$(X(IX1), 1) = "'"))) Then ' 5.
        X(IX1) = Trim$(Mid$(X(IX1), 2, Len(X(IX1)) - 2))
      End If
      POS1 = POS2 + 1
      IX1 = IX1 + 1
    Loop

    ' 行を加算しレコード内容を表示(先頭は2行目)
    GYO = GYO + 1
    If IX1 >= 1 Then
      Range(Cells(GYO, 1), Cells(GYO, IX1)).Value = X  ' 配列渡し 6.
    End If
  Loop
  ' 指定ファイルをCLOSE
  Close #intFF
  xlAPP.StatusBar = False
  ' 終了の表示
  MsgBox "ファイル読み込みが完了しました。" & vbCr & _
    "レコード件数=" & lngREC & "件", vbInformation, cnsTITLE
End Sub
・ツリー全体表示

【76107】Re:MsgBoxの位置
お礼  トキノハジメ  - 14/9/26(金) 19:00 -

引用なし
パスワード
   独覚さん有難う御座いました。
また宜しくお願い致します。
・ツリー全体表示

315 / 3841 ページ ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free