新しいアカウントで始めました。

身の回りの出来事や写真が中心です。

連立一次方程式というのだったかも?

2021-03-19 08:19:34 | Excel

問題)お爺さんは(自分)2箇所病院へ行ってます。1つはA病院、2つ目はB病院。A病院を基準にして、B病院へ行くことにしました。お爺さんは病院から遠いので、軽トラで行くガソリン代を節約したいのです。A病院の薬は26日分あります。B病院の薬は、朝1個、夜2個飲むことになってますが、今(3/19)で63個あります。同じ日に病院へ行くために、朝1個飲むのを止めて、夜だけ2個飲み、薬を省略し、ある時点からは、朝1個夜2個のパターンにかえたいのですが、何日間夜2個だけ飲めば良いでしょうか?

 答えは、指示通り飲まないといけないので、バツとかでなく、単純に連立一次方程式です。多分。

気になる方は、ワークスペースに投稿があります。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

excelの横長の表のほんの少しの工夫(のが多過ぎ?)

2018-01-29 09:47:40 | Excel

 上のように横に長い表でワークシート上では枠の固定で左の営業者コードや上の年月などは固定できるので良いんですが、印刷すると、長い表の場合ははみ出して印刷がされます。2ページ以降にという事ですが。そうなると営業者コードが印刷されません。上の横のラインなら、2ページ以降でもヘッダーを印刷出来ます。横にあふれた場合は、営業者コードが見えないので、分かりづらい。

 そんな時は営業者コードを右にも入れておくと、あふれても大丈夫です。Excelに縦の見出しをあふれたページに印刷する機能があるか?分かりません。単純に上のようにした方が楽ではないですか?

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Excelのシート保護とセルの編集許可

2016-10-08 10:00:02 | Excel

 Excel2007のシート保護は、「校閲」→「シートの保護」でOKです。でも普通は保護と許可が同居するのが普通でしょう。

自分の発想としては、シートの保護してあったが、ここの部分は許可して、入力が出来るようにしたい。なんですが

どうも違うんですね。

 まだシートを保護してないが、入力をしたい部分に「校閲」→「範囲の編集を許可」、その後に「シートの保護」となるので

自分の感覚とは少し違うようです。アメリカで出来たソフトなので、違うんでしょうかね。車の通行も違うようですし

救急は911ですか?ノコギリは押すときに切れる。

 10/8の天気は雨です。まだ稲刈りも終わってませんが、この天気ではどうしようも無いので、パソコンに向かって

晴耕雨読ならぬ、晴刈雨打鍵です。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Excelの複合参照

2016-09-27 17:11:23 | Excel

 多分ですが、複合参照は使わなくても不便は無いと思います。覚えておけば便利かも知れませんが。

 上のような表の場合で、一定の数を加算するのですが、その部分が固定セルになる。

同じような式が、CカラムとDカラムに3個ずつ書かれます。

 

式を表示するとこうなります。

上の表で例2は固定セルに、複合参照を使った例。例3はBカラムにも複合参照を使った例。この場合は6個の式が同形式で

オートフィルでコピー出来るのが利点ぐらいですかね。少し分かりづらくなるんですが。セルの相対、絶対、複合しては

F4を押すと、次々に変わる。

 どれでも良いように思いますが、どうなんでしょうかね。

コメント (2)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Excelで遊んでました。姓と名の表示。

2016-04-11 21:16:26 | Excel

 個人の名前ですが、名字と名前で長さが幾らか違いますね。長い人も短い人も居ます。

それをどうしたら、見た目が良く表示できるかですね。

 姓と名を分けて、別々のセルに表示するのが一番良いように思います。でも普通は

入力するときは、一緒ですから分けないと行けません。後は適当にスペースをいれてる

こともあるので、要らないスペースは削除した方が良いでしょう。

    クリックで拡大します。

1枚目は加工していった順番。右の2列で姓と名が分断できました。

2枚目から4枚目まではそれぞれ組み込んだ関数です。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Excelで遊んでました。日付の表示。

2016-04-03 06:58:27 | Excel

Option Explicit

Sub 日付フォーマット()

Dim StartLine As Integer
Dim StartCol As Integer
Dim Str As String
Dim w As String
Dim i As Integer
Dim Strarry() As String


StartLine = 3
StartCol = 2
i = 0

Do While True
    Str = Worksheets("Sheet1").Cells(StartLine + i, StartCol)
    If Len(Str) = 0 Then
        Exit Do
    End If
   
    Strarry() = Split(Str, "/")
    
    If Len(Strarry(1)) >= 3 Then
        w = Right(Strarry(1), 2)
        Strarry(1) = " " & w
    End If
    
    If Not Len(Strarry(2)) >= 3 Then
        Strarry(2) = " " & Strarry(2)
    End If
    
    Cells(StartLine + i, StartCol + 1) = Strarry(0) & "/" & Strarry(1) & "/" & Strarry(2)
    i = i + 1
    
Loop
    
End Sub

===========================================

月の日付が少しおかしかったので、Right関数で文字列を処理しました。今度は

多分良いと思います。(-_-;)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Excelで遊んでました。日付の表示。

2016-03-31 08:06:03 | Excel

Option Explicit

Sub 日付フォーマット()

Dim StartLine As Integer
Dim StartCol As Integer
Dim Str As String
Dim i As Integer
Dim Strarry() As String


StartLine = 3
StartCol = 2
i = 0

Do While True
    Str = Worksheets("Sheet1").Cells(StartLine + i, StartCol)
    If Len(Str) = 0 Then
        Exit Do
    End If
   
    Strarry() = Split(Str, "/")
    
    If Not Len(Strarry(1)) >= 3 Then
        Strarry(1) = " " & Strarry(1)
    End If
    
    If Not Len(Strarry(2)) >= 3 Then
        Strarry(2) = " " & Strarry(2)
    End If
    
    Cells(StartLine + i, StartCol + 1) = Strarry(0) & "/" & Strarry(1) & "/" & Strarry(2)
    i = i + 1
    
Loop
    
End Sub
=============================================

基本は前と同じですが、ループを無限ループに変更して、Strへの代入してから終了の判断を

するように変更しただけです。

前は=SUBSTITUTE(TEXTを組み込んだカラムは要らないように感じてましたが、年の判断が

必要になるので、そのまま使った方が楽です。2015はH27の変換のことですね。

 後微妙に桁がずれるのは、やはりフォントの種類によりますので、MS明朝でP無しのフォントに

変えれば、ぴったし合うようです。

 たしかC言語とかだと

if (a = b) > 0 then

と書いて、bをaに代入した結果が0より大きいときはと、書けるように思ってました。VBAではエラー

にはならないんですが、代入が行われませんでした。(-_-;)

thenと言う句はCやC++には無くて、{}で括ったブロックが来ます。elseはでも有ります。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Excelの日付の表示で悩んでました。

2016-03-29 06:57:50 | Excel

 この場合は年については、今ですのでH28とかH27で、割と固定の桁で表示されます。

しかし、月と日は二桁と一桁で表示されますので、ばらついた感じで見た目がスッキリし

ません。ネットで色々探してみたんですが、どうも自分が思うような物が無い。(>_<)

 しょうが無い。VBAでやるしか無いか?

    写真はクリックで拡大します。

左の写真で、一番左が元のデータ、中が調べてやった結果、右が我流VBAで加工したデータ。

中の写真が、最初に調べて加工するときに使った関数。一番上に写ってます。

右の写真が、今回間に合わせでつくったVBAです。取り敢えず動けば良いかで作ってます。

もっとスマートにやる方法もある気はします。関数での加工は要りませんしね。でも一般的に

使えるようにするには結構難しい気もします。(-_-;)

 スペースの数で調整してるつもりですが、よく見ると僅かに合ってません。多分ですが、フォント

に依るものかもしれません。フォントを1文字なら同じスペースを占めるフォントに変えないと駄目

かもしれません。

 暇が有ったら、続けてやって見ようかなあ、と考えてます。

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Excelで遊んでました。ワークシートの縦横の変換。

2016-03-15 22:49:18 | Excel

 何故ワークシートの縦と横の交換が必要かというと、1つには並べ替えをするときに原則として

表は下方向に長くなると言うことがあるのでしょう。右方向に長くなる表の場合は、そのままでは

並べ替えが出来ないようです。

 本当なら、並べ替えをするときに、先ずデータのエリアを指定します。2003のエクセルだと

データ、並べ替え、と選んでいくのですが、列のデータしか選択できないんですね。ここで行の

データを指定できれば、それだけで済み気もしますが、仕方が無いので、縦と横を変換します。

 その後に、例えば列のデータ、日付とかをしています。その後もう一度、表の縦と横を変換

すれば、元の表みたいにはなりますが、要らない部分が出来ますので、そこを削除しませんと

煩雑になりますね。

 VBAでスマートに作れば、一発変換できるんでしょうが、データのフォーマットが違えば、

使えなくなるかも知れませんし、そう頻繁に使うことも無いかも知れません。その都度で

我慢しましょう。(-_-;)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Excel、CSVファイルの読み書き

2015-12-12 22:17:09 | Excel

Option Explicit
'Option Base 1

Sub データクリア()
    Dim mylastrow As Long
    Dim mylastcol As Long
    Dim area As Range
    
    Worksheets("生産者").Activate
    mylastrow = Range("a1").CurrentRegion.Rows.Count
    mylastcol = Range("a1").CurrentRegion.Columns.Count

    MsgBox "データエリアをクリアします。"
    
    Range(Cells(1, 1), Cells(mylastrow, mylastcol)).ClearContents
    
    MsgBox "クリアが終了しました"

End Sub
Sub CSV出力(ByVal sht As Worksheet, Optional ByVal rngStart As Range = Nothing)
    Dim varFile As Variant
    
    varFile = Application.GetSaveAsFilename(InitialFileName:=sht.Name & ".csv", _
                                            FileFilter:="CSVファイル(*.csv),*.csv", _
                                            FilterIndex:=1, _
                                            Title:="保存ファイルの指定")
    If varFile = False Then
        Exit Sub
    End If
    
    sht.Select
    sht.Copy
 

    '不要な先頭の行列を削除します。
    If Not rngStart Is Nothing Then
        If rngStart.Row > 1 Then
            Range(Rows(1), Rows(rngStart.Row - 1)).Delete
        End If
        If rngStart.Column > 1 Then
            Range(Columns(1), Columns(rngStart.Column - 1)).Delete
        End If
    End If
 
    ActiveWorkbook.SaveAs Filename:=varFile, FileFormat:=xlCSV, CreateBackup:=False
    ActiveWindow.Close
 
    MsgBox ("CSV出力しました。" & vbLf & vbLf & varFile)
End Sub

Sub ワークシートCSV出力()
    Dim st As Worksheet
    Set st = Worksheets("生産者")
    Call CSV出力(st)

End Sub
Sub CSV入力1()
    Dim varFileName As Variant
    Dim intFree As Integer
    Dim strRec As String
    Dim strSplit() As String
    Dim i As Long, j As Long

    varFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", _
                                                Title:="CSVファイルの選択")
    If varFileName = False Then
        Exit Sub
    End If

    intFree = FreeFile '空番号を取得
    Open varFileName For Input As #intFree 'CSVファィルをオープン
 
    i = 0
    Do Until EOF(intFree)
        Line Input #intFree, strRec '1行読み込み
        i = i + 1
        strSplit = Split(strRec, ",") 'カンマ区切りで配列へ
        For j = 0 To UBound(strSplit)
            Cells(i, j + 1) = strSplit(j)
        Next
        '配列をそのまま入れる方法も、ただし全て文字列として入力される
'    Range(Cells(i, 1), Cells(i, UBound(strSplit) + 1)) = strSplit
    Loop
 
    Close #intFree
End Sub
殆どの部分がネタサイトからのコピーです。これは結構優れてますよ。多分ですが

自由自在にExcelで表を作り、ファイルに保存できます。勿論読んでワークシートに

再現も出来ます。1行の長さが違っていても問題ないようです。

ネタサイトは

http://excel-ubara.com/excel_index.html

です。色々なことがかかれてるようなので、勉強になりそうですよ。

 クリックで拡大します。

ワークシートへコントロールを置いて、それに関数を貼り付けて実行できるようにしてます。

単なる勉強ですがね。(^0^)

Sub ワークシートCSV出力()
    Dim st As Worksheet
    Set st = Worksheets("生産者")
    Call CSV出力(st)

End Sub

上の部分が自作の僅かな部分ですが、クリアする部分もそうです。普通のていうか

プリミティブと言うんでしたかね。例えば

Dim i as  Integer

i=10

と書けますが、この場合はsetを使うのが、分からなくてエラーになる原因が分かりません

でした。(^0^)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

for eachを使った出力。

2015-12-06 14:57:08 | Excel

Sub 配列()
    
    Dim arry(5, 2) As Variant
    Dim val As Variant
    Dim gyou As Long
    Dim keta As Long

    Dim i As Integer
    Dim j As Integer
    
    arry(1, 1) = 100
    arry(1, 2) = "あいうえお"
    arry(2, 1) = 200
    arry(2, 2) = "かきくけこ"
    arry(3, 1) = 300
    arry(3, 2) = "さしすせそ"
    arry(4, 1) = 400
    arry(4, 2) = "たちつてと"
    arry(5, 1) = 500
    arry(5, 2) = "なにぬねの"
    
    For Each val In arry
        Debug.Print val
    Next
    
    gyou = UBound(arry, 1)
    keta = UBound(arry, 2)
    
    For i = 1 To gyou
        For j = 1 To keta
            Debug.Print arry(i, j)
        Next
    Next
    
End Sub
2次元の配列をeachを使って、出力しました。その結果は配列で言えば縦方向が

優先して出力する。終わったら次のカラムへ。普通に配列を考える場合は

横方向へ考えることが多いと思うので、2重のforで書いた方のイメージに近いと

思います。

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Excelで遊んでました。ワークシートの書き出し。

2015-12-04 22:17:47 | Excel

Sub テキストファイルへ書込()
    Dim myfileno As Integer
    Dim i As Long
    Dim mylastrow As Long
    
    Worksheets("生産者").Activate   'activeでなくてactivateです
    mylastrow = Range("a1").CurrentRegion.Rows.Count ’カラム数もこんな感じで
    myfileno = FreeFile
    Open "d:\data\testdata.txt" For Append As #myfileno
    
    For i = 1 To mylastrow
        Write #myfileno, Cells(i, 1), Cells(i, 2), Cells(i, 3), Cells(i, 4)
    Next
    Close #myfileno
    
End Sub
詳しくは見てませんが、ネタ本はできる大辞典です。モードがAppendなので追加で

書き出されるでしょう。ファイルが存在しないとエラーになるかも知れません。

又この場合は4項目の書き出しですが、何項目でも良いようにしておけば更に良いでしょう。

ExcelのVBAにはVBの様なレコードタイプを宣言することができるんだろうか?と、調べて

見たんですが、無いようです。必要ないのかも知れません。

ここから暇に任せて、道楽を始めます。(^o^)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Excel、dictionaryを使った連想記憶。その3。

2015-12-03 17:09:09 | Excel

Option Explicit

Private Sub CommandButton1_Click()

    TextBox1.Text = ""
    
End Sub

Private Sub UserForm_Click()

End Sub

Private Sub UserForm_Initialize()

    Me.StartUpPosition = 0
    Me.Left = 200
    Me.Top = 200
    Me.Height = 250
    Me.Width = 300

End Sub
以上はuserform1のコードで書き込みます。

Option Base 1
Option Explicit

Sub ディクショナリ試験()
    Dim arry As Variant
    Dim gyou As Long
    Dim i As Long
    Dim mydic As Object
    Dim namae As Variant
    
    UserForm1.Show vbModeless
    Set mydic = CreateObject("Scripting.Dictionary")
    
    With Worksheets("Sheet1")
        arry = .Range(Cells(1, 1), Cells(Rows.Count, 2).End(xlUp))
    End With
    
    gyou = UBound(arry, 1)
    
   
    For i = 1 To gyou
        If Not mydic.exists(arry(i, 1)) Then    '配列から辞書を作ります。
            mydic.Add arry(i, 1), arry(i, 2)
        Else
            mydic(arry(i, 1)) = mydic(arry(i, 1)) + arry(i, 2)  'なんでこれなんだ?
        End If                                   'B列が数字とした場合
    Next
    
    Do
        namae = InputBox("品名")
        If namae = "終わり" Then
            Exit Do
        End If
    
    UserForm1.TextBox1.Text = UserForm1.TextBox1.Text & namae & "  "                          '品名を入力して
    UserForm1.TextBox1.Text = UserForm1.TextBox1.Text & mydic.Item(namae) & vbCrLf           '品名に応じた数字が表示できる
    
    Loop                                        'Gotoはない方がスッキリします
    
    Set mydic = Nothing
   
    
End Sub
以上はModule1に書き込みます。ユーザーフォームへ出力を表示するようにします。

一番理解出来づらいのが同じ品名の数を合計するところですかユーザーフォームは

vbModelessで表示です。また表示する位置はuserform_initializeへ書きます。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

忘年会ね?

2015-12-03 08:42:07 | Excel

 ある意味では必要でしょうかね。ある意味というのは、例えば後発イベントのバレンタインデーとか

最近ではハローウィンとかですが、それと同じ様にも思います。世間の消費を活発化する意味では

必要かも知れませんが、余り親しくない人と一緒に飲み会をしても親交も深まらないように思います。

 捉え方によっては単なる飲み会に終わりそうに思います。なのであとは個人の考えで、何かしらの

目標があれば、例えばあの人の考えを知りたいとか、親しくなりたいとか、があればそれなりに意味を

持ってくるように思うので、必要と言わなくても、意味はあるとは思います。

 まあ、でも年末は結構忘年会とか、暴飲暴食が続くと思うので、身体だけは注意ですね。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Excel、dictionaryを使った連想記憶。その2。

2015-12-02 18:12:53 | Excel

Option Base 1
Option Explicit

Sub ディクショナリ試験()
    Dim arry As Variant
    Dim gyou As Long
    Dim i As Long
    Dim mydic As Object
    Dim namae As Variant
    
    
    Set mydic = CreateObject("Scripting.Dictionary")
    
    With Worksheets("Sheet1")
        arry = .Range(Cells(1, 1), Cells(5, 2))
    End With
    
    gyou = UBound(arry, 1)
    'keta = UBound(arry, 2)
     
   
    For i = 1 To gyou
        If Not mydic.exists(arry(i, 1)) Then    '配列から辞書を作ります。
            mydic.Add arry(i, 1), arry(i, 2)     'こちらの方が分かりやすい?
        End If
    Next
    
    Do
        namae = InputBox("品名")
        If namae = "終わり" Then
            Exit Do
        End If
    
    Debug.Print namae                           '品名を入力して
    Debug.Print mydic.Item(namae)         '品名に応じた数字が表示できる
    
    Loop                                            'Gotoはない方がスッキリします
    
    Set mydic = Nothing
    
End Sub
配列から辞書を作成した方がスッキリするし、gotoは出来るだけ使わないようが良いという

事ですので、そうしましょう。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする